【发布时间】:2017-04-12 22:20:22
【问题描述】:
我有一个名为myMain.py 的简单python 脚本可以自动执行另一个带有增量编号的python 程序,并且我在CentOS 7 上运行它:
#!/usr/bin/python
import os
import sys
import time
def main():
step_indicator = ""
arrow = ">"
step = 2
try:
for i in range(0,360, step):
step_percentage = float(i)/360.0 * 100
if i % 10 == 0:
step_indicator += "="
os.system("python myParsePDB.py -i BP1.pdb -c 1 -s %s" % step)
print("step_percentage%s%s%.2f" % (step_indicator,arrow,step_percentage)+"%")
except KeyboardInterrupt:
print("Stop me!")
sys.exit(0)
if __name__ == "__main__":
main()
目前我只知道这个脚本是单线程安全的,但我不能用Ctrl+C 键盘中断来终止它。
我已经阅读了一些相关问题:例如Cannot kill Python script with Ctrl-C 和Stopping python using ctrl+c 我意识到Ctrl+Z 不会杀死进程,它只会暂停进程并将进程保持在后台。 Ctrl+Break 也适用于我的情况,我认为它只会终止我的主线程但保留子进程。
我还注意到调用os.system() 会从当前执行的进程中产生一个子进程。同时,我还有os 文件I/O 函数和os.system("rm -rf legacy/*") 将在myParsePDB.py 中被调用,这意味着这个myParsePDB.py 子进程也会产生子进程。然后,如果我想在myMain.py 中捕获Ctrl+C,我应该只守护myMain.py 还是应该在每个进程产生时守护它们?
【问题讨论】:
-
是否有必要在子进程中运行
myParsePDB?难道你不能把它写成一个普通的模块,你可以从这个脚本调用而不是使用os.system吗?您应该能够使用shutil.rmtree实现rm功能 -
@TadhgMcDonald-Jensen 必须运行
myParsePDB。rm只是myParsePDB的一小部分。
标签: python asynchronous scripting operating-system signal-handling