为什么Python在导入模块时运行我的模块,以及如何停止它?
我正在构建一个Python程序,它可以以两种方式运行:第一种是调用“Python main.py”,它以友好的方式提示用户输入,然后通过程序运行用户输入。另一种方法是调用“python batch.py-file-”,它将传递所有友好的输入收集,并通过程序一次性运行整个文件的输入 问题是,当我运行“batch.py”时,它会从“main.py”导入一些变量/方法/etc,当它运行以下代码时:为什么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”中运行代码 如何阻
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中。但对我来说,它看起来更整洁。