Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从不同的脚本导入类,其中类在初始化时使用全局变量?_Python - Fatal编程技术网

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)

  • 使用var作为测试参数,如下所示
  • 使用配置类存储全局变量
  • config.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