Ich möchte einen automatischen Update-Mechanismus für meine PYQT PyInstaller-Anwendung erstellen. Das Installationsprogramm installiert dann eine neue Version meines Programms, wonach es automatisch starten sollte. Anstatt zu starten, schlägt mein Programm jedoch mit dem Fehler "Python dll 'C: \ Benutzer \ Benutzer \ appdata \ local \ temp_mei278082 \ python3.10. geschlossen. Mit der neuen Version < /li>
Wenn MyProg beginnt, versucht es, auf '_MEI123' zuzugreifen, was nicht mehr vorhanden ist. Wenn Sie das Installationsprogramm manuell ausführen, wird mein Programm nach der Installation ohne Fehler automatisch ausgeführt.
Code: Select all
subprocess.Popen(['cmd.exe', '/c', fr'{installer_path} /silent && {exe_path}'], creationflags=0x00000008 | 0x00000200)
< /code>
Beide Optionen haben einen Fehler zurückgegeben.start /wait "C:\Users\user\myProg_setup.exe" /silent && "C:\Users\user\myProg.exe"
Es gibt auch keine Fehler. Die einzige Lösung, die funktioniert hat, besteht darin, die Datei mit einem anderen Namen zu installieren. Diese Option ist jedoch nicht ideal für mich.
Code: Select all
import subprocess
import sys
from PyQt5.QtWidgets import QApplication, QPushButton
def update(): #path to same exe
subprocess.Popen(["cmd.exe", "/c", r"timeout /t 2 && C:\pytest\dist\main.exe"], creationflags=0x00000008 | 0x00000200, close_fds = True)
app.quit()
app = QApplication(sys.argv)
button = QPushButton('Click me!')
button.clicked.connect(update)
button.show()
sys.exit(app.exec_())
< /code>
Erstellen Sie es mit
pyinstaller .\main.py --onefile --noconsole
main.exe und drücken Sie die Taste
Die von mir erwähnten temporären Dateien sind der Python -Interpreter, der implizit erstellt wird. Gleiches Programm. < /p>
In der Tat kann die Popen -Funktion auch bei Flags keine vollständig isolierte Instanz aus dem übergeordneten Prozess erstellen. Die Instanz meines Programms, das in Popen ausgeführt wird, ist der Ansicht, dass die übergeordnete Instanz des Programms noch aktiv ist und versucht, auf den Dolmetscher des übergeordneten Programms zuzugreifen. Zu diesem Zeitpunkt wurde der Dolmetscher jedoch bereits geschlossen. Dies ist nur eine Hypothese von meiner Seite, und ich kann mich irren.