为什么Python在导入时会运行我的模块,如何阻止它?

Das*_*tor 150 python module python-import

我有一个我正在构建的Python程序,它可以用以下两种方式之一运行:第一种是调用"python main.py",它以友好的方式提示用户输入,然后通过程序运行用户输入.另一种方法是调用"python batch.py -file- ",它将通过所有友好的输入收集并通过程序一次性运行整个文件的输入值.

问题是,当我运行"batch.py​​"时,它会从"main.py"导入一些变量/方法/ etc,并在运行此代码时:

import main
Run Code Online (Sandbox Code Playgroud)

在程序的第一行,它立即出错,因为它试图在"main.py"中运行代码.

如何阻止Python运行我正在导入的"main"模块中包含的代码?

小智 220

因为这是Python的是如何工作的-如关键字classdef不是声明.相反,它们是真实的实时语句.如果他们没有执行你的模块将是..空:-)

无论如何,惯用的方法是:

# stuff to run always here such as class/def
def main():
    pass

if __name__ == "__main__":
   # stuff only to run when not called via 'import' here
   main()
Run Code Online (Sandbox Code Playgroud)

什么是if __name__ == "__main__"

但是,它确实需要对正在import编辑的模块进行源代码控制.

快乐的编码.

  • 只是为了确认,您的评论“仅在此处未通过“导入”调用时才运行的内容”意味着要在 main() 下编写的命令,对吧?还是没关系?? (2认同)
  • @Goldname if 语句中的代码在导入时不会运行,但 main 函数本身已定义并且即使通过导入也可以使用。该模块在运行时只会执行 main 函数,如果导入则不会执行它。这完全取决于您想做什么。如果您在其他地方不需要 main 中的命令,请务必将它们写入 if 中。但对我来说,它看起来更整洁。 (2认同)

小智 46

由于Python的工作方式,它必须在导入模块时运行它们.

要防止模块中的代码在导入时执行,但只有在直接运行时才能执行,您可以使用以下命令保护它if:

if __name__ == "__main__":
    # this won't be run when imported
Run Code Online (Sandbox Code Playgroud)

您可能希望将此代码放在main()方法中,以便您可以直接执行文件,也可以导入模块并调用main().例如,假设它在文件中foo.py.

def main():
    print "Hello World"

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

该程序可以通过go python foo.py或其他Python脚本运行:

import foo

...

foo.main()
Run Code Online (Sandbox Code Playgroud)


Ism*_*awi 12

使用if __name__ == '__main__'idiom - __name__是一个特殊变量,其值是'__main__'模块作为脚本运行,以及模块名称(如果已导入).所以你会做类似的事情

# imports
# class/function definitions
if __name__ == '__main__':
    # code here will only run when you invoke 'python main.py'
Run Code Online (Sandbox Code Playgroud)


cwa*_*ole 6

不幸的是,你没有。这是导入语法工作方式的一部分,重要的是它这样做——记住def实际上是执行的东西,如果Python没有执行导入,你就会被困在没有函数的情况下。

不过,由于您可能有权访问该文件,因此您也许可以查看导致错误的原因。可以修改您的环境来防止错误发生。


小智 5

将代码放入函数中,直到调用该函数后它才会运行。你的main.py. 与声明:

if __name__ == '__main__':
  main()
Run Code Online (Sandbox Code Playgroud)

然后,如果您调用python main.pymain()函数就会运行。如果导入main.py,则不会。main.py另外,为了清楚起见,您可能应该重命名为其他名称。