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

如何在Python3中将参数发送到另一个文件,python,Python,因此,我一直在研究关于这个主题的其他线程,但它们没有使用将参数传递给其他文件的模块版本,如果没有对其进行足够清楚的解释,以使我能够理解的话 我只是想表明我不是在问: #MoneyCounter.py import Password enter = False Password.system(enter) def start(check): if check == True: main() elif check == False: print("

因此,我一直在研究关于这个主题的其他线程,但它们没有使用将参数传递给其他文件的模块版本,如果没有对其进行足够清楚的解释,以使我能够理解的话

我只是想表明我不是在问:

#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)
我得到的错误是模块密码没有属性系统

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

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


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

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

import
语句真正执行导入文件中的代码;也就是说,所有语句都会执行,导入文件中定义的所有内容都会被定义,等等。
imports
get imported

所以现在发生的是:

  • 你跑
  • $python MoneyCounter.py

  • Python读取MoneyCounter.py,执行其第一条语句:
    import Password
  • Python读取Password.py并执行其第一条语句:
    import MoneyCounter.py
  • Python读取MoneyCounter.py,这一次它遇到了
    导入密码
    ,但它的已知名称列表中已经有密码;所以它继续
  • enter=False;密码。系统(输入)

  • 现在,Python的名称查找字典中已经有了一个
    密码
    :一半导入的
    密码
    。在这种情况下,
    def system…
    尚未发生,因此
    Password.system
    仍然未知

  • 一般来说,您的体系结构是有问题的。为什么
    密码
    实用程序模块会调用您的“主”业务逻辑?最好不要这样做,而是编写代码,实际检查
    Password.system
    的返回值,并根据
    MoneyCounter.py

    中的返回值进行操作,假设
    MoneyCounter.py
    是入口点(从命令行运行的名称),然后我建议您替换它:

    enter = False
    Password.system(enter)
    
    为此:

    if __name__ == "__main__":
        enter = False
        Password.system(enter)
    
    这将仅从入口点(称为
    \uuuuu main\uuuu
    )执行,而不会在导入时执行。但是,您应该重新考虑您的设计

    编辑:

    name
    是对当前模块文本名称的引用。对于显式导入的模块,名称取自文件名,但入口点(程序启动的地方)始终称为
    \uuuuu main\uuuu
    。因此,我们总是可以测试我们是作为导入模块还是作为入口点运行


    这个测试在python中非常常见。通过这种方式,我们可以提供额外的功能,这取决于我们是将模块作为程序运行还是导入它。

    将参数传递到文件是什么意思?此外,这里的问题是,如果模块A也导入模块B(也称为导入循环),则无法从模块B导入模块A。您命名了参数
    check
    ,但在函数中使用
    enter
    。嗯,您可以执行循环导入,但您需要知道自己在做什么。与您的问题无关,但是
    exit
    应该只在交互式python中使用(因为
    stdin
    有副作用)。您应该改用
    sys.exit()
    。谢谢。但是我怎样才能做循环导入呢?这是我想要做的,因为我想在文件之间来回发送参数。步骤4是错误的,因为步骤1,因为主脚本总是
    \uuuu main\uuuu
    ,不管它有什么文件名。@IgnacioVazquez Abrams我必须承认我很困惑:
    \uuuu main\uuuuu
    在任何地方都没有使用?对,这意味着,
    Password
    将作为
    MoneyCounter
    导入MoneyCounter.py的第二个副本,而不是作为
    \uuuuuu main\uuuuu
    导入副本。年轻玩家的陷阱。啊,的确是的,关键是在导入时,Python会遇到
    导入密码
    ;现在,在它的dict中已经有一个名称
    密码
    ,它不会
    导入密码
    ?正确,它将使用它已经拥有的引用。你能解释一下名字和“main”是什么意思吗?带下划线这个答案是正确的,但我会更加强调重构选项。循环导入只会带来麻烦和奇怪的错误(像这样)。