Python 如何从不同的脚本导入类,其中类在初始化时使用全局变量?
从一个文件中,我尝试从另一个文件导入并初始化一个类,其中该类使用调用文件中定义的全局变量初始化 我的文件设置如下所示Python 如何从不同的脚本导入类,其中类在初始化时使用全局变量?,python,Python,从一个文件中,我尝试从另一个文件导入并初始化一个类,其中该类使用调用文件中定义的全局变量初始化 我的文件设置如下所示 folder ├──subfolder │ └── __init__.py │ └── sub.py ├──__init__.py ├──orig.py 我的orig.py文件如下所示: from folder.subfolder.sub import Test def varinit(): global var var = 8 def runn
folder
├──subfolder
│ └── __init__.py
│ └── sub.py
├──__init__.py
├──orig.py
我的orig.py
文件如下所示:
from folder.subfolder.sub import Test
def varinit():
global var
var = 8
def runn():
varinit()
testInstance = Test()
testInstance.print_modvar()
if __name__ == "__main__":
runn()
from folder.orig import var
class Test():
def __init__(self):
self.mod_var=var+8
def print_modvar(self):
print(self.mod_var)
我的sub.py
文件如下所示:
from folder.subfolder.sub import Test
def varinit():
global var
var = 8
def runn():
varinit()
testInstance = Test()
testInstance.print_modvar()
if __name__ == "__main__":
runn()
from folder.orig import var
class Test():
def __init__(self):
self.mod_var=var+8
def print_modvar(self):
print(self.mod_var)
在终端中,我设置:
export PYTHONPATH=/path/to/rootfolder
其中rootfolder
包含文件夹
运行python3 folder.orig.py
时,出现以下错误:
Traceback (most recent call last):
File "folder/orig.py", line 1, in <module>
from folder.subfolder.sub import Test
File "/content/folder/subfolder/sub.py", line 1, in <module>
from folder.orig import var
File "/content/folder/orig.py", line 1, in <module>
from folder.subfolder.sub import Test
ImportError: cannot import name 'Test'
回溯(最近一次呼叫最后一次):
文件“folder/orig.py”,第1行,在
从folder.subfolder.sub导入测试
文件“/content/folder/subfolder/sub.py”,第1行,在
从folder.orig导入变量
文件“/content/folder/orig.py”,第1行,在
从folder.subfolder.sub导入测试
ImportError:无法导入名称“Test”
问题是它无法定位sub.py
?或者它能够定位sub.py
,但不能定位sub.py
中定义的类
如何修改它,以便能够正确地导入类,并在初始化时正确地使用全局变量
结果是它应该打印数字16
为了方便起见,我有一个colab笔记本,上面的代码是交互式的。但这些文件可能不会持久存在
嗯,你犯了一些错误 全局变量声明不是这样的,全局修饰符用于声明变量是全局变量,而不是声明新变量(消除歧义),而不是声明全局变量 我认为你不能导入一个文件,它会被导入一个循环 所以有两种解决方案(PS:我使用a.py是orig.py,b.py是sub.py)
class config:
var = 0
Var
无法从sub.py访问。您正试图从源代码导入sub,而从sub导入源代码。这实际上不起作用
相反,您可以将varinit
移动到子文件并从那里使用它
原稿:
从子文件夹.sub导入测试
def runn():
testInstance=Test()
testInstance.print_modvar()
如果名称=“\uuuuu main\uuuuuuuu”:
runn()
sub.py:
全局变量
var=8
类测试():
定义初始化(自):
self.mod_var=var+8
def打印模式(自):
打印(self.mod\u var)
输出:
十六,
“无法从sub.py访问Var。您试图从orig导入sub,而从sub导入orig。这真的不起作用。”这是“循环导入”的情况吗?将Var移动到子文件对这个矿化示例所针对的原始问题不起作用,但原始代码似乎有缺陷。
from config import config
class Test:
def __init__(self):
self.mod_var = config.var + 8
def print_modvar(self):
print(self.mod_var)
class config:
var = 0