Импорт функций между двумя скриптами Python одновременно - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь запустить своего рода чат-бот, способный создавать новые команды во время работы программы. Для этого я сохраняю все команды во втором скрипте Python и использую основной скрипт для редактирования файла command.py, пока бот-чат еще работает.

Вопрос ...

Я могу получить доступ к обоим сценариям, используя import main и затем main.functionName () для вызова функции. Однако, когда я пытаюсь вызвать функцию из command.py из main.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 голосов
/ 11 ноября 2018

Итак, я попробую дать вам кое-что, что может решить вашу проблему. По сути, вы строите круговую зависимость: 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)

Теперь нажмите "enter" в запущенном main.py скрипте. Вы должны увидеть результат func2, напечатанный на терминале.

Обратите внимание также на то, что reload не обязательно действует так, как вы ожидаете, и может вызвать некоторые странные и объяснимые вещи. Для получения дополнительной информации см. Этот пост: https://stackoverflow.com/a/438845/141789

...