为什么Python在导入时运行我的模块,我该如何阻止它呢?
我有一个Python程序,我可以用两种方式运行:第一种是调用“python main.py”,它以友好的方式提示用户input,然后通过程序运行用户input。 另一种方法是调用“python batch.py -file- ”,它将通过所有友好的input收集并通过程序一次性运行整个文件的input。
问题是,当我运行“batch.py”它从“main.py”导入一些variables/方法/等,当它运行这个代码:
import main
在程序的第一行,立即出错,因为它试图运行“main.py”中的代码。
我怎样才能阻止Python运行包含在我正在导入的“主”模块中的代码?
因为这就是Python的工作原理 – class
和def
这样的关键字不是声明 。 相反,它们是被执行的真实生命语句 。 如果他们没有执行你的模块将..空:-)
无论如何,惯用的方法是:
# 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函数。 做上面的应该解决这个问题。 我希望。