Skocz do zawartości

Zamknięcie procesu jednej aplikacji przed uruchomieniem drugiej aplikacji


Pomocna odpowiedź

Napisano

W jaki sposób po otwarciu aplikacji yyy.py płynnie ją zamknąć i przejść do aplikacji aaa.py?

Aktualnie otwiera się aplikacja yyy.py ale po zakończeniu działań całość się zawiesza. cały czas jest jakby"klikniety " przycisk który uruchomił def xxx():

def xxx():

if os.path.exist(yyy.py):

os.system(python yyy.py)



else:

message.showerror(zzzzzzzzzzzzzzzz)



if os.path.exist(aaa.py):

os.system(python aaa.py)



else:

message.showerror(zzzzzzzzzzzzzzzz)

 

Nazwy plików „yyy” i „aaa” pochodzą z inputboxa bieżącego skryptu.

Po pierwsze nie używaj system tylko zapoznaj się z subprocess. Po drugie zapoznaj się z os.execl (i całą  rodzinką) która służy dokładnie do tego co chcesz - zastępuje bieżący proces nowym.

  • Lubię! 2

Dziękuje za wskazówki do os.execl. 

na temat os. execl nie ma  dużo przykładów w sieci ale natknąłem się na ten kod:

 

import subprocess

a = subprocess.Popen(['...'])

b = subprocess.Popen(['...'])


# wait for the first process to finish
watched_pids = set(proc.pid for proc in (a, b))
while True:
    pid, _ = os.wait()
    if pid in watched_pids:
        break

Prawdopodobnie wykonuje to co mnie interesuje.

Niestety w moim przykładzie mam dodatkowe warunki i prawdopodobnie robię gdzieś błąd bo drugi proces nie czeka na pierwszy ( chyba, że jeszcze cos innego wchodzi w grę.

Poniżej jest kod (zaznaczam, że jestem poczatkujący w tym temacie)który próbuje użyć ale drugi proces nie czeka na pierwszy.

 

import subprocess

def xxx()

if os.path.exist(yyy.py):

a = subprocess.Popen([yyy.py])

else: message.showerror(zzzzzzzzzzzzzzzz)



if os.path.exist(aaa.py):

b = subprocess.Popen([aaa.py])

else: message.showerror(zzzzzzzzzzzzzzzz)


# wait for the first process to finish
watched_pids = set(proc.pid for proc in (a, b))
while True:
    pid, _ = os.wait()
    if pid in watched_pids:
        break

 

Z góry dziękuje za wskazanie błędów.

czy użycie: 

os.execl(sys.executable, "python", yyy.py)

  poprawiłoby funkcjonalność?

 

 

 

 

 

execl po prostu kończy bieżący proces i zastępuje go tym co ma podane. Zamiast zabawy w subprocess.Popen (zdaje się że nie do końca to rozumiesz) możesz zastosować subprocess.call lub subprocess.check_call, to takie więcej nowoczesne odpowiedniki os.system().

  • Lubię! 2

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...