exec() python 命令停止整个执行

exec() python command stops the whole execution

我正在尝试 运行 一个按顺序更改配置文件中某些参数的脚本 (MET_config_EEv40.cfg) 和 运行 一个检索这些参数的脚本 ('IS_MET_EEv40_RAW.py')新配置参数:

config_filename = os.getcwd() + '/MET_config_EEv40.cfg'

import sys
parser = configparser.ConfigParser()
parser.read('MET_config_EEv40.cfg')
parser.set('RAW', 'product', 'ERA')
parser.set('RAW', 'gee_product', 'ECMWF/ERA5_LAND/HOURLY')
parser.set('RAW', 'indicator', 'PRCP')
parser.set('RAW', 'resolution', '11110')


with open('MET_config_EEv40.cfg', 'w') as configfile:
    parser.write(configfile)

## execute file
import sys

os.system(exec(open('IS_MET_EEv40_RAW.py').read()))
#exec(open('IS_MET_EEv40_RAW.py').read())

print('I am here')

这次执行后,我得到了预期的脚本输出:

Period of Reference: 2005 - 2019
Area of Interest: /InfoSequia/GIS/ink/shp_basin_wgs84.shp
Raw data is up to date. No new dates available in raw data
Press any key to continue . . .

但它从不打印结束行:I am here,这意味着在脚本执行后,算法终止。那不是我想要它做的,因为我希望能够更改一些其他配置参数并再次 运行 脚本。

显示该输出是因为这行代码:

if (delta.days<=1):
    sys.exit('Raw data is up to date. No new dates available in raw data')

那么 sys.exit 可能会结束这两个进程吗?有什么想法可以在代码中替换 sys.exit() 来避免这种情况吗?

Im executing this file from a .bat file that contains the following:

@echo OFF

docker exec container python MET/PRCPmain.py

pause

exec(source, globals=None, locals=None, /) 确实

Execute the given source in the context of globals and locals.

所以

import sys
exec("sys.exit(0)")
print("after")

等同于写

import sys
sys.exit(0)
print("after")

显然终止并且不打印 afterexec 具有可选参数 globals,您可以使用它来提供 sys 的替代方案,例如

class MySys:
    def exit(self, *args):
        pass
exec("sys.exit(0)",{"sys":MySys()})
print("after")

哪个输出

after

因为它确实使用了 MySys 实例中的 exit。如果您的代码使用 sys 中的其他东西并希望它正常工作,您需要方法模仿 MySys class

中的 sys 函数