我正在构建一个简单的助手脚本,用于将代码库中的几个模板文件复制到当前目录.但是,我没有存储模板的目录的绝对路径.我确实有脚本的相对路径,但是当我调用脚本时,它会将其视为相对于当前工作目录的路径.有没有办法指定此相对url来自脚本的位置?
我正在构建一个简单的助手脚本,用于将代码库中的几个模板文件复制到当前目录.但是,我没有存储模板的目录的绝对路径.我确实有脚本的相对路径,但是当我调用脚本时,它会将其视为相对于当前工作目录的路径.有没有办法指定此相对url来自脚本的位置?
在包含脚本的文件中,您希望执行以下操作:
import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'relative/path/to/file/you/want')
这将为您提供要查找的文件的绝对路径.请注意,如果您使用的是setuptools,您可能应该使用它的package resources API.
UPDATE:我在这里回复一条 comments ,以便粘贴一个代码示例.:-)
我认为
__file__
并不总是可用的(例如,当您直接运行文件而不是导入它时),这样的 idea 正确吗?
当你提到直接运行文件时,我假设你指的是__main__
脚本.如果是这样,在我的系统(OS X 10.5.7上的python 2.5.1)上似乎不是这样:
#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
然而,我确实知道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计算机上引发异常.