我正在尝试运行一种聊天机器人,该机器人能够在程序运行时创建新命令。为此,我将所有命令保留在第二个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'
理想的结果是输入一个连续的循环,然后像打印一个无缝脚本一样打印文本。
这可能吗?如果是这样,我该怎么做-还是有更好的方法实现相同的目标?
非常感谢。
答案 0 :(得分:0)
因此,我将尽一切努力为您解决问题。本质上,您正在做的是构造循环依赖项:commands.py
由main.py
编写,main.py
的功能依赖于commands.py
。几乎肯定可以在不引入这种循环依赖的情况下解决您的问题,但是我需要了解更多以便提出一些建议。
如果确定要这样做,可以使用importlib.reload
,它告诉python重新加载已经导入的模块。换句话说,如果您自调用原始commands.py
后已向import
添加了新功能,则调用reload
将使此功能可用。
作为一个小示例,请尝试如下设置commands.py
和main.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