Python:来自其他文件工作目录的execfile?

时间:2009-11-28 18:22:47

标签: python working-directory execfile

我有一些代码可以加载默认配置文件,然后允许用户提供自己的Python文件作为额外的补充配置或覆盖默认值:

# foo.py

def load(cfg_path=None):
    # load default configuration
    exec(default_config)

    # load user-specific configuration
    if cfg_path:
        execfile(cfg_path)

但是有一个问题:execfile()cfg_path指定的文件中执行指令,就好像它位于foo.py的工作目录中,而不是它自己的工作目录。因此,如果import文件确实cfg_path from m import x,其中m是与cfg_path在同一目录中的模块,则execfile()指令可能会失败。

我如何从其参数的工作目录中execfile,或以其他方式获得相同的结果?另外,我被告知在Python 3中不推荐使用exec而我应该使用{{1}},所以如果有更好的方法我应该这样做,我全都听见了。< / p>

注意:我认为仅仅改变工作目录的解决方案是正确的。就我所知,这不会将这些模块放在解释器的模块查找路径上。

1 个答案:

答案 0 :(得分:7)

os.chdir允许您根据需要更改工作目录(可以使用cfg_path提取os.path.dirname的工作目录);如果你想在执行cfg_path时恢复它,请务必先使用os.getcwd获取当前目录。

Python 3确实删除了execfile(支持您读取文件的序列,compile内容,然后exec它们,但您不必担心,如果您目前正在使用Python 2.6进行编码,那么源代码翻译的2to3来源可以顺畅无缝地处理所有这些内容。

编辑:OP在评论中说,execfile启动了一个单独的进程,并且不尊重当前的工作目录。这是错误的,这是一个示例,表明它是:

import os

def makeascript(where):
  f = open(where, 'w')
  f.write('import os\nprint "Dir in file:", os.getcwd()\n')
  f.close()

def main():
  where = '/tmp/bah.py'
  makeascript(where)
  execfile(where)
  os.chdir('/tmp')
  execfile(where)

if __name__ == '__main__':
  main()

在我的机器上运行它会产生输出,例如:

Dir in file: /Users/aleax/stko
Dir in file: /private/tmp

清楚地表明execfile 确实继续使用execfile执行时设置的工作目录。 (如果执行的文件更改了工作目录,那将在execfile返回后反映出来 - 完全是因为所有 都在同一进程中发生!)。

因此,OP仍在观察的问题是绑定到当前工作目录(很难诊断它们实际可能是什么,没有看到代码和观察到的问题的确切细节; - 。)