16.2. 找到路径

从命令行运行 Python 代码时,时时彩计划软件公式:知道所运行代码在磁盘上的存储位置有时候是有必要的。

这是一个不那么容易想起,但一想起就很容易解决的小麻烦。答案是 sys.argv。正如你在 第 9 章 XML 处理 中看到的,它包含了很多命令行参数。它也同样记录了运行脚本的名字,和你调用它时使用的命令一摸一样。这些信息足以令我们确定文件的位置。

例 16.3. fullpath.py

如果您还没有下载本书附带的样例程序, 可以 下载本程序和其他样例程序


import sys, os

print 'sys.argv[0] =', sys.argv[0]             
pathname = os.path.dirname(sys.argv[0])        
print 'path =', pathname
print 'full path =', os.path.abspath(pathname) 
无论如何运行一段脚本,sys.argv[0] 总是包含脚本的名字,和调用时使用的命令一摸一样。你很快会发现,它不一定包含任何路径信息。
os.path.dirname 接受作为字符串传来的文件名并返回路径部分。如果给定的文件名不包含任何路径信息,os.path.dirname 返回空字符串。
os.path.abspath 是这里的关键。它接受的路径名可以是部分的甚至是完全空白,但总能返回完整有效的路径名。

进一步地解释 os.path.abspath 是有必要的。它非常灵活,可以接受任何类型的路径名。

例 16.4. os.path.abspath 的进一步解释

>>> import os
>>> os.getcwd()                        
/home/you
>>> os.path.abspath('')                
/home/you
>>> os.path.abspath('.ssh')            
/home/you/.ssh
>>> os.path.abspath('/home/you/.ssh') 
/home/you/.ssh
>>> os.path.abspath('.ssh/../foo/')    
/home/you/foo
os.getcwd() 返回当前的工作路径。
用空字符串调用 os.path.abspath 将返回当前的工作路径,与 os.getcwd()的效果相同。
以不完整的路径名调用 os.path.abspath 可以构建一个基于当前工作路径且完整有效的路径名。
以完整的路径名调用 os.path.abspath 则简单地将其直接返回。
os.path.abspath格式化 返回的路径名。注意这个例子在我根本没有‘foo’目录时同样奏效。os.path.abspath 从不检查你的磁盘,而仅仅是字符串操作。
传递给 os.path.abspath 的路径名和文件名可以不存在。
os.path.abspath 不仅构建完整路径名,还能格式化路径名。这意味着如果你正工作于 /usr/ 目录,os.path.abspath('bin/../local/bin') 将会返回 /usr/local/bin。它把路径名格式化为尽可能简单的形式。如果你只是希望简单地返回这样的格式化路径名而不需要完整路径名,可以使用 os.path.normpath

例 16.5. fullpath.py 的样例输出

[you@localhost py]$ python /home/you/diveintopython/common/py/fullpath.py 
sys.argv[0] = /home/you/diveintopython/common/py/fullpath.py
path = /home/you/diveintopython/common/py
full path = /home/you/diveintopython/common/py
[you@localhost diveintopython]$ python common/py/fullpath.py               
sys.argv[0] = common/py/fullpath.py
path = common/py
full path = /home/you/diveintopython/common/py
[you@localhost diveintopython]$ cd common/py
[you@localhost py]$ python fullpath.py                                     
sys.argv[0] = fullpath.py
path = 
full path = /home/you/diveintopython/common/py
在第一种情况下,sys.argv[0] 包含代码的完整路径。你可以通过 os.path.dirname 函数将文件名从其中剥离出来并返回完整的路径,os.path.abspath 则是简单地把你传递给它的值返回。
如果脚本是以不完整路名被运行的,sys.argv[0] 还是会包含命令行中出现的一切。os.path.dirname 将会给你一个 (相对于当前工作路径的) 不完整的路径名,os.path.abspath 将会以不完整路径名为基础构建一个完整的路径名。
如果没有给定任何路径,而是从当前目录运行脚本,os.path.dirname 将简单地返回一个空字符串。由于是从当前目录运行脚本,os.path.abspath 将针对给定的空字符串给出你所希望获知的当前目录。
就像 osos.path 模块的其他函数,os.path.abspath 是跨平台的。如果你是在 Windows (使用反斜杠作为路径符号) 或 Mac OS (使用冒号) 上运行,它们同样工作,只是将获得与我稍有不同的结果。os 的所有函数都是这样的。

补充. 一位读者对这个结果并不满意,他希望能够从当前路径运行所有单元测试,而不是从 regression.py 所在目录运行。他建议以下面的代码加以取代:

例 16.6. 在当前目录运行脚本

import sys, os, re, unittest

def regressionTest():
    path = os.getcwd()       
    sys.path.append(path)    
    files = os.listdir(path) 
不是将 path 设置为运行代码所在的路径,而是将它设置为当前目录。可以是你在运行脚本之前所在的任何路径,而不需要是运行脚本所在的路径。(多次体味这句话,直到你真正理解了它。)
将这个目录添加到 Python 库搜索路径中,你稍后动态导入单元测试模块时,Python 就能找到它们了。如果 path 就是正在运行代码的存储目录,你就不需要这样做了,因为 Python 总会查找这个目录。
函数的其他部分不变。

这个技术允许你在多个项目中重用 regression.py 代码。只需要将这个代码放在一个普通目录中,在运行项目前将路径更改为项目的目录。项目中所有的单元测试被找到并运行,而不仅仅局限于 regression.py 所在目录的单元测试。

时时彩软件后二 时时彩平台上银狐网 时时彩四星ac值走势图 北京时时彩软件手机软件 时时彩人工计划软件lm0
时时彩彩走势图 老钱庄app 时时彩登陆网址 重庆时时彩网络故障 重庆时时彩软件推荐
时时彩杀号上竤彩玩 江西时时彩20150101 bt下载软件 时时彩开奖现场直播 重庆时时彩网上怎么买
江西时时彩开奖投注网 天天时时彩计划手机板 时时彩专家在线杀号 时时彩刷流水方法 手机好用的时时彩软件
急速赛车官网 河北快三10期开奖结果?1河北11选5开奖结果?河北快3和值推荐 排列五开奖 广西快3遗漏间隔统计 辽宁35选7
四川快乐12任五走势图手机 天津时时彩视频程序 彩票十一选五﹤计划﹥ 重庆幸运农场走势图渝 河北十一选五字体放大
诈金花游戏大小34m 湖南体彩幸运赛车 青海11选5遗漏 江西时时彩五星组合 菲娱国际娱乐平台
福建11选5中奖结果 湖南幸运赛车开奖结果走势图 如何做巧克力 秒速赛车网页计划 青海快3出号规律