如何在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
import Password
import MoneyCounter.py
导入密码
,但它的已知名称列表中已经有密码;所以它继续enter=False;密码。系统(输入)
密码
:一半导入的密码
。在这种情况下,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”是什么意思吗?带下划线这个答案是正确的,但我会更加强调重构选项。循环导入只会带来麻烦和奇怪的错误(像这样)。