繁体   English   中英

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

[英]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)

请注意,第二种解决方案无法像预期的那样在可变全局变量中起作用,因为在这种情况下, textb成为模块本地名称,因此,如果a.text在其他地方反弹(重新分配),则b.text不会受到影响。 但是无论如何,可变的全球人都是邪恶的……

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

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

FWIW,所有使用importlib.__import__()尝试都是错误的- globals应该是dictfromlist应该是名称(字符串)的列表。 但是,实际上没有什么理由使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM