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

Kyl*_*tan 7 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)
Run Code Online (Sandbox Code Playgroud)

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

我如何execfile()从其参数的工作目录中,或以其他方式获得相同的结果?另外,我被告知execfile在Python 3中已弃用并且我应该使用它exec,所以如果有更好的方法我应该这样做,我全都听见了.

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

Ale*_*lli 7

os.chdir允许您更改工作目录,如你所愿(您可以提取的工作目录cfg_pathos.path.dirname); 如果你想在执行exec时完成恢复,请务必首先使用os.getcwd获取当前目录cfg_path.

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()
Run Code Online (Sandbox Code Playgroud)

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

Dir in file: /Users/aleax/stko
Dir in file: /private/tmp
Run Code Online (Sandbox Code Playgroud)

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

因此,OP仍然观察到的任何问题都与当前工作目录无关(很难诊断它们实际可能是什么,没有看到代码和观察到的问题的确切细节;-).