【发布时间】:2022-01-24 09:57:32
【问题描述】:
我有两个 python 文件:script.py 和 counting.py。
counting.py
from time import sleep
try:
for n in range(1, 10):
print('counting', n)
sleep(1)
except Exception as e:
print('program terminated with exception', e)
else:
print('program ended')
finally:
sleep(4)
print('this is the finally block')
script.py
import sys
import pathlib
import subprocess
import signal
on_windows = True if sys.platform == 'win32' else False
on_linux = True if sys.platform == 'linux' else False
if on_windows:
process = subprocess.Popen(
['python', 'counting.py'],
cwd=pathlib.Path(__file__).parent.resolve(),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP,
)
elif on_linux:
process = subprocess.Popen(
['python', 'counting.py'],
cwd=pathlib.Path(__file__).parent.resolve(),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
preexec_fn=os.setsid,
)
try:
out, err = process.communicate(timeout=4)
print(out, err)
except subprocess.TimeoutExpired:
if on_windows:
process.send_signal(signal.CTRL_BREAK_EVENT)
process.kill()
elif on_linux:
os.killpg(process.pid, signal.SIGTERM)
print('time out')
当我运行script.py 时,输出是:
time out
Process returned 0 (0x0) execution time : 4.778 s
如何终止process,并在counting.py 文件中输入finally 块?
附注
当我在终端中运行counting.py 时,程序在键盘上的CTRL+C 之后进入finally 块:
>>python counting.py
counting 1
counting 2
counting 3
this is the finally block
Traceback (most recent call last):
File "counting.py", line 6, in <module>
sleep(1)
KeyboardInterrupt
^C
>>
如何使用subprocess 模块并杀死子进程来实现这一点?
以上代码我已经在Windows(Windows 10)和Linux(CentOS 8)中测试过了。
【问题讨论】:
-
我不知道它是否有帮助,但
break关键字会停止你的循环。只需在空行中输入即可。 -
True if x else False只是bool(x)(它本身有时只是x)。
标签: python operating-system try-catch terminate