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

时间:2017-12-11 11:53:27

标签: python module python-importlib import-libraries

我正在尝试从其他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 *吗?

2 个答案:

答案 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