【问题标题】:Importing variables from another file (importlib)?从另一个文件(importlib)导入变量?
【发布时间】:2017-12-11 11:53:27
【问题描述】:

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

【问题讨论】:

  • 您实际上根本不应该使用星型导入 - 星型导入会污染您的命名空间,使您的代码无法维护(您不知道从哪个模块导入名称)并闯入意想不到的方式(当您在导入的模块中定义一个新名称时,恰好隐藏了另一个先前导入的名称)。

标签: python module python-importlib import-libraries


【解决方案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 应该是 dict,而 fromlist 应该是名称(字符串)列表。但实际上使用importlib.__import__() 而不是importlib.import_module 的充分理由很少。

【讨论】:

    猜你喜欢
    • 2013-06-19
    • 2021-04-17
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多