导航:起始页 > Dive Into Python > 函数编程 > 找到路径 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 从新手到专家 [Dip_5.4b_CPyUG_Release] |
从命令行运行 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.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
就像 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 | |
重识列表过滤 >> |