115129
Goto Top

Py2exe - Pyton-Script in .exe wandeln mit Übergabe eines Arguments

Hallo zusammen,

ich nutze py2exe um einen bestehenden Python-Source-Code in Windows ausführbar zu machen.

Generell funktioniert mein Vorhaben, die Setup.exe wird ohne jegliche Fehler durch py2exe erzeugt.
Nun aber möchte ich dem Python-Script ein Argument mit übergeben, welches z.B. ein bestimmter Modus innerhalb des Skripts startet.

Mein Python-Script heißt: Script.py
Die zu erzeugende .exe soll lauten: Setup.exe

Führe ich wie folgt das "Script.py" über die Eingabeaufforderung aus, funktioniert alles wie es soll:
c:\python27\Python Script.py PM

Mit py2exe wird zwar die gewünschte Setup.exe erzeugt, jedoch ohne Argument (in diesem Beispiel PM).

from distutils.core import Setup
import py2exe
 
Setup(windows=['Script.py'])  

Wie bzw. was müsste ergänzt werden?

Vielen Dank für alle Hilfestellungen.

Gruß,
Blattlaus

Content-ID: 292554

Url: https://administrator.de/contentid/292554

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

colinardo
colinardo 09.01.2016 aktualisiert um 17:39:58 Uhr
Goto Top
Hallo Blattlaus,
schreibe statt
Setup(windows=['Script.py'])
folgendes:
Setup(console=['Script.py'])
dann wird draus eine Console-App welcher du wie üblich die Parameter mitgeben kannst und so darauf zugreifst.
import sys
for arg in sys.argv:
    print (arg)
Grüße Uwe
Gersen
Gersen 09.01.2016 aktualisiert um 16:33:42 Uhr
Goto Top
Hallo,

für die Frage der Auswertung eines Aufrufs-Arguments ist m.E. die Frage "windows/console" unerheblich - sie müsste in jedem Falle passieren (bloß dass man es im Beispiel des Kollegen @colinardo in der Konsole nicht sieht face-wink). Anderes Beispiel:
import sys
if len(sys.argv) > 1:
    f = open('parameters.txt', 'w')
    f.write(sys.argv[1])
    f.close()
(Wird die daraus erzeugte EXE mit Argument aufgerufen, wird dieses in eine Datei "parameters.txt" geschrieben.)

Hast Du allerdings den Plan (das geht aus der Frage nicht recht hervor), ein Python-Skript (das Parameter auswertet) in eine EXE-Datei umzuwandeln, die (ohne Parameter aufgerufen) das Skript (mit Parameter) ausführt, ist der Compiler vermutlich die falsche Stelle, das zu implementieren. Dazu könntest Du evtl. im Skript ein Konstrukt aus argparse mit "default"-Schalter verwenden. Etwa
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('a', nargs='?', type=str, default='PM')
args = parser.parse_args()
f = open('parameters.txt', 'w')
f.write(args.a)
f.close()
(Die daraud erzeugte EXE würde -mit Argument aufgerufen- dieses in die Datei "parameters.txt" schreiben; ohne Argumente schreibt es "PM" in die Datei.)

Gruß,
Gersen
colinardo
colinardo 09.01.2016 aktualisiert um 17:22:03 Uhr
Goto Top
bloß dass man es im Beispiel des Kollegen @colinardo in der Konsole nicht sieht
Doch sieht man face-smile wenn man die exe in der Konsole den Parameter übergibt. War ja auch nur ein simples Beispiel für die Ausgabe der Parameter und dem Test das es damit funktioniert.

Grüße Uwe
115129
115129 09.01.2016 aktualisiert um 22:00:36 Uhr
Goto Top
Hallo ihr beiden,

vielen Dank für Eure Hilfe face-smile

Ich sollte nochmals mein Vorhaben detailierter beschreiben, habe das Gefühl nicht richtig verstanden geworden zu sein:

Habe ein Pyton-Script (Script.py), welches nur gestartet wird wenn ein Argument mit übergeben wird (insgesamt 4 stehen zur Auswahl). Diese Argumente sind im Script vordefiniert.
Wird das Script mit Argument (in diesem Fall PM) über die Eingabeaufforderung gestartet, funktioniert alles wie es soll.
c:\python27\Python Script.py PM

Es gibt auch die Möglichkeit dem Script ein zweites Argument (also zwei) über die Eingabeaufforderung zu übergeben, was auch soweit funktioniert:
c:\python27\Python Script.py PM AS

