【问题标题】:Python: use string variable in import all (*)Python:在导入全部(*)中使用字符串变量
【发布时间】: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


【解决方案1】:

根据@swagless_monk 的评论,我开始研究 python 的内置函数,发现这可以完成这项工作:

import glob
var_files = glob.glob('./vars*') 
for var_file in var_files: 
     o=open(var_file)  
     r=o.read()       
     exec(r) 
    
     # .....rest of the code working with the imported variables...

感谢大家的关注。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多