【问题标题】:How to stop another already running script in python?如何在 python 中停止另一个已经运行的脚本?
【发布时间】:2016-04-17 12:00:48
【问题描述】:

有一种方法可以通过这样做在 python 中启动另一个脚本:

import os

os.system("python [name of script].py")

那么我怎样才能停止另一个已经在运行的脚本呢?我想通过使用名称来停止脚本。

【问题讨论】:

  • 您可以使用 pid 或名称杀死脚本,您可以添加更多上下文吗?
  • @PadraicCunningham 我想停止使用这个名字
  • 你使用的是什么操作系统?
  • @PadraicCunningham 我在 Raspberry Pi 上运行脚本,我试图停止的脚本是我自己编写的。
  • 运行 pkill -9 -f script.py 会杀死脚本

标签: python import os.system


【解决方案1】:

通常导入另一个脚本,然后调用它的函数和方法。

如果这对您不起作用,例如其他脚本没有写成有利于被导入的方式,那么可以使用subprocess模块启动另一个进程。

import subprocess

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

有许多可能的方式来控制子进程并与之交互,例如您可以捕获其标准输出和标准输出,并将其发送输入。请参阅Popen() 文档。

【讨论】:

    【解决方案2】:

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

    from subprocess import check_call
    import sys
    
    script = sys.argv[1]
    
    
    check_call(["pkill", "-9", "-f", script])
    

    只要传名字就可以杀了:

    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
    

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

    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
    

    这将发送一个SIGTERMTermination-Signals

    【讨论】:

    • 嗨@Padraic Cunningham,你的脚本对我来说效果很好。但是,当我尝试对其进行一些调整时(将 sys.argv[1] 替换为我的脚本的路径 --> 'home/pi/MotionDetector.py'),它抛出了一个错误:" CalledProcessError: Command '['pkill ', '-9', '-f', '/home/pi/MotionDetector.py']' 返回非零退出状态 1" 你能帮忙吗?
    【解决方案3】:

    只需输入程序的名称而不是脚本的路径。 所以会是

    check_call(["pkill", "-f", "MotionDetector.py"])
    

    【讨论】:

      最近更新 更多