Ik heb een exe-bestand gemaakt van mijn python-project door py2exe die een aantal bestanden heeft.
wanneer ik dit exe-bestand in mijn systeem uitvoer. het werkt prima, maar als ik het in een ander systeem plaats, wordt het aanmeldingsformulier geopend en daarna gaat het niet naar het volgende venster dat ik in het 2e python-bestand heb geschreven. het geeft me onderstaande fout in het logbestand.
Traceback (most recent call last):
File "login.py", line 246, in DataReader
File "subprocess.pyo", line 711, in __init__
File "subprocess.pyo", line 948, in _execute_child
WindowsError: [Error 2] The system cannot find the file specified
Ik weet dat het een dubbele vraag is, maar ik heb veel oplossingen voor stackoverflow geprobeerd, maar ik heb dit probleem niet opgelost. Iemand helpt me om dit probleem op te lossen.
En na succesvol inloggen zal het met deze code naar het start.py-bestand gaan, maar het gaat niet en geeft bovenstaande fout.
subprocess.call(["python", "./start.py"])
Bij voorbaat dank
Antwoord 1, autoriteit 100%
Er zijn hier minstens twee problemen.
Ten eerste kun je python
niet zomaar als het uitvoerbare bestand gebruiken.
Op je systeem heb je python
op de %PATH%
, en het is de juistePython-versie, met alle modules u bent afhankelijk van, enz. Maar u kunt daar niet op vertrouwen voor al uw gebruikers. Als je dat zou kunnen, zou je in de eerste plaats geen moeite doen met py2exe
.
En natuurlijk, op de andere machine waarop je test, staat er helemaal niets met de naam python
op de %PATH%
, dus je krijgt een WindowsError 2.
Je wilt in ieder geval werken met de dezelfdePython die je script gebruikt.
Ondertussen is er geen reden om te verwachten dat start.py
zich in de huidige werkmap bevindt. Het bevindt zich (hopelijk) in dezelfde map als het bovenliggende script, maar dat zal niet de werkmap zijn. Gewoonlijk start een Windows-programma op met iets als C:\ of de WINNT-directory of de homedirectory van de gebruiker, en dit verschilt van versie tot versie.
Natuurlijk gebruik je tijdens de ontwikkeling de opdrachtprompt, met de directory van het script als je werkdirectory wanneer je het script uitvoert, of je gebruikt een IDE die in feite hetzelfde doet. Het werkt dus toevallig. Maar als je het uitvoert vanuit de .exe, kun je daar niet op rekenen.
(Deze zal nog leuker zijn om te debuggen. Het subproces zal succesvol starten en onmiddellijk eindigen, zonder iets zichtbaars te doen. Je bovenliggende script zal geen idee hebben dat er iets mis is gegaan, omdat je de afsluitcode niet controleert of de stderr, wat het debuggen erg leuk maakt. Je zou eigenlijk check_call
moeten gebruiken, niet call
.)
Hoe dan ook, als je wilt dat je script een ander script vindt dat zich in dezelfde map als zichzelf bevindt, moet je dit expliciet zeggen.
Dus om beide problemen op te lossen:
import os
import sys
mypath = os.path.abspath(__file__)
mydir = os.path.dirname(mypath)
start = os.path.join(mydir, "start.py")
subprocess.call([sys.executable, start])
Nog een laatste ding: van uw opmerkingen, ik weet niet eens zeker of u daadwerkelijk bedraagt start.py
in uw uitkeerbare pakket. Op je machine, waar het werkt, is het blijkbaar in C:\Python27\start.py
. Maar op de machine die je test op … & nbsp; bestaat het ergens? Zo niet, dan kan u het natuurlijk niet uitvoeren.
Hulpmiddelen zoals py2exe
kan automatisch afhankelijkheden vinden die u import
, maar als u gewoon een script uitvoert in een andere tolkinstantie via subprocess
, je zult het moeten vertellen (in je setup.py
) om dat script op te nemen.