1

I have function foo() in main.py. In main.py, I import create.py. but there is a function in create.py that needs foo() from main. I can't import main.py into create.py because main.py errors out...I assume this is some kind of race condition.

How can I make foo() available in create.py namespace? It seems kind of inefficient to make foo() a module and imported by both main.py and create.py just for one function.

4

3 回答 3

1

当您导入一个模块时,Python 的import机器会执行该模块的代码来填充它,但只会执行一次。如果您多次导入同一个模块,则会从sys.modules缓存中获取它。没有办法以无限导入循环结束。

但是,Python 在为其sys.modules执行代码之前将模块添加到其中,因此在执行整个模块之前不会完全填充它。因此,如果模块 A 导入模块 B,并且模块 B 再次导入模块 A,它将看到一个部分初始化的模块。这似乎是这里发生的事情;main在完全填充之前导入create,因此当create尝试访问 中的某些内容时main,它还不存在。

一些解决方案:

  1. 如上所述,将共享代码移至单独的模块。导入只进行一次,Python 将编译后的字节码缓存在 PYC 文件中,因此成本并不高。
  2. 将所有代码移动到函数中,并import name在任何地方使用(否from name import),并从脚本底部调用您的 main 函数。这样,所有模块将在您执行任何其他操作之前完成导入。
  3. import create语句移到您需要访问的函数下方,因此它是在create.py执行代码之前定义的(这有点傻,但可以作为最后的手段)。
于 2013-07-21T21:13:40.330 回答
1

简单的答案是将 foo() 移至 foo.py 并从那里导入或将其移至 create.py 并将其从那里导入 main.py - 如果 main.py 中有东西也需要移动。您的另一个选择是将 foo 从 main 传递到 create 作为需要的函数参数。

于 2013-07-21T19:31:24.050 回答
1

只是一个简单的技巧,但这在一般情况下无济于事。

在 main.py 中导入 create.py,当它不是通过导入调用时。

# in main.py
if __name__ == '__main__':
    from create import *

因此,当您执行 main.py 时python main.py,这将导入 create ,这将导入 create 并将再次导入 main ,但这一次,它会看到它正在被导入,所以__name__ == '__main__'会返回False。所以循环进口链将停止。

请记住,当您尝试在其他脚本中导入 main.py 时,它不会起作用,因为 create.py 不会被导入。

所以要让这个东西工作,你必须执行main.py,你不能导入它。

于 2013-07-21T19:39:53.563 回答