导航: 起始页 > Dive Into Python > 有效编程(Functional Programming) > 找到路径 | << >> | ||||
Python 研究(Dive Into Python)Python 从新手到高手 [DIP_5_4_CPUG_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 所在目录的单元测试。
<< 有效编程(Functional Programming) |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
过滤已访问列表 >> |