【发布时间】:2018-02-27 15:52:00
【问题描述】:
一本教科书建议我应该能够做到这一点:
d = {}
exec("C://Users//Dave//Desktop//Bot//bot_config_data.py", globals(), d)
File "<string>", line 1 C://Users//Dave//Desktop//Bot//bot_config_data.py
^
SyntaxError: invalid syntax
我可以这样做:
d = {}
exec('from bot_config_data import price_data', globals(), d)
但是,我想做前者。
我正在尝试编写一种方法来覆盖来自各种文件的配置数据。
我完全不在这儿吗?
更新 这本书非常具有误导性。它发布了部分代码,完整代码块的结果,然后给出了其余部分。当我参考时,我没有从头到尾地工作,而是绊倒了自己。
这是我现在拥有的代码:
data = {}
file = 'C:\\Users\\Dave\\Desktop\\Bot\\bot_config_data.py'
with open(file) as f:
code = compile(f.read(), file, "exec")
exec(code, globals(), data)
price_data = data["price_data"]
更新2 使用下面疯狂物理学家的回答,我的代码是:
from importlib.util import spec_from_loader, module_from_spec
from importlib.machinery import SourceFileLoader
filepath = 'C:\\Users\\Dave\\Desktop\\Bot\\bot_config_data.py'
module_data = os.path.basename(filepath)
spec = spec_from_loader(module_data, SourceFileLoader(module_data, filepath))
bot_config_data = module_from_spec(spec)
spec.loader.exec_module(bot_config_data)
price_data = bot_config_data.price_data
【问题讨论】:
-
“但是,我想做前者。” 为什么?导入语句有什么问题?
-
@Aran-Fey。这不是一个好方法,尽管使用
exec是这里的真正问题。 -
@Dave。我怀疑你的教科书不是很好。是哪一个?
-
Steven F.Lott 的“掌握面向对象编程”。我怀疑这个错误可能是我的一部分。我会仔细检查。
-
我认为你需要去掉扩展,你可能不需要比 load_module 更复杂的东西了。
标签: python