【问题标题】:How to Terminate a Python program before its child is finished running?如何在子程序完成运行之前终止 Python 程序?
【发布时间】:2017-08-31 17:06:24
【问题描述】:

我有一个脚本应该 24/7 运行,除非被中断。这个脚本是脚本 A。 我希望脚本 A 调用脚本 B,并在 B 运行时让脚本 A 退出。这可能吗? 这是我认为可行的方法

#script_A.py
while(1)
    do some stuff
    do even more stuff
    if true:
        os.system("python script_B.py")
        sys.exit(0)


#script_B.py
time.sleep(some_time)
do something
os.system("python script_A.py")
sys.exit(0)

但似乎 A 直到 B 完成执行才真正退出(这不是我想要发生的)。 有没有其他方法可以做到这一点?

【问题讨论】:

  • 尝试使用os.system("python script_B.py &")在后台启动你的B脚本。
  • os.system 是同步的。

标签: python python-3.x terminate os.system


【解决方案1】:

您似乎想将系统调用分离到另一个线程。

script_A.py

import subprocess
import sys

while(1)
    do some stuff
    do even more stuff
    if true:
        pid = subprocess.Popen([sys.executable, "python script_B.py"]) # call subprocess
        sys.exit(0)

无论如何,这似乎根本不是一个好习惯。为什么不尝试脚本 A 监听进程堆栈,如果它发现脚本 B 正在运行然后停止。这是另一个例子。

import subprocess
import sys
import psutil

while(1)
    #This sections queries the current processes running
    for proc in psutil.process_iter():
        pinfo = proc.as_dict(attrs=['pid', 'name'])
        if pinfo[ 'name' ] == "script_B.py":
            sys.exit(0)
   
    do some stuff
    do even more stuff
    if true:
        pid = subprocess.Popen([sys.executable, "python script_B.py"]) # call subprocess
        sys.exit(0)

【讨论】:

    【解决方案2】:

    您所描述的内容听起来很像函数调用:

    def doScriptB():
      # do some stuff
      # do some more stuff
    
    def doScriptA():
      while True:
        # do some stuff
        if Your Condition:
          doScriptB()
          return
    
    while True:
      doScriptA()
    

    如果这对您来说还不够,那么您必须将该进程与您的 python 进程分离。这通常涉及在后台生成进程,这是通过在 bash 中的命令后附加一个 & 符号来完成的:

    yes 'This is a background process' &
    

    然后将所述进程从当前 shell 中分离出来,这在一个简单的 C 程序中是通过两次分叉进程来完成的。我不知道如何在 python 中做到这一点,但我敢打赌,这有一个模块。

    这样,当调用 python 进程退出时,它不会终止生成的子进程,因为它现在是独立的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2012-05-20
      • 2015-02-11
      • 2016-01-12
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多