Kommandozeilenanwendung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hallo!

Hoffentlich hat noch keiner diesselbe Frage gestellt. Irgendwie finde ich keine komplette Antwort.
Ich möchte eine *.exe erstellen, welche ich aus der MS-DOS Eingabeaufforderung mit Argumenten rufen möchte und einen Rückgabewert liefern kann. Wie ich eine *.exe erstelle weiß ich. Das Übergeben von Arguemnten und auslesen mit sysargv[] kenne ich auch. Nur wie gebe ich einen Wert zurück.

Vielleicht kann mir jemand mit einem Minibeispiel helfen, bei dem ich zwei Zahlen übergebe und die Summe zurückbekomme?

Auf ruf in MS DOS z.B.

Code: Alles auswählen

summe.exe 1 5
Als Ergebnis erwarte ich in diesem Fall eine 6.

Geht in MS DOS eigentlich sowas wie

Code: Alles auswählen

SET ergebnis = summe.exe 1 5
oder ähnlich?

Danke euch und viele Grüße
JR
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

sys.exit([arg])

Wobei arg z.B. 1 ist, also: sys.exit(1)

Mehr Info: http://docs.python.org/lib/module-sys.html#l2h-343

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Unter MSDOS müsstest du das so schreiben:

Code: Alles auswählen

summe 1 5
IF ERRORLEVEL 255 SET ERG = 255
IF ERRORLEVEL 254 SET ERG = 254
IF ERRORLEVEL ...
ERRORLEVEL testet immer auf größer gleich, deswegen muss man von oben anfangen. Und ja, das ist Braindead (MS halt :?)

Ich habe das früher so gelöst: in eine Datei foo habe ich "SET RESULT=" geschrieben, ohne das abschließende CRLF. Dann habe ich die Programme so geschrieben, dass sie das Ergebnis einfach auf stdout schreiben. (Hier also print oder sys.stdout.write). Und dann folgendes gemacht

Code: Alles auswählen

copy foo temp.bat > NUL
summe 1 5 >> temp.bat
temp.bat
echo Ergebnis: %RESULT%
MS hat die BAT-Dateien nur auf Drängen von IBM eingeführt, und das merkt man.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Leute!

Danke erstmal für die Reaktionen.
Folgendes geht leider nicht:

Code: Alles auswählen

import sys

zahl1 = int(sys.argv[1])
zahl2 = int(sys.argv[2])

summe = zahl1 + zahl2

sys.exit(summe)
Ist sicherlich ein grober Fehler drin, weiß aber nicht, welcher.

Über einen Hinweis würde ich mich freuen.

Grüße
JR
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Traceback?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Meine Anwendung wurde mit cx_Freeze kompiliert und wenn ich sie rufe, erscheint eine Fehlermeldung:

Titel:
"cx_Freeze: Python error in main script"

Meldung:
"Traceback (most recent call last):
File "C:\Python24\cx_Freeze\initscripts\console.py", line 27, in ?
exec code in m.___dict___
File "summe.py", line 9, in ?
sys.exit(summe)
SystemExit: 6"

Also immerhin hat er 1 und 5 addiert. Doch die Fehlermeldung ist unpraktisch :-(
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das sieht nach einem Problem mit cx_Freeze aus... Vieleicht muß man da explizit sagen, das man ein sys.exit() machen will?!?!?

Ich selber hab nie was mit cx_Freeze gemacht!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Ja, habe auch das Gefühl. womit lässt du dein script denn kompilieren?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich kompiliere meine Skripte überhaupt nicht! Lohnt sich auch nicht, ist zu aufwendig: Machst du eine kleine Änderung, mußt du wieder kompilieren...

Trau einfach deinen Abnehmen zu, das sie Python installieren können :) Unter Linux ist Python sowieso zu 99% da :)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Da ich eine MySQL-Schnittstelle für unsere Datenbankanwendung auf Arbeit programmieren möchte, welche sehr schnell arbeiten soll, möchte ich eine unabhängige Anwendung erstellen. Ich kann von unseren Kunden nicht erwarten, dass sie alle Python installieren.

Sonst würde ich das auch nicht so machen :-)

ich versuchs mal mit py2exe weiter. Danke für die Tipps
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:

Code: Alles auswählen

sys.exit(summe)
Ist sicherlich ein grober Fehler drin, weiß aber nicht, welcher.
Hi JR!

Der Fehler ist, dass mit ``sys.exit(0)`` dem aufrufenden Programm signalisiert wird, dass kein Fehler aufgetreten ist. Mit ``sys.exit(1)`` oder einem höheren Wert, wird dem aufrufenden Programm normalerweise signalisiert, dass ein Fehler aufgetreten ist.

