从模块后面和堡垒导入功能

时间:2017-01-17 03:10:53

标签: python python-3.x import python-import python-module

您好我在我的模块中导入功能有问题。我收到错误:

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

1 个答案:

答案 0 :(得分:0)

您在menuusers模块之间进行循环导入。由于您使用的是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中正常工作。

但在这种情况下,简单地将一些模块组合在一起可能是有意义的。如果你不需要命名空间分离(你显然没有,因为你使用的是通配符导入),你也可以将所有内容放在同一个文件中。然后你就没有任何循环导入问题,因为你根本没有任何进口。