同时在两个Python脚本之间导入函数

时间:2018-11-10 07:32:23

标签: python python-import

我正在尝试运行一种聊天机器人,该机器人能够在程序运行时创建新命令。为此,我将所有命令保留在第二个python脚本中,并在聊天机器人仍在运行时使用主脚本编辑command.py文件。

问题...

我可以使用 import main 然后使用 main.functionName()来调用两个函数,从而使两个脚本相互访问。但是,当我尝试从main.py调用commands.py中的一个函数,然后使用被调用的函数在main.py中调用另一个函数时,我得到一个错误提示

AttributeError: module 'main' has no attribute 'exampleFunction' 

例如以下代码;

TESTING.py

import TESTING2

def runme(inp):
    print(inp)
    startOver()

print("begin")
TESTING2.startOver()

TESTING2.py

import TESTING

def startOver():
    userInput = input("Enter text at your own risk... ")
    TESTING.runme(userInput)

产生以下内容;

begin
Traceback (most recent call last):
  File "C:\Users\harry\Desktop\TESTING.py", line 1, in <module>
    import TESTING2
  File "C:\Users\harry\Desktop\TESTING2.py", line 1, in <module>
    import TESTING
  File "C:\Users\harry\Desktop\TESTING.py", line 8, in <module>
    TESTING2.startOver()
AttributeError: module 'TESTING2' has no attribute 'startOver'

理想的结果是输入一个连续的循环,然后像打印一个无缝脚本一样打印文本。

这可能吗?如果是这样,我该怎么做-还是有更好的方法实现相同的目标?

非常感谢。

1 个答案:

答案 0 :(得分:0)

因此,我将尽一切努力为您解决问题。本质上,您正在做的是构造循环依赖项:commands.pymain.py编写,main.py的功能依赖于commands.py。几乎肯定可以在不引入这种循环依赖的情况下解决您的问题,但是我需要了解更多以便提出一些建议。

如果确定要这样做,可以使用importlib.reload,它告诉python重新加载已经导入的模块。换句话说,如果您自调用原始commands.py后已向import添加了新功能,则调用reload将使此功能可用。

作为一个小示例,请尝试如下设置commands.pymain.py脚本:

#commands.py
def func1():
    print(1)

和:

#main.py
import commands
commands.func1()

input("hit enter once you've edited commands.py")

from importlib import reload
commands = reload(commands)
commands.func2()

运行main.py,然后转到input部分,打开commands.py并将其更改为如下所示:

#commands.py
def func1():
    print(1)

def func2():
    print(2)

现在在运行的main.py脚本中单击“输入”。您应该看到func2打印到终端的结果。

但是也请注意,reload不一定按照您期望的方式运行,并且可能导致某些奇怪且可解释的事情发生。有关更多信息,请参见这篇文章:https://stackoverflow.com/a/438845/141789