我正在构建一个简单的工作助手脚本,该脚本会将代码库中的几个模板文件复制到当前目录。但是,我没有存储模板的目录的绝对路径。我确实有一个来自脚本的相对路径,但是当我调用该脚本时,会将其视为相对于当前工作目录的路径。有没有一种方法可以指定此相对URL来自脚本的位置?
在具有脚本的文件中,你想要执行以下操作:
import os dirname = os.path.dirname(__file__) filename = os.path.join(dirname, 'relative/path/to/file/you/want')
这将为你提供要查找的文件的绝对路径。请注意,如果你使用的是setuptools,则应该改用其包资源API。
setuptools
更新:我在这里回应评论,所以我可以粘贴代码示例。:-)
我是否认为__file__并非总是可用(例如,当你直接运行文件而不是导入文件时)?
__file__
__main__当你提到直接运行文件时,我假设你的意思是脚本。如果是这样,在我的系统上似乎不是这种情况(在OS X 10.5.7上为python 2.5.1):
__main__
#foo.py import os print os.getcwd() print __file__ #in the interactive interpreter >>> import foo /Users/jason foo.py #and finally, at the shell: ~ % python foo.py /Users/jason foo.py
但是,我确实知道__file__在C扩展上有一些古怪之处。例如,我可以在Mac上执行此操作:
>>> import collections #note that collections is a C extension in Python 2.5 >>> collections.__file__ '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib- dynload/collections.so'
但是,这在Windows计算机上引发了异常。