Python:来自其他文件工作目录的execfile?
-
06-07-2019 - |
题
我有一些代码可以加载默认配置文件,然后允许用户提供自己的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的工作目录中一样
,而不是它自己的工作目录。因此,如果 cfg_path
文件,例如,来自m import x 的,那么
import
指令可能会失败,其中 m
是模块与 cfg_path
。
如何从其参数的工作目录中 execfile()
,或以其他方式获得等效结果?另外,我被告知在Python 3中不推荐使用 execfile
,我应该使用 exec
,所以如果有更好的方法我应该这样做,我全是耳朵。
注意:我认为仅仅改变工作目录的解决方案是正确的。就我所知,这不会将这些模块放在解释器的模块查找路径上。
解决方案
os.chdir 可让您更改工作状态您希望的目录(您可以使用 os.path.dirname
提取 cfg_path
的工作目录);请务必首先使用 os.getcwd 如果你想在执行exec'ing 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()
在我的机器上运行它会产生输出,例如:
Dir in file: /Users/aleax/stko
Dir in file: /private/tmp
清楚地显示 execfile
继续使用 execfile
执行时设置的工作目录。 (如果执行的文件改变了工作目录,那将在 execfile
返回后反映出来 - 完全是因为 在同一个进程中发生的一切!)。
因此,OP仍在观察的问题是不绑定到当前工作目录(很难诊断它们实际可能是什么,没有看到代码和观察到的问题的确切细节; - 。)