将脚本的目录前置为字符串

时间:2011-07-04 01:45:05

标签: python file module path

在编写一次性脚本时,通常需要从与脚本相同的目录中加载配置文件,图像或某些此类内容。无论脚本执行的目录如何,这应该继续正常工作,因此我们可能不想简单地依赖当前的工作目录。

如果在您使用它的同一文件中定义了类似的东西:

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

3 个答案:

答案 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)

您需要pkg_resources

import pkg_resources
foo_fname = pkg_resources.resource_filename(__name__, "foo.txt")