我正在尝试从其他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)
ouptut是:
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 *
吗?
答案 0 :(得分:1)
Star导入(&#34;来自xxx import *&#34;)是不好的做法(并且被pep08强烈反对),并且只能用作Python shell中的便捷快捷方式,以便快速检查/试验/调试。
因此,您的b.py
代码应导入a
模块并使用限定路径,即:
# b.py
import a
print(a.text)
或(最糟糕的)明确地从a
导入所需的名称:
# b.py
from a import text
print(text)
请注意,第二个解决方案不会像预期的fior mutable全局一样工作,因为在这种情况下text
成为b
中的模块本地名称,所以如果a.text
反弹(重新分配)其他地方b.text
不会受到影响。但无论如何,可变的全局变量都是邪恶的......
现在假设您执行RightThing并选择第一个解决方案(模块导入+合格路径),&#34;翻译&#34;使用importlib
将是:
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
的原因很少。
答案 1 :(得分:-2)
听起来你可能想看一下OOP(面向对象的编程)。 首先,您需要初始化一个类。接下来,您需要为所述类创建变量。第三,你想在你的另一个模块中调用该类的实例
#1初始化课程
class testHello(object):
j2