在编写一次性脚本时,通常需要从与脚本相同的目录中加载配置文件,图像或某些此类内容。无论脚本执行的目录如何,这应该继续正常工作,因此我们可能不想简单地依赖当前的工作目录。
如果在您使用它的同一文件中定义了类似的东西:
from os.path import abspath, dirname, join
def prepend_script_directory(s):
here = dirname(abspath(__file__))
return join(here, s)
不希望将相同的功能复制粘贴或重写到每个模块中,但是存在一个问题:如果将其移动到单独的库中并作为函数导入,__file__
现在引用其他模块结果不正确。
我们也许可以使用它,但似乎sys.argv
可能也不可靠。
def prepend_script_directory(s):
here = dirname(abspath(sys.argv[0]))
return join(here, s)
如何正确而正确地编写prepend_script_directory
?
答案 0 :(得分:4)
每当我执行它时,我个人只会os.chdir
进入脚本的目录。它只是:
import os
os.chdir(os.path.split(__file__)[0])
但是如果你确实想要将这个东西重构成一个库,那么你本质上想要一个知道其调用者状态的函数。你必须这样做
prepend_script_directory(__file__, blah)
如果你只想写
prepend_script_directory(blah)
你必须使用堆栈帧进行特定于cpython的技巧:
import inspect
def getCallerModule():
# gets globals of module called from, and prints out __file__ global
print(inspect.currentframe().f_back.f_globals['__file__'])
答案 1 :(得分:0)
我认为它闻起来不正确的原因是$PYTHONPATH
(或sys.path
)是正确使用的一般机制。
答案 2 :(得分:0)
import pkg_resources
foo_fname = pkg_resources.resource_filename(__name__, "foo.txt")