为什么导入我的模块时Python会运行它,我该如何阻止?
我正在开发一个Python程序,可以通过两种方式运行:第一种是输入 python main.py
,这会友好地提示用户输入,然后将用户的输入传递给程序。第二种方式是输入 python batch.py -file-
,这样就会跳过友好的输入收集,直接一次性处理整个文件的输入。
问题是,当我运行 batch.py
时,它会从 main.py
导入一些变量、方法等,而当它运行这段代码:
import main
在程序的第一行,它会立即出错,因为它试图运行 main.py
中的代码。
我该如何阻止Python运行我导入的 main
模块中的代码呢?
12 个回答
21
使用 if __name__ == '__main__'
这个写法。__name__
是一个特殊的变量,当这个模块作为脚本运行时,它的值是 '__main__'
,而如果这个模块被导入到其他地方使用,它的值就是模块的名字。所以你可以这样写:
# imports
# class/function definitions
if __name__ == '__main__':
# code here will only run when you invoke 'python main.py'
87
因为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()
369
这是因为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()
不过,这确实需要对被导入的模块有一定的控制。