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

Kommandozeilenanwendung

Beitragvon JR » Mittwoch 23. August 2006, 09:36

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 23. August 2006, 10:43

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Mittwoch 23. August 2006, 10:57

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

Beitragvon JR » Mittwoch 23. August 2006, 14:49

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 23. August 2006, 14:50

Traceback?

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

Beitragvon JR » Mittwoch 23. August 2006, 14:55

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 23. August 2006, 14:59

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!

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

Beitragvon JR » Mittwoch 23. August 2006, 15:00

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

Beitragvon jens » Mittwoch 23. August 2006, 15:01

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 :)

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

Beitragvon JR » Mittwoch 23. August 2006, 15:04

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 23. August 2006, 15:05

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

Beitragvon JR » Mittwoch 23. August 2006, 15:18

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 23. August 2006, 15:30

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

Beitragvon JR » Mittwoch 23. August 2006, 15:35

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

Beitragvon JR » Mittwoch 23. August 2006, 15:39

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 :-(

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]