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

为什么Python在导入模块时运行我的模块,以及如何停止它?,python,module,python-import,Python,Module,Python Import,我正在构建一个Python程序,它可以以两种方式运行:第一种是调用“Python main.py”,它以友好的方式提示用户输入,然后通过程序运行用户输入。另一种方法是调用“python batch.py-file-”,它将传递所有友好的输入收集,并通过程序一次性运行整个文件的输入 问题是,当我运行“batch.py”时,它会从“main.py”导入一些变量/方法/etc,当它运行以下代码时: import main 在程序的第一行,它会立即出错,因为它试图在“main.py”中运行代码 如何阻

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

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

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


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

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


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

如果模块作为脚本运行,则使用
if
惯用语--
\uuu name
是一个特殊变量,其值为
''if
,如果模块作为脚本运行,则使用模块名称。所以你会这样做

# 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()

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

但是,它确实需要对导入的模块进行源代码控制


愉快的编码。

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

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

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

尝试从main.py导入所需的函数?所以

from main import SomeFunction

可能是您将batch.py中的函数命名为main.py中的函数,并且当您导入main.py时,程序运行main.py函数而不是batch.py函数;这样做应该可以解决这个问题。我希望。

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

if __name__ == '__main__':
  main()

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

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

请参阅完整描述


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

有一个Python增强建议,旨在替换
,如果uuu name\uuuu='\uu main\uuu':
习惯用法为
def\uu main:
,但被拒绝。了解使用
时要记住什么仍然是一本不错的读物,如果_uname _='_umain uu':

注意:如果无法修改环境以防止错误发生,可能至少应该在Windows上使用不同的模块,不会。导入main
不会将main中的所有内容导入当前命名空间。它只在当前名称空间中添加一个
main
符号,因此不会发生冲突。请确认,您的注释“stuff only to run when not called via'import'here”暗示了要在main()下编写的命令,对吗?或者也没关系???@Goldname导入时,if语句中的代码不会运行,但主函数本身已经定义,即使通过导入也可以使用。这个模块在运行时只执行main函数,而在导入时不执行它。这完全取决于你想做什么。如果您不需要main中的其他命令,请务必将它们写入If中。但对我来说,它看起来更整洁。