如何在python 3中将参数发送到另一个文件

时间:2016-05-14 18:03:29

标签: python

所以,我一直在寻找关于这个主题的其他线程,但是他们没有使用将参数传递给另一个文件的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)

我得到的错误是模块密码没有属性系统

3 个答案:

答案 0 :(得分:2)

  

我得到的错误是模块密码没有属性系统

当然没有。在执行代码行时,定义不存在,因为第一个文件的执行被导入中断。

重构或重新排序代码,以便在名称存在之前不会访问该名称,或者删除每个模块对另一个名称的要求。

答案 1 :(得分:0)

这里的问题是循环依赖/导入。

import语句确实执行导入文件中的代码;也就是说,所有语句都被执行,导入文件中def的所有内容都被定义等等。imports也被导入。

所发生的事情是这样的:

  1. 你跑
  2. $ python MoneyCounter.py

    1. Python读取MoneyCounter.py,执行其第一个语句:import Password
    2. Python读取Password.py,并执行其第一个语句:import MoneyCounter.py
    3. Python读取MoneyCounter.py,这次它遇到import Password,但已经在其已知名称列表中有密码;所以它继续
    4. enter=False; Password.system(enter)

      1. 现在,Python的名称查找字典中已经有Password:半导入Password。其中,def system…尚未发生,因此Password.system仍未知。
      2. 通常,您的架构可疑。为什么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