Python, запустите программу .py и завершите предыдущую программу

Я хотел бы запустить программу python из другой программы python и одновременно выйти из предыдущей программы.

Вот что я сделал:

if(self.start_button.pression==1):
        os.system('python program_to_launch.py')
        sys.exit()

Результат вполне очевиден, программа запускает «program_to_launch.py» и ждет, пока она не завершится.

Проблема кроется в цикле while внутри только что запущенной программы. Он сделан на неопределенное время.

Вот проблема; предыдущая программа все еще ожидает окончания новой программы, и она не будет выполнять sys.exit()

Я мог убить первую программу, используя`

ПРИМЕЧАНИЯ:

Следуя методу, предоставленному этим ответом, я не могу импортировать программу для запуска, потому что я хочу завершить первую программу

import program_to_launch 

Так что я думаю, что это не решение. И команда exec file()

execfile('program_to_launch.py')

как предлагается в связанном ответе, возникают проблемы с импортом нескольких модулей при выполнении program_to_launch.py.


person Ziru93    schedule 06.04.2017    source источник


Ответы (3)


Допустим, у меня есть следующий файл (с именем Maintenance.py), который я хочу запустить, и сразу же после этого завершить приложение:

import wx

myApp = wx.App()
dial = wx.MessageDialog(None, f"This program is temporarily down for maintenance.\nWe will do our best to get it running again.\nThank you for your patience.", "Error", wx.OK|wx.ICON_ERROR)
dial.ShowModal()

Используйте модуль подпроцесса

Это будет предпочтительным методом. Просто вызовите его с помощью команды Popen.

import sys
import subprocess
subprocess.Popen(["py", "maintenance.py"])
sys.exit()

Для получения дополнительной информации см.: https://docs.python.org/3.6/library/subprocess.html#popen-constructor

Используйте ярлык

Если у вас не работает подпроцесс, вы можете создать ярлык и запустить его с помощью os.startfile. Например, ярлык с именем myShortcut.lnk, который имеет следующую цель: C:\Windows\py.exe C:\Users\kblad\Desktop\maintenance.py, будет работать для следующего кода:

import os
import sys
os.startfile("myShortcut")
sys.exit()

Для получения дополнительной информации см.: https://docs.python.org/3.6/library/os.html#os.startfile

person Kade    schedule 17.12.2018
comment
Спасибо. Это устранило множество проблем. Я не знаю, для чего нужен синтаксис списка, но я просто использовал subprocess.Popen(path), и он прекрасно работал. - person Ruben; 21.08.2020
comment
Вы можете предоставить список того, что вы наберете в окне cmd, или просто строку. Связанные документы в приведенном выше ответе объясняют это более подробно. В конце концов, просто используйте то, что имеет для вас больше смысла. :) - person Kade; 25.08.2020

Я думаю, вы можете просто запустить программу в новом потоке или процессе:

from os import system
from threading import Thread
from sys import exit

if self.start_button.pression == 1:
    thread = Thread()
    thread.run = lambda: system('python program_to_launch.py')
    thread.start()

    exit()
person seenorth    schedule 07.04.2017
comment
К сожалению, предыдущая программа остается открытой и замороженной, я использовал функцию print('bookmark'), чтобы увидеть, куда программа попадает при выполнении, она появляется перед функцией exit(). По крайней мере, когда я закрываю вторую программу, первая программа тоже закрывает ее. - person Ziru93; 07.04.2017
comment
Вместо os.system попробуйте subprocess.Popen. Он должен работать даже без резьбы - person seenorth; 07.04.2017
comment
p2 = subprocess.Popen("/Users/johndoe/Desktop /PythonEXp/program_to_launch.py") Таким образом, я нашел много проблем, во-первых, я должен указать путь (сам по себе это не проблема, но код стал менее динамичным), а во-вторых, это вызывает у меня некоторые проблемы с авторизацией. OSError: [Errno 13] Permission denied - person Ziru93; 07.04.2017
comment
Обратите внимание, я также пробовал p2 = subprocess.Popen("program_to_launch.py -p"), но он не находит программу - person Ziru93; 07.04.2017
comment
Popen('C:/Python36-32/python.exe D:/Making/Python/random scripts/conways_game_short_glider.py') Это сработало для меня. Я использовал абсолютный путь. По этому поводу уже есть вопросы: stackoverflow.com/q/21412610/7062162 - person seenorth; 07.04.2017

Я искал способ перезагрузить свой собственный скрипт Python и наткнулся на эту статью: https://blog.petrzemek.net/2014/03/23/restarting-a-python-script-within-itself/

Я не совсем понял, откуда взялась вещь ['python'], но после прочтения документации по python для OS.exec* я наткнулся на это:

первый из этих аргументов передается новой программе как ее собственное имя, а не как аргумент, который пользователь может ввести в командной строке. Для программиста на C это argv[0], передаваемый функции main() программы. Например, os.execv('/bin/echo', ['foo', 'bar']) будет печатать только строку на стандартном выводе; foo будет игнорироваться.

https://docs.python.org/2/library/os.html Раздел 15.1.5

Это может сработать для вас, поскольку кажется, что он заменяет исходный процесс?

person Richard Cintorino    schedule 17.03.2018