从另一个文件 (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
的理由很少。
我正在尝试从另一个 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
的理由很少。