[英]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 *
吗?
星号导入(“ 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
应该是dict
, fromlist
应该是名称(字符串)的列表。 但是,实际上没有什么理由使用importlib.__import__()
代替importlib.import_module
。
听起来您可能想看一下OOP(面向对象编程)。 首先,您需要初始化一个类。 接下来,您将要为所述类创建变量。 第三,您想在其他模块中调用该类的实例
#1初始化类
class testHello(object):
#2. initialise variables
def __init__(self):
self.text = "hello world"
#3. instantiate the class
from <name of python class without py> import *
classInstance = testHello()
#4. print desired variable
print(classInstance.text)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.