Как завершить работу программы 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 ответа:
То, что вы описываете, очень похоже на вызов функции:
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)