所以,我一直在寻找关于这个主题的其他线程,但是他们没有使用将参数传递给另一个文件的Module版本,如果没有明确解释清楚,我可以理解。
我试图表明我不只是在问:
#MoneyCounter.py
import Password
enter = False
Password.system(enter)
def start(check):
if check == True:
main()
elif check == False:
print("Critical Error occured")
exit()
我的其他档案
#Password.py
import MoneyCounter
def system(check):
if check == False:
password() #This goes to password def not mentioned in this code
elif check == True:
MoneyCounter.start(check)
我得到的错误是模块密码没有属性系统
答案 0 :(得分:2)
我得到的错误是模块密码没有属性系统
当然没有。在执行代码行时,定义不存在,因为第一个文件的执行被导入中断。
重构或重新排序代码,以便在名称存在之前不会访问该名称,或者删除每个模块对另一个名称的要求。
答案 1 :(得分:0)
这里的问题是循环依赖/导入。
import
语句确实执行导入文件中的代码;也就是说,所有语句都被执行,导入文件中def
的所有内容都被定义等等。imports
也被导入。
所发生的事情是这样的:
$ python MoneyCounter.py
import Password
import MoneyCounter.py
import Password
,但已经在其已知名称列表中有密码;所以它继续 enter=False; Password.system(enter)
。
Password
:半导入Password
。其中,def system…
尚未发生,因此Password.system
仍未知。通常,您的架构可疑。为什么Password
“实用程序”模块会调用您的“主”业务逻辑?最好不要这样做,但编写实际检查Password.system
的返回值的代码,并根据MoneyCounter.py
中的行为进行操作。
答案 2 :(得分:0)
假设MoneyCounter.py
是入口点(您从命令行运行的名称),那么我建议您替换它:
enter = False
Password.system(enter)
用这个:
if __name__ == "__main__":
enter = False
Password.system(enter)
只会从入口点(称为__main__
)执行,而不是在导入时执行。但是,您应该重新考虑您的设计。
编辑:
name
是对当前模块的文本名称的引用。对于显式导入的模块,名称取自文件名,但入口点(程序启动的位置)始终称为__main__
。因此,我们总是可以测试我们是作为导入模块运行还是作为入口点运行。
此测试在python中非常非常。这样我们就可以提供额外的功能,具体取决于我们是将模块作为程序运行还是import
。