在Python中导入时遇到问题

时间:2019-10-11 19:12:11

标签: python python-3.x import python-import

我试图创建一个需要从主类获取变量的模块,因此我将所述变量导入到模块中,但是当我尝试通过将其导入主类来测试新模块时,它说可以导入。

这似乎是因为我在导致问题的新模块中导入了主类,因为每当删除导入时,它都可以工作,但是它不再能够访问功能所需的主类中的变量。

主要类别:

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task()

新模块:

from Main import variable1, variable2

class Mod:
    def task(self):
        print(variable1+variable2)

运行主类时,我得到以下信息:

Traceback (most recent call last):
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
ImportError: cannot import name 'Mod' from 'Mod' (D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py)

当我运行新模块时,我得到了:

Traceback (most recent call last):
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
ImportError: cannot import name 'variable1' from 'Main' (D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py)

我不知道为什么会发生这种情况。它与我在Java中所做的事情相矛盾。

如果不通过导入全局变量,如何能够引用存储在主类中的全局变量?

5 个答案:

答案 0 :(得分:3)

您在这里遇到的问题称为“ circular dependency”。 Main.py试图从Mod.py导入一个类,但是在此之前,Mod必须从Main.py导入一些变量,但是在此之前...

通常,解决循环依赖性的方法是重新组织程序的布局。例如,您可能可以对Mod进行参数化,使其不再依赖于Main。例如:

Main.py:

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task(variable1, variable2)

Mod.py:

class Mod:
    def task(self, a, b):
        print(a + b)

或者,您可以将variable1variable2存储在另一个文件中。找到最佳解决方案将取决于对您的程序最有意义的方法。

答案 1 :(得分:0)

您可以更新Mod.task()以获得两个额外的参数,因此您将获得:

def task(self, a, b):
    print(a + b)

然后,基本上,您只需说:

mod.task(variable1, variable2)

除了将Mod导入您的主类之外,无需导入

答案 2 :(得分:0)

这是由循环依赖引起的

如以上答案中所述,解决循环依赖的方法是重新组织程序的布局。 使用 参数

尽管如此,一种简单的解决方法是进行内联导入

Main.py

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task()

Mod.py


class Mod:
    def task(self):
        from Main import variable1, variable2
        print(variable1+variable2)

答案 3 :(得分:0)

遵循DRY原则。不要重复自己。

将“ Main”变量导入Mod会导致循环依赖。您必须不惜一切代价避免的事情。使用面向对象编程来解决您的问题。

解决问题的步骤:

  1. 删除Main的导入。
  2. 更改任务功能以允许传递两个参数。应该是这样的

    def task(self, variable1, variable2):
       print(variable1 + variable2)
    

    #您可以对变量1和2使用任何名称

  3. 在主脚本上,只需调用函数:

    Mod.task(variable1, variable2)
    

    这里必须使用变量的名称,因为您现在正在调用Main中给出的定义。

答案 4 :(得分:0)

我不明白您在Java中的意思是可以做到的。 但是在python中可能会遵守规则,即循环引用模块的主体必须能够在不访问其他相关模块内容的情况下执行。
因此,您可以这样做:

# cat Main.py
import Mod
var1=2
var2=3
if __name__ == '__main__':
    mod=Mod.Mod()
    mod.task()
# cat Mod.py
import Main
class Mod(object):
    def task(self):
        print(Main.var1+Main.var2)

例如。或使用导入链成功后调用的函数处理模块的初始化。
无论如何,在大多数情况下,最好避免只初始化类并使用参数调用函数。