gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:44:46 29 4
gpt4 key购买 nike

我有一些代码可以加载默认配置文件,然后允许用户提供他们自己的 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 文件执行 from m import ximport 指令可能会失败,其中 m 是一个模块在与 cfg_path 相同的目录中。

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

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

最佳答案

os.chdir让您根据需要更改工作目录(您可以使用 os.path.dirname 提取 cfg_path 的工作目录);确保首先使用 os.getcwd 获取当前目录如果您想在执行完 cfg_path 后恢复它。

Python 3 确实删除了 execfile(支持读取文件、编译 内容,然后 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 返回后反射(reflect)出来——正是因为一切都发生在同一个进程中!)。

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

关于Python:来自其他文件工作目录的execfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1813282/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com