我有两个.py文件。主模块是'TS_File_analysis.py',子模块是'Port_operations. py'。
导入主模块中的子模块。
from Port_operations import *
def main_menu():
try:
if r == 1:
print()
elif r == 2:
search_cmd_output()
elif r == 3:
port_analyze_drops()
elif r == 4:
print('Exit out.! Good bye..:)')
return
else:
print('Entered option was not valid.\n')
main_menu()
except ValueError as ex:
print('Din\'t choose any option.\n')
main_menu()
在子模块文件中导入main_module。
from TS_File_analysis import main_menu
def port_analyze_drops():
try:
if int(r2) == 1:
get_output_of_port_drops()
elif int(r2) == 2:
get_output_of_port_errors()
elif int(r2) == 3:
del_res_file(temp_result2)
main_menu()
else:
print('Entered option was not valid.\n')
port_analyze_drops()
except ValueError as ex:
print('Din\'t choose any option.\n')
port_analyze_drops()
return
在初始运行时,我们可以成功地从main_module转到sub_module,然后返回main_module。同样,如果我想从main_module转到sub_module,它会失败,并显示以下跟踪。
Traceback (most recent call last):
File "C:\Users\user1\Documents\Python\Source\Workspace\TS_File_Analysis\TS_File_analysis.py", line 151, in <module>
main_menu()
File "C:\Users\user1\Documents\Python\Source\Workspace\TS_File_Analysis\TS_File_analysis.py", line 95, in main_menu
port_analyze_drops()
File "C:\Users\user1\Documents\Python\Source\Workspace\TS_File_Analysis\Port_operations.py", line 20, in port_analyze_drops
main_menu()
File "C:\Users\user1\Documents\Python\Source\Workspace\TS_File_Analysis\TS_File_analysis.py", line 94, in main_menu
port_analyze_drops.__module__
NameError: name 'port_analyze_drops' is not defined
期望从main_module切换到sub_module,反之亦然,次数与您尝试切换的次数相同。
1条答案
按热度按时间2izufjch1#
从提供的代码片段中很难看到模块层次结构、导入结构、调用树和命名空间。我必须看到main_menu模块才能理解导入结构。如果你能把它贴出来会很有帮助。
我可以看到两个潜在的问题,可能会让你感到困惑。
首先,Python的“import STAR”语句带有“import *”是完全不受欢迎的。这被认为是糟糕的命名空间管理实践,因为你可以很容易地在没有意识到的情况下破坏其他对象的名称。看起来你可能用你的IMPORT STAR破坏了main_menu函数。请提供“TS_File_analysis.py”文件的完整源代码。
第二,最好用一个顶级的主模块来构建你的模块,比如,“app_main.py”,它导入其他支持模块。你的main_menu()函数应该在app_main.py文件的底部,并且在其他模块导入之后运行,而不是相反。子模块不应该导入主模块。