您好我在我的模块中导入功能有问题。我收到错误:
from menu import *
我有6个模块(主要,菜单,用户,书籍,汽车等)
在我的 main.py 中,我有from users import *
from books import *
在 menu.py 中,我有:
from menu import *
def login():
x = str(input("Username:"))
y = str(input("Password:"))
if x == "admin" and y == "admin":
main_menu()
else:
print('Wrong!')
login()
现在,当我尝试将功能 main_menu()从 menu.py 导入我的 users.py 时,我收到了该错误。
我记得不知怎的,我无法从模块中来回导入函数。但是如何调用位于 menu.py 中的 main_menu()函数?
我的问题是,如果我已从当前模块导入所有内容,如何从其他模块导入和调用函数?
编辑:
main.py
from users import *
def main_menu():
print("Welcome to main menu:")
option = str(input("Enter option: "))
if option == '1':
all_users()
menu.py
from menu import *
def all_users():
allusers = ["Mike", "John", "Nick"]
print(allusers)
backtomenu = str(input("Back to main menu: (Y/N) "))
if backtomenu == "Y":
main_menu()
elif backtomenu == "N":
quit()
users.py
Username:admin
Password:admin
Welcome to main menu:
Enter option: 1
['Mike', 'John', 'Nick']
Back to main menu: (Y/N) Y
Traceback (most recent call last):
File "C:\Users\Sm\Desktop\ss\main.py", line 13, in <module>
login()
File "C:\Users\Sm\Desktop\ss\main.py", line 10, in login
main_menu()
File "C:\Users\Sm\Desktop\ss\menu.py", line 7, in main_menu
all_users()
File "C:\Users\Sm\Desktop\ss\users.py", line 8, in all_users
main_menu()
NameError: name 'main_menu' is not defined
>>>
错误:
fill_in "search", with: post3.title
答案 0 :(得分:0)
您在menu
和users
模块之间进行循环导入。由于您使用的是from module import *
语法,因此无法按照您的意图进行操作。当您尝试从中导入所有名称时,其中一个模块为空(因为它等待另一个模块加载)。究竟哪个模块失败将取决于外部代码如何首先加载这些模块。
一个简单的解决方法是仅使用基本的import module
语法而不是from module import *
(出于命名空间污染的原因,通配符导入通常是个坏主意。)
所以你可以试试:
<强> menu.py 强>:
import users
def main_menu():
print("Welcome to main menu:")
option = str(input("Enter option: "))
if option == '1':
users.all_users()
<强> users.py 强>:
import menu
def all_users():
allusers = ["Mike", "John", "Nick"]
print(allusers)
backtomenu = str(input("Back to main menu: (Y/N) "))
if backtomenu == "Y":
menu.main_menu()
elif backtomenu == "N":
quit()
许多人会告诉你,圆形进口是设计糟糕的明显标志,你应该总是摆脱它们。我倾向于不对它们如此努力,因为如果你把它们弄好的话,它们可以在Python中正常工作。
但在这种情况下,简单地将一些模块组合在一起可能是有意义的。如果你不需要命名空间分离(你显然没有,因为你使用的是通配符导入),你也可以将所有内容放在同一个文件中。然后你就没有任何循环导入问题,因为你根本没有任何进口。