如何在python中停止另一个已经运行的脚本?

Fab*_*Job 2 python import os.system

有一种方法可以通过执行以下操作在python中启动另一个脚本:

import os

os.system("python [name of script].py")
Run Code Online (Sandbox Code Playgroud)

那么如何停止另一个已经运行的脚本?我想通过使用名称来停止脚本。

mha*_*wke 5

通常,先导入其他脚本,然后调用其功能和方法。

如果这对您不起作用,例如,另一个脚本的编写方式不适合导入,则可以使用该subprocess模块启动另一个进程。

import subprocess

p = subprocess.Popen(['python', 'script.py', 'arg1', 'arg2'])
# continue with your code then terminate the child
p.terminate()
Run Code Online (Sandbox Code Playgroud)

有很多可能的方法来控制子进程并与子进程进行交互,例如,您可以捕获其stdout和sterr,然后将其发送给输入。请参阅Popen()文档。


Pad*_*ham 5

如果您按照 mhawkes 建议启动脚本,这是一个更好的选择,但要回答如何按名称杀死已启动脚本的问题,您可以使用pkillsubprocess.check_call

from subprocess import check_call
import sys

script = sys.argv[1]


check_call(["pkill", "-9", "-f", script])
Run Code Online (Sandbox Code Playgroud)

只需传递名称即可杀死:

padraic@home:~$ cat kill.py
from subprocess import check_call
import sys

script = sys.argv[1]


check_call(["pkill", "-9", "-f", script])


padraic@home:~$ cat test.py
from time import sleep

while True:
   sleep(1)
padraic@home:~$ python test.py &
[60] 23361
padraic@home:~$ python kill.py test.py
[60]   Killed             python test.py
Killed
Run Code Online (Sandbox Code Playgroud)

SIGKIll如果你想终止删除 -9,则使用 终止进程:

padraic@home:~$ cat kill.py
from subprocess import check_call
import sys

script = sys.argv[1]

check_call(["pkill", "-f", script])


padraic@home:~$ python test.py &
[61] 24062
padraic@home:~$ python kill.py test.py 
[61]   Terminated              python test.py
Terminated
Run Code Online (Sandbox Code Playgroud)

那将发送一个SIGTERM. 终止信号