Das*_*tor 150 python module python-import
我有一个我正在构建的Python程序,它可以用以下两种方式之一运行:第一种是调用"python main.py",它以友好的方式提示用户输入,然后通过程序运行用户输入.另一种方法是调用"python batch.py -file- ",它将通过所有友好的输入收集并通过程序一次性运行整个文件的输入值.
问题是,当我运行"batch.py"时,它会从"main.py"导入一些变量/方法/ etc,并在运行此代码时:
import main
Run Code Online (Sandbox Code Playgroud)
在程序的第一行,它立即出错,因为它试图在"main.py"中运行代码.
如何阻止Python运行我正在导入的"main"模块中包含的代码?
小智 220
因为这是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()
Run Code Online (Sandbox Code Playgroud)
看什么是if __name__ == "__main__"
?
但是,它确实需要对正在import
编辑的模块进行源代码控制.
快乐的编码.
小智 46
由于Python的工作方式,它必须在导入模块时运行它们.
要防止模块中的代码在导入时执行,但只有在直接运行时才能执行,您可以使用以下命令保护它if
:
if __name__ == "__main__":
# this won't be run when imported
Run Code Online (Sandbox Code Playgroud)
您可能希望将此代码放在main()
方法中,以便您可以直接执行文件,也可以导入模块并调用main()
.例如,假设它在文件中foo.py
.
def main():
print "Hello World"
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
该程序可以通过go python foo.py
或其他Python脚本运行:
import foo
...
foo.main()
Run Code Online (Sandbox Code Playgroud)
Ism*_*awi 12
使用if __name__ == '__main__'
idiom - __name__
是一个特殊变量,其值是'__main__'
模块作为脚本运行,以及模块名称(如果已导入).所以你会做类似的事情
# imports
# class/function definitions
if __name__ == '__main__':
# code here will only run when you invoke 'python main.py'
Run Code Online (Sandbox Code Playgroud)
不幸的是,你没有。这是导入语法工作方式的一部分,重要的是它这样做——记住def
实际上是执行的东西,如果Python没有执行导入,你就会被困在没有函数的情况下。
不过,由于您可能有权访问该文件,因此您也许可以查看导致错误的原因。可以修改您的环境来防止错误发生。
小智 5
将代码放入函数中,直到调用该函数后它才会运行。你的main.py
. 与声明:
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
然后,如果您调用python main.py
该main()
函数就会运行。如果导入main.py
,则不会。main.py
另外,为了清楚起见,您可能应该重命名为其他名称。
归档时间: |
|
查看次数: |
126490 次 |
最近记录: |