7

我有一些代码可以加载默认配置文件,然后允许用户提供自己的 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_pathfrom m import xmcfg_path

我如何execfile()从其参数的工作目录中,或以其他方式获得等效的结果?另外,有人告诉我,execfile它在 Python 3 中已弃用,我应该使用exec,所以如果有更好的方法我应该这样做,我会全力以赴。

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

4

1 回答 1

7

os.chdir允许您根据需要更改工作目录(您可以提取cfg_pathwith的工作目录os.path.dirname);如果要在完成 exec'ing 后恢复它,请务必先使用os.getcwdcfg_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()

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

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

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

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

于 2009-11-28T18:40:42.083 回答