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

时间:2011-06-29 16:11:13

标签: python module python-import

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

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

import main

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

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

9 个答案:

答案 0 :(得分:200)

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

请参阅What is if __name__ == "__main__" for?

但是,它需要对import ed的模块进行源代码控制。

快乐的编码。

答案 1 :(得分:42)

由于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()

答案 2 :(得分:11)

使用if __name__ == '__main__'成语 - __name__是一个特殊变量,如果模块作为脚本运行,则值为'__main__',如果导入则为模块名称。所以你要做像

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

答案 3 :(得分:4)

不幸的是,你没有。这是导入语法如何工作的一部分,重要的是它这样做 - 记住def实际上是执行的东西,如果Python没有执行导入,那么你就会陷入困境而没有函数。 / p>

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

答案 4 :(得分:4)

将代码放在函数中,在调用函数之前它不会运行。你应该在main.py中有一个主要功能。声明:

if __name__ == '__main__':
  main()

然后,如果您致电python main.pymain()功能将会运行。如果您导入main.py,则不会。此外,为了清楚起见,您可能应该将main.py重命名为其他内容。

答案 5 :(得分:2)

您可以像这样编写“main.py”:

#!/usr/bin/env python

__all__=["somevar", "do_something"]

somevar=""

def do_something():
    pass #blahblah

if __name__=="__main__":
    do_something()

答案 6 :(得分:1)

有一个Python改进提案PEP 299旨在用if __name__ == '__main__':替换def __main__:成语,但它被拒绝了。在使用if __name__ = '__main__':时,了解要注意什么仍然是一个很好的阅读。

答案 7 :(得分:-1)

虽然在不运行代码的情况下无法使用import;您可以通过一种快速的方式输入变量;使用numpy.savez,它将变量存储为.npz文件中的numpy数组。之后,您可以使用numpy.load加载变量。

查看完整说明in the scipy documentation

请注意,这仅适用于变量和变量数组,而不适用于方法等。

答案 8 :(得分:-3)

尝试从main.py导入所需的功能?所以,

from main import SomeFunction

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