Möchtest du etwas zurück geben, dann mach das mit ``print`` oder mit ``sys.stdout.write("irgendetwas")`` (nach STDOUT).

Das aufrufende Programm sollte in diesem Fall von STDIN lesen können.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Gerold!

Wenn ich

Code: Alles auswählen

import sys

zahl1 = int(sys.argv[1])
zahl2 = int(sys.argv[2])

summe = zahl1 + zahl2

sys.stdout.write(str(summe))
übersetze und aus MS DOS mit

Code: Alles auswählen

summ 1 5
rufe, liefert er mir tadellos eine 6 ins Konsolenfenster. Das ist schon mal ein riesen Fortschritt.
Nun habe ich aber folgendes Problem. Ich möchte meine *.exe-Datei aus einer Datenbankanwendung rufen und einen Rückgabewert (von mir aus auch nur positiv) erhalten.
Wenn ich im obigen Pythoncode das

Code: Alles auswählen

sys.stdout.write(str(summe))
durch

Code: Alles auswählen

sys.exit(summe)
ersetze bekomme ich leider eine Null zurück.

Ich rufe wie folgt auf, wobei das euch natürlich nicht direkt was sagt, aber die Syntax ist dennoch vom Prinzip her zu verstehen:

Code: Alles auswählen

v_i # SysExecute('Q:\Arbeit\Projekte\SQL_Schnittstelle\dist\summe.exe', '1 5', _ExecMinimized);
In v_i wird nichts reingeschrieben. Keine 6 !?

Im Übrigen übersetze ich gerade mit py2exe, da cx_Freeze wegen fehlender Module meckert.

Grüße
Jamil
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi JR!

``sys.stdout.write()`` oder ``print`` -- das ist schon korrekt so. Vergiss ``sys.exit()``.

Suche in der Programmiersprache, von der aus du ``summe.exe`` aufrufen möchtest, einen Befehl, der dir die Ausgabe des Dos-Befehls ``dir`` in das Programm holt, so dass du damit arbeiten könntest. Genau mit diesem Befehl rufst du dann ``summe.exe`` auf. Dann hast du es. In Python wäre das z.B. ``os.popen()``.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

ich gehe dem Tipp nach, verstehe aber nicht, weshalb ich den Befehl "dir" zum Auflisten von Verzeichnisinhalten in diesem Zusammenhang bräuchte. Hast du dich versehens vertippt?

Jamil
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Nochmal zu dem Befehl SysExecute unsere Datenbankanwendung:

In der Entwickler hilfe steht:

"Mit diesem Befehl wird ein Programm gestartet, in (alpha1) wird der Pfad und der Name des Programms angegeben und in (alpha2) die Parameter, die an das aufzurufende Programm übergeben werden sollen. Sollen keine Parameter übergeben werden, kann in (alpha2) '' übergeben werden."

Außerdem:

Resultat ist der Return-Wert des aufgerufenen Programms.

Ohne Result kann ich keine Anwendung verwenden :-(
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hallo!

Erfolgreicher Abschluss:

Code: Alles auswählen

import sys

zahl1 = int(sys.argv[1])
zahl2 = int(sys.argv[2])

summe = zahl1 + zahl2

sys.exit(summe)              # Return-Wert
funktioniert super. Ich habe einen dämlichen Fehler gemacht, für den ich mich tausendfach entschuldigen möchte.

Mit sys.stdout.write() erhalte ich nichts in unserer Entwicklungsumgebung, da der Startcode des Programms und nicht der Inhalt von Stdout zurückgegeben wird.

Danke an Alle
JR
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Eine Frage ist mir noch eingefallen:

Das sys.stdout.write(string) ist super. Gibt es auch das Gegenteil, dass meine Anwendung Eingaben des Anwenders abfragt nach dem Motto:

sys.stdout('Geben Sie Zahl 1 ein!')

<<sys.stdin.XXX(zahl1)>>

sys.stdout('Geben Sie Zahl 2 ein!')

<<sys.stdin.XXX(zahl2)>>

sys.stdout('Das Ergebnis ist bla bla')

Danke und einen schönen Feuerabend :lol:
JR
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

jop gibts sys.stdin.read() Aber das liest und liest und liest :D
BlackJack

`raw_input()` ist wohl das gesuchte.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Prima, danke!

Also das "print" und "raw_input" bei einer erstellten Kommandozeilen-Anwendung *.exe auch gehen, wusste ich nicht. Das ist aber sehr wichtig.
Nur schade, dass py2exe so viel Zeugs neben der *.exe-Datei anlegt. Wenn ich einen einfachen C-Code (z.B. helloworld.c) kompilieren lasse, erhalte ich doch auch nur eine *.exe-Datei ohne *.dll's etc. (?)
Antworten