Попытка подключить файлы к моему main.py файл выдает ошибку

#python

#питон

Вопрос:

Последние несколько дней я пробовал python и для развлечения кодировал базовую терминальную штуковину. Я решил перенести свои функции в другие файлы и использовать import функцию для их подключения. Моя среда разработки (repl.it ) говорит мне, что я могу просто импортировать имя файла и вызывать функции в моем main.py , но встроенный интерпретатор выдает мне ошибку имени. Вот мой код:

main.py

 import functions

def terminal() :
  command = input('')
  if command == 'login' :
    functions.login()
  if command == 'logout' :
    functions.logout()
  if command == 'info' :
    info.info()


print('Welcome to the terminal. Please start by entering a command.')
terminal()
  

functions.py

 import main

def login() :
  enteredcode = input('Enter Passcode: ')
  if enteredcode == code[0] :
    loggedIn == True
    print('Login Successful!')
    print('Logged in as: '   user[0])
    main.terminal()
  if enteredcode == code[1] :
    loggedIn == True
    print('Login Successful!')
    print('Logged in as: '   user[1])
    main.terminal()
  else :
    print('Incorrect Code. Please Try Again.')
    login()
    

def logout() :
  if loggedIn == True :
    loggedIn == False
    print('Logged Out.')
    main.terminal()
    return
  elif loggedIn == False :
    print('You are already logged out.')
    main.terminal()

user = ['user1', 'user2']
code = ['2001', '6969']
loggedIn = False
  

И вот в чем ошибка:

 Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import functions
ModuleNotFoundError: No module named 'functions'
  

ОБНОВЛЕНИЕ: Исправлено! Я думаю, что это был циклический импорт, который все испортил.

Комментарии:

1. Можете ли вы добавить полную ошибку, которую он выводит?

2. Я вставил точно ваш код в те же два файла на repl.it и получил приглашение для входа в систему. Тем не менее, то, что вы создали здесь, является циклическим импортом, поэтому остальная часть вашего кода фактически не будет работать.

3. Вы убедились, что ваш functions.py файл находится в том же каталоге, что и ваш main.py файл?

4. Я не получаю вашу ошибку, и я получаю приглашение «Добро пожаловать в терминал. Пожалуйста, начните с ввода команды. »

Ответ №1:

В вашем коде есть несколько проблем, помимо циклического импорта; я взял на себя смелость немного его почистить.

  1. Вам нужно использовать global ключевое слово перед чтением глобальных переменных, если вы намереваетесь их изменить. Иногда вы можете обойтись без этого, но всегда лучше быть явным. Еще лучше было бы вообще не полагаться на глобальные переменные, инкапсулируя состояние внутри объекта, но это может быть упражнением в будущем.
  2. Похоже, вы используете == то, что собираетесь назначить; для этого вам просто нужен один = .
  3. Вы можете просто бесконечно зацикливаться с while в вашей терминальной функции вместо рекурсивных вызовов взад и вперед между terminal и login/logout — это просто приведет к потере вашего стека вызовов.
  4. Ваши пользовательские коды — отличное место, чтобы узнать о том, как работают словари.
  5. Я добавил exit команду, а также предупреждение, если вы попытаетесь войти в систему, когда уже вошли в систему.

Здесь:

 #main.py
import functions

def terminal() :
  while True:
    command = input('>> ')
    if command == 'login' :
      functions.login()
    elif command == 'logout' :
      functions.logout()
    elif command == 'exit':
      print("Goodbye!")
      break
    else:
      print("Unknown command!")

print('Welcome to the terminal. Please start by entering a command.')
terminal()
  

И:

 # functions.py
users_by_code = {
  '2001': 'user1',
  '6969': 'user2',
}
loggedIn = False

def login() :
  global loggedIn
  if loggedIn:
    print('You are already logged in!')
    return
  while True:
    enteredcode = input('Enter Passcode: ')
    user = users_by_code.get(enteredcode)
    if user:
      break
    print('Incorrect Code. Please Try Again.')
  loggedIn = True
  print('Login Successful!')
  print('Logged in as:', user)

def logout():
  global loggedIn
  if loggedIn:
    loggedIn = False
    print('Logged Out.')
  else:
    print('You are already logged out.')
  

Ответ №2:

Вместо import functions попробуйте from functions import *

Комментарии:

1. Это действительно не рекомендуемый метод. Помните, что «Явное лучше, чем неявное», и это может вызвать проблемы, которые сложно найти и отладить при столкновении имен.