Как завершить работу программы Python до того, как ее дочерняя программа будет завершена?


У меня есть скрипт, который должен работать 24/7, если его не прервать. Этот сценарий-сценарий А. Я хочу, чтобы скрипт для вызова сценария B и сценарий выхода хотя б работает. Возможно ли это? Это то, что я думал, будет работать

#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 не закончит выполнение (что не то, что я хочу, чтобы произошло). Есть ли другой способ сделать это?

2 2

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' &

И отсоединение указанного процесса от текущей оболочки, что в простой программе на языке Си выполняется путем раздвоения процесса дважды. Я не знаю, как это сделать в python, но готов поспорить, что для этого есть модуль.

Таким образом, когда вызывающий процесс python завершает работу, он не завершает порожденный потомок, так как теперь он независим.

Похоже, вы хотите отсоединить системный вызов к другому потоку.

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)