1

我正在尝试从另一个 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 *吗?

4

1 回答 1

1

星号导入(“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将不会受到影响。但无论如何,可变全局变量都是邪恶的......

现在假设您执行 RightThing 并选择第一个解决方案(模块导入 + 限定路径),“翻译”使用importlib将是:

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

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

于 2017-12-11T12:30:34.867 回答