您在这里:首页 > 深入 Python > 函数式编程 > 查找路径 | << >> | ||||
深入 Python从 Python 新手到专家 |
从命令行运行 Python 脚本时,了解当前运行的脚本在磁盘上的位置有时很有用。
这是一个非常隐蔽的小技巧,几乎不可能自己想出来,但是一旦你看到了就很容易记住。关键在于 sys.argv。正如你在第 9 章,*XML 处理*中看到的,这是一个包含命令行参数列表的列表。但是,它也包含运行脚本的名称,与从命令行调用时完全相同,这些信息足以确定其位置。
如果您还没有这样做,您可以下载本书中使用的这个示例和其他示例。
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)
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.path.abspath 的路径名和文件名不需要存在。 |
![]() |
|
os.path.abspath 不仅构造完整的路径名,还会对其进行规范化。这意味着,如果您位于 /usr/ 目录中,则 os.path.abspath('bin/../local/bin') 将返回 /usr/local/bin。它通过使路径尽可能简单来规范化路径。如果您只想规范化这样的路径名而不将其转换为完整路径名,请改用 os.path.normpath。 |
[you@localhost py]$ python /home/you/diveintopython/common/py/fullpath.pysys.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
![]() |
|
与 os 和 os.path 模块中的其他函数一样,os.path.abspath 是跨平台的。如果您在 Windows(使用反斜杠作为路径分隔符)或 Mac OS(使用冒号)上运行,则结果看起来会与我的示例略有不同,但它们仍然可以工作。这就是 os 模块的全部意义所在。 |
**附录。**一位读者对这个解决方案不满意,他希望能够运行当前目录中的所有单元测试,而不是 regression.py 所在的目录。他建议改用这种方法
import sys, os, re, unittest def regressionTest(): path = os.getcwd()sys.path.append(path)
files = os.listdir(path)
![]()
这种技术将允许您在多个项目上重复使用此 regression.py 脚本。只需将脚本放在一个公共目录中,然后在运行它之前切换到项目的目录。将找到并测试该项目的所有单元测试,而不是 regression.py 所在的公共目录中的单元测试。
<< 函数式编程 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
重新审视列表过滤 >> |