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

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

import main

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

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


当前回答

使用if __name__ == '__main__'习惯用法——__name__是一个特殊变量,如果模块作为脚本运行,其值为'__main__',如果模块被导入,则为模块名。所以你会这样做

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

其他回答

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

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

Another option is to use a binary environment variable, e.g. lets call it 'run_code'. If run_code = 0 (False) structure main.py to bypass the code (but the temporarily bypassed function will still be imported as a module). Later when you are ready to use the imported function (now a module) set the environment variable run_code = 1 (True). Use the os.environ command to set and retrieve the binary variable, but be sure to convert it to an integer when retrieving (or restructure the if statement to read a string value),

在main.py:

import os

#set environment variable to 0 (False):
os.environ['run_code'] = '0'


def binary_module():
    #retrieve environment variable, convert to integer
    run_code_val = int(os.environ['run_code'] )
    
    if run_code_val  == 0:
        print('nope. not doing it.')
    if run_code_val == 1:
        print('executing code...')
        # [do something]

...在任何加载main.py的脚本中:

import os,main

main.binary_module() 

输出:不。不做。

# now flip the on switch!
os.environ['run_code'] = '1'
main.binary_module()

输出:执行代码…

*注意:上面的代码假设main.py和任何导入它的脚本存在于同一个目录中。

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

from main import SomeFunction

可能是你在batch.py中命名的函数与main.py中的函数相同,当你导入main.py时,程序运行main.py函数而不是batch.py函数;执行上述操作可以解决这个问题。我希望。

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

在scipy文档中可以看到完整的描述

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

我做了一个简单的测试:

# test.py

x = 1
print("1, has it been executed?")


def t1():
     print("hello")
     print("2, has it been executed?")


def t2():
     print("world")
     print("3, has it been executed?")


def main():
     print("Hello World")
     print("4, has it been executed?")


print("5, has it been executed?")
print(x)

# while True:
# t2()

if x == 1:
     print("6, has it been executed?")

# test2.py

import test

当执行或运行test2.py时,运行结果:

1, has it been executed?

5, has it been executed?

1

6, has it been executed?

结论:当导入的模块没有添加if __name__=="__main__":时,当前模块将运行,导入模块中不在函数中的代码将按顺序执行,而函数中未调用的代码将不执行。

此外:

def main():
    # Put all your code you need to execute directly when this script run directly.
    pass

if __name__ == '__main__':
    main() 
else:
    # Put functions you need to be executed only whenever imported