Soweit alles in Ordnung, nun aber möchte ich aus Script.py eine Setup.exe mit py2exe generieren.
Laut py2exe`s Anleitung folgendermaßen; Es soll eine Datei Names Setup.ty erstellt und folgender Code hineinkopiert werden:
from distutils.core import Setup
import py2exe
 
Setup(windows=['Script.py'])  

Dann per Eingabeaufforderung folgendes ausführen:
python Setup.py py2exe

Soweit sogut, meine Setup.exe wurde erstellt, allerdings ohne Funktion, da die zu übergebende(n) Argumente(n) für die jeweilige .exe fehlen.

Und genau an dieser Stelle liegt mein Problem, müssen diese fehlenden Argumente im Script Setup.ty enthalten sein oder müssen diese irgendwo in der Eingabeaufforderung beim erzeugen der ty2exe an einer bestimmten Stelle platziert werden?

Falls andere Argumente zur Scriptübergabe benötigt werden, habe ich vor eine neue weitere .exe zu erzeugen.

Hoffe ich habe mich nicht zu umständlich ausgedrückt...

Vielen Dank an Euch fleissigen Helfer face-smile

Gruß,
Blattlaus
Gersen
Gersen 09.01.2016 aktualisiert um 23:41:32 Uhr
Goto Top
Hallo,
Zitat von @115129:
Laut py2exe`s Anleitung folgendermaßen; Es soll eine Datei Names Setup.ty erstellt und folgender Code hineinkopiert werden:
> from distutils.core import Setup
> import py2exe
>  
> Setup(windows=['Script.py'])  
> 

Dann per Eingabeaufforderung folgendes ausführen:
python Setup.py py2exe

Soweit sogut, meine Setup.exe wurde erstellt, allerdings ohne Funktion, da die zu übergebende(n) Argumente(n) für die jeweilige .exe fehlen.

Nach meinem Verständnis wird bei diesem Vorgang keine Datei "Setup.exe" erstellt, sondern ein Verzeichnis "dist", in welchem eine Datei "Script.exe" generiert wird.
E:\Python27\projects>e:\Python27\python.exe Setup.py py2exe
running py2exe
creating E:\Python27\projects\dist
...
copying e:\Python27\lib\site-packages\py2exe\run_w.exe -> E:\Python27\projects\dist\Script.exe
Diese kann mit den gleichen Argumenten ausgeführt werden wie die Script.py.

Wobei bei mir das Kompilieren nur funktioniert, wenn innerhalb der Datei "Setup.py" das importierte Modul sowie der Aufruf klein geschrieben werden:
from distutils.core import setup 
import py2exe 

setup(windows=['Script.py'])

Oder?

@colinardo:
Sorry, hatte mich ungenau ausgedrückt. Dein Beispiel, mit "Setup(console=['Script.py'])" compiliert, erzeugt natürlich die Ausgaben. Mit "Setup(windows=['Script.py'])" compiliert, erzeugt es beim Aufruf die Ausgaben nicht. Aber nicht, weil die Parameter nicht ausgewertet werden - sondern, weil die Konsole als Grundlage für die Ausgabe fehlt. Ich hoffe, ich habe mit der Erklärung die Unklarheit nicht noch vergrößert... face-wink

Gruß,
Gersen
115129
115129 09.01.2016 um 23:49:18 Uhr
Goto Top
Nach meinem Verständnis wird bei diesem Vorgang keine Datei "Setup.exe" erstellt, sondern ein Verzeichnis "dist", in welchem eine Datei "Script.exe" generiert wird.

Ok, stimmt was du geschrieben hast, habe eben versucht die "Script.exe" in dem Verzeichnis "dist" per Eingabeaufforderung mit dem Argument "PM" zu starten, was auch funktionierte.

...doch genau das will ich nicht...

Dachte man kann das Pytonsript "Script.py" mit py2exe in "Script.exe" samt dem Argument "PM" konvertieren.
Somit könnte die "Script.exe" per doppelklick ausgeführt werden ohne Eingabeaufforderung.

Geht das überhaupt wie ich mir das vorstelle?
colinardo
colinardo 10.01.2016 aktualisiert um 00:03:07 Uhr
Goto Top
Zitat von @115129:

Dachte man kann das Pytonsript "Script.py" mit py2exe in "Script.exe" samt dem Argument "PM" konvertieren.
Somit könnte die "Script.exe" per doppelklick ausgeführt werden ohne Eingabeaufforderung.

Geht das überhaupt wie ich mir das vorstelle?
Öhm wieso so umständlich ? Definiere im Skript eine Variable und verwende den Inhalt dieser wenn ein bestimmter externer Parameter leer ist...einfache IF-Anweisung.
115129
115129 10.01.2016 um 01:01:09 Uhr
Goto Top
Öhm wieso so umständlich ? Definiere im Skript eine Variable und verwende den Inhalt dieser wenn ein bestimmter externer Parameter leer ist...einfache IF-Anweisung.

Hehe, genau dies habe ich befürchtet...dann werde ich die Tage mein Glück versuchen ob ichs hinbekomme.
Vielen Dank für die Hilfestellungen.

Gruß,
Blattlaus
Gersen
Gersen 10.01.2016 um 01:02:44 Uhr
Goto Top
Dachte man kann das Pytonsript "Script.py" mit py2exe in "Script.exe" samt dem Argument "PM" konvertieren.
Also doch, wie ich oben schon vermutete...
Somit könnte die "Script.exe" per doppelklick ausgeführt werden ohne Eingabeaufforderung.
Geht das überhaupt wie ich mir das vorstelle?
Theoretisch ja, aber ich glaube, das willst Du Dir nicht antun...
argparse mit default-Schalter (wie oben) wäre eine Möglichkeit im Skript.
Noch simpler: Mach doch eine Verknüpfung zur EXE, in derem Aufruf Du den Parameter einträgst.