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

我有一个Python程序,我可以用两种方式运行:第一种是调用“python main.py”,它以友好的方式提示用户input,然后通过程序运行用户input。 另一种方法是调用“python batch.py -file- ”,它将通过所有友好的input收集并通过程序一次性运行整个文件的input。

问题是,当我运行“batch.py​​”它从“main.py”导入一些variables/方法/等,当它运行这个代码:

import main 

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

我怎样才能阻止Python运行包含在我正在导入的“主”模块中的代码?

因为这就是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() 

看看if __name__ == "__main__"是什么?

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

快乐的编码。

由于Python的工作方式,它需要在导入模块时运行你的模块。

为了防止在导入时执行模块中的代码,但仅在直接运行时执行, if以下情况,可以使用以下代码来防止代码:

 if __name__ == "__main__": # this won't be run when imported 

你可能想把这个代码放在main()方法中,这样你就可以直接执行文件,或者导入模块并调用main() 。 例如,假设这是在文件foo.py

 def main(): print "Hello World" if __name__ == "__main__": main() 

这个程序可以通过运行python foo.py或者从另一个Python脚本运行:

 import foo ... foo.main() 

不幸的是,你没有。 这是导入语法如何工作的一部分,重要的是记住def实际上是被执行的东西,如果Python没有执行导入,那么就会被阻塞而没有函数。

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

使用if __name__ == '__main__'成语 – __name__是一个特殊的variables,如果模块正在作为脚本运行,则其值为'__main__'如果模块名称被引入,则为'__main__' 。 所以你会这样做

 # imports # class/function definitions if __name__ == '__main__': # code here will only run when you invoke 'python main.py' 

你可以这样写你的“main.py”:

 #!/usr/bin/env python __all__=["somevar", "do_something"] somevar="" def do_something(): pass #blahblah if __name__=="__main__": do_something() 

把代码放在一个函数中,直到你调用该函数才会运行。 你应该在你的main.py中有一个主要的function。 声明:

 if __name__ = '__main__': main() 

那么,如果你调用“python main.py”,main()函数将会运行。 如果你导入main.py,它不会。 另外,为了清楚起见,您可能应该将main.py重命名为其他内容。

虽然不能在不运行代码的情况下使用import , 有一个很快的方法可以input你的variables; 通过使用numpy.savez ,将variables作为numpy数组存储在.npz文件中。 之后,您可以使用numpy.load加载variables。

请参阅scipy文档中的完整说明

请注意,这只是variables和variables数组的情况,而不是方法等。

有一个Python增强提案PEP 299旨在用if __name__ == '__main__':replaceif __name__ == '__main__':成语,但它被拒绝了。 当使用if __name__ = '__main__':时,仍然需要记住一点if __name__ = '__main__':

尝试只是从main.py导入所需的function? 所以,

 from main import SomeFunction 

这可能是因为你已经在batch.py​​中命名了一个和main.py中的函数相同的函数,当你导入main.py时,程序运行main.py而不是batch.py​​函数。 做上面的应该解决这个问题。 我希望。