【问题标题】:Python: execfile from other file's working directory?Python:来自其他文件工作目录的 execfile?
【发布时间】:2010-12-21 06:15:46
【问题描述】:

我有一些代码可以加载默认配置文件,然后允许用户提供自己的 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,所以如果有更好的方法我应该这样做,我会全力以赴。

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

【问题讨论】:

    标签: python working-directory execfile


    【解决方案1】:

    os.chdir让你可以随意改变工作目录(你可以用os.path.dirname解压cfg_path的工作目录);如果要在执行完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 仍在观察什么问题, 都与当前工作目录无关(如果不查看代码和观察到的问题的确切细节,很难诊断它们实际上可能是什么;-)。

    【讨论】:

    • 感谢您的回答。不幸的是,这似乎对我不起作用。 execfile() 似乎正在启动一个具有自己工作目录的全新进程,这与我正在启动的目录不同。
    • 不,@Kyle,execfile 不会启动单独的进程,它确实尊重当前工作目录。编辑我的答案以显示一个简单的例子来证明你错了。
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多