从另一个文件 (importlib) 导入变量?

Importing variables from another file (importlib)?

我正在尝试从另一个 python 文件导入变量。

a.py - 待导入

text="Hello, world"
print("imported")

b.py - 有效,但我不能使用静态名称 a

from a import *
print(text)

c.py - 无效

import importlib

X = "a"

try:
    text = ""
    i = importlib.import_module(X)
    print(i)
    print(text)
except ImportError as err:
    print('Error:', err)

try:
    text = ""
    i = importlib.__import__(X , globals=True, locals=True, fromlist=[], level=0)
    print(i)
    print(text)
except ImportError as err:
    print('Error:', err)

try:
    text = ""
    i = importlib.__import__(X , globals=True, locals=True, fromlist=[text], level=0)
    print(i)
    print(text)
except ImportError as err:
    print('Error:', err)

输出是:

imported
<module 'a' from '/tmp/a.py'>

<module 'a' from '/tmp/a.py'>

<module 'a' from '/tmp/a.py'>

但是 text 变量不起作用。

d.py - 无效

X = "a"
from X import *
print(text)

是否可以将 importlib 用作 from MODULE import *

Star imports ("from xxx import *") 是不好的做法(并且被 pep08 积极劝阻)并且应该只在 Python shell 中用作方便的快捷方式以进行快速检查 /实验/调试。

因此您的 b.py 代码应该导入 a 模块并使用限定路径,即:

 # b.py
 import a
 print(a.text)

或(最坏的情况)从 a:

明确导入所需的名称
# b.py
from a import text
print(text)

请注意,对于可变全局变量,第二个解决方案不会像预期的那样工作,因为在那种情况下 text 成为 b 中的模块本地名称,因此如果 a.text 被反弹(重新分配)其他地方 b.text 不会受到影响。但是可变的全局变量无论如何都是邪恶的...

现在假设您做正确的事情并选择第一个解决方案(模块导入 + 限定路径),使用 importlib 的 "translation" 将是:

import importlib
module_name = "a"
module = importlib.import_module(module_name)
print(module.text)

FWIW,您使用 importlib.__import__() 的所有尝试都是错误的 - globals 应该是 dict,而 fromlist 应该是名称列表(字符串).但是实际上使用 importlib.__import__() 而不是 importlib.import_module 的理由很少。