【发布时间】:2021-02-09 14:20:56
【问题描述】:
我正在从一些文件中导入变量。到目前为止,我已经使用了命令:
from vars1 import *
其中 vars1.py 是文件名。然后对于每个vars.py 文件,我必须手动更改文件名并重新运行代码。
我希望能够循环到文件夹中的所有文件,以便我可以一个一个地导入它们并一次处理每个文件的变量,方法是:
import glob
var_files = glob.glob('./vars*')
for var_file in var_files:
from var_file import *
# .....rest of the code working with the imported variables....
但如果我尝试在导入语句中使用变量,它会返回ModuleNotFoundError: No module named 'var_file'。 (我怀疑这样的 glob 不起作用,我必须使用一些正则表达式才能使其工作,但你明白了)
到目前为止,我还没有找到与import * 等效的方法。在我见过的情况下,每次需要使用导入的变量之一时,我都必须使用前缀,这会导致更重的符号和代码中的大量更改。到目前为止,我尝试过:
import importlib
variable='vars1'
__import__(variable)
# or alternatively
importlib.import_module(variable)
除非我将导入分配给其他变量(例如y=__import__(variable)),然后将其用作访问变量的前缀(例如y.volume),否则这些变量中的任何一个都不会将导入的变量保留在内存中,我会这样做喜欢避免。
有没有办法做到这一点?
【问题讨论】:
-
做
y = __import__(...),然后for attr, val in vars(y).items(): ......? -
你是否在 vars1 中添加了 if
__name__ == "__main__":? -
你首先想做什么做?遍历一堆文件并导入所有变量似乎......可疑......?不像“恶意”,而是“可能有更好的解决方案来解决你想要做的任何事情”……
-
那么你的模拟应该定义在一个带参数的函数中,这些参数可以在文件中定义,可能最好是像 YAML 这样的文本格式,它非常接近纯 Python 变量,你可以将文件中的这些值加载到 dict 中,并使用
my_simulation(**kwargs)... 将它们作为参数传递给您的函数? -
至少您可以将模块作为对象导入 (
y = __import(..)__),然后其中定义的所有变量都是该对象的属性。最坏的情况是您以编程方式从中创建一个 dict 并将它们作为**kwargs传递到您的模拟函数中。无需将它们提取为单独的变量。
标签: python python-3.x python-import