probiert - erfolgreich, aber nichts verstanden....

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.
Gast

probiert - erfolgreich, aber nichts verstanden....

Beitragvon Gast » Donnerstag 28. November 2002, 13:23

hallo!

ich möchte eine gui für cdrecord&co machen. allerdings soll das teil nur auf meinem computer funktionieren. zumindest am anfang.

aus einem anderen beitrag und per mail habe ich folgenden code zusammengeschustert. ich sehe mich sowieso nicht als programmierer sondern mehr als editierer - passt wohl besser :lol:

jedenfalls will ich genauer verstehen was da eigentlich genau passiert.

schon die erste zeile verwirrt mich, da die standardausgabe ja sowieso der monitor ist. klar, woher soll das skript aber sonst wissen, dass er die programmmeldungen in dem fall in idle ausgeben soll. andererseits ist es genausowenig logisch, dass er es wegen dieser zeile im interpreter ausgibt.

jetzt mal der code:

import os
_stdin,_stdout,_stderr=os.popen3("/usr/bin/cdrecord -v dev=0,3,0 speed=12 /home/rolgal/backup.iso")
for _s in _stdout:
print _s.strip()

for _s in _stderr:
print _s.strip()

mir ist vorallem os.popen3 eigentlich nicht klar.

vielleicht kann mir jemand verdeutlichen was da eigentlich genau vor sich geht

vielen dank im voraus

roland
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Donnerstag 28. November 2002, 20:17

hi rolgal,

was hast du denn für ein System? Ich finde die Doku unter /usr/share/doc/packages/python/html/index.html Schau doch mal nach.

popen3(cmd[, mode[, bufsize]])
Executes cmd as a sub-process. Returns the file objects (child_stdin, child_stdout, child_stderr). Availability: Unix, Windows. New in version 2.0.


Ich hoffe das hilft dir weiter.

Hans
python-2.2.1, python-demo-2.2.1, python-doc-pdf-2.2.1, python-mysql-0.9.1, pychecker-0.8.11, python-tk-2.2.1, python-imaging-1.1.3, python-devel-2.2.1, python-gtk-1.4.2, python-xml-2.2.1, pyweblib-1.1.0, pyxml-0.8, PyQt-3.3.2
Gast

naja

Beitragvon Gast » Donnerstag 28. November 2002, 20:40

danke für die antwort!

aber mein englisch reicht nicht um das zu lernen.

deshalbe hoffe ich dass mir das jmd. ausdeutschen kann, oder so ähnlich

mfg

roland
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Donnerstag 28. November 2002, 21:03

popen3(cmd[, mode[, bufsize]])


Führt cmd als Nebenprozess aus. Gibt die Dateiobjekte Standardeingabe, Standardausgabe, Standardfehlerausgabe des Nebenprozesses zurück.
Verfügbar: Unix, Windows. Neu in Version 2.0

Du wirst um englisch kaum herum kommen. Aber den meisten geht es wie dir, wenn's absolutes Neuland ist, dann ist das schon verdammt schwer. Geht mir auch so. Man kann sich natürlich auch deutsche Bücher kaufen (mache ich meistens nur, wenn der Chef bezahlt :D ) aber dass ist teuer und wenn sie dann endlich erscheinen, ist das neueste Update schon längst drin.

Hans
Gast

nachtrag

Beitragvon Gast » Donnerstag 28. November 2002, 21:09

das stimmt schon, dass ich um englisch nicht herum kommen werde, aber ich möchte nicht schon die grundlegenden sachen in englisch lernen müssen. ich meinte natürlich nicht, dass ich nicht verstehe was da steht - ich verstehe nicht was es bedeutet!

Führt cmd als Nebenprozess aus. Gibt die Dateiobjekte Standardeingabe, Standardausgabe, Standardfehlerausgabe des Nebenprozesses zurück.

was heisst cmd?

das will ich nicht auf englisch lernen müssen, wenn du verstehst was ich meine...

danke einstweilen

mfg

roland
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Donnerstag 28. November 2002, 21:21

Schau dir die Syntax nochmal an: popen3(cmd,.....)

cmd ist dein Kommando (engl. Command) welches du starten willst.

Unixsysteme arbeiten in der Regel mit Standardeingabe (normalerweise deine Tastatur), Standardausgabe (dein Bildschirm) und Standardfehlerausgabe (dein Bildschirm). Normalerweise gehen alle normalen Meldungen an die Standardausgabe und alle Fehlermeldungen an die Standardfehlerausgabe. Die Ausgaben können natürlich auch in eine Datei umgelenkt werden.

Kann sein dass das bei Windows auch so ist, aber da bin ich froh, wenn's überhaupt läuft. An manchen Tagen habe ich das Gefühl, das stderr bei Windows blau ist. :D

Hans
Gast

so weit , so gut

Beitragvon Gast » Donnerstag 28. November 2002, 21:27

aber wenn die standardausgabe sowieso der bildschirm ist, warum muss ich es dann angeben.

damit bin ich wieder am anfang meiner frage und zitiere mich selbst:

schon die erste zeile verwirrt mich, da die standardausgabe ja sowieso der monitor ist. klar, woher soll das skript aber sonst wissen, dass er die programmmeldungen in dem fall in idle ausgeben soll. andererseits ist es genausowenig logisch, dass er es wegen dieser zeile im interpreter ausgibt.

klar, wo ich den knoten habe???

ich habe übrigens mandrake 9.0

mfg

roland
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Donnerstag 28. November 2002, 21:49

das mit den unterschiedlichen Kanälen ist ganz normaler Vorgang unter Unix. Wenn du in deinem Terminal / deiner shell nichts angibts, geht alles auf Standardausgabe und Standardfehlerausgabe. Deinem Kernel ist es somit erst mal schnurzpiepegal, mit welcher Ausgabeeinheiten er es zu tun hat.

Beispiel:
  • echo "Hallo Welt"
  • echo "Hallo Welt" > /tmp/x.txt
das Kommando echo schreibt immer nur auf deine Standardausgabe, im zweiten Fall hast du die allerdings in die Datei /tmp/x.txt umgeleitet. Oft werden doch Kommandos auch mittels Pipe "|" an ein anderes Kommando weitergeleitet. Kann man dann interpretieren als Standardausgabe | Standardeingabe. Tut mir leid, aber viel besser kann ich es dir auch nicht erklären.

Hauptsache ist, dass ich die Standardfehlerausgabe nicht zu sehen bekomme.

Hans
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 29. November 2002, 01:38

Hi rolgal,

da hast Du Dir aber auch gleich eine Hammerzeile ausgesucht :shock:

Code: Alles auswählen

_stdin,_stdout,_stderr=os.popen3("/usr/bin/cdrecord -v dev=0,3,0 speed=12 /home/rolgal/backup.iso")

Schau ma mal, was da vor dem = steht:

Code: Alles auswählen

_stdin,_stdout,_stderr=...

das ist schon eine besonderheit von Python. Ich mach mal ein einfaches Beispiel, das kannst Du auch schön in einer Console ausprobieren, nachdem Du python gestartet hast:

Code: Alles auswählen

fritz@seneca:~$ python
Python 2.1.3 (#1, Jul 29 2002, 22:34:51)
[GCC 2.95.4 20011002 (Debian prerelease)] on linux2
Type "copyright", "credits" or "license" for more information.
>>> a,b,c = (1,2,3)
>>> print a
1
>>> print b
2
>>> print c
3

Boah, Du kannst in Python an 3 Variable auf einmal Werte übergeben.
Du kannst natürlich auch unterschiedliche Typen von Variablen verwenden:

Code: Alles auswählen

>>> a,b,c,d = (1,"Hallo",3.1415,"Welt")
>>> print a, b, c, d
1 Hallo 3.1415 Welt


So kommen wir mal zum Teil hinter dem = in Deiner Programmzeile:

Code: Alles auswählen

... = os.popen3("/usr/bin/cdrecord -v dev=0,3,0 speed=12 /home/rolgal/backup.iso")

Wie Hans schon schrieb, führt Diese Funktion ein externes Kommando aus und gibt die für das Kommando geöffneten Pfeifen (pipes) stdin, stdout und stderr zurück. Dadurch, kann Dein Programm auf diese zugreifen und die Ausgabe von, in dem Fall cdrecord, bearbeiten bzw. bei einer GUI z.B. in der Statuszeile anzeigen anstatt, daß die Ausgabe in einem Consolefenster erfolgt.


Gruß

Dookie
Gast

aha

Beitragvon Gast » Freitag 29. November 2002, 03:43

@dookie

heisst das: führe ich
os.popen3("/usr/bin/cdrecord -v dev=0,3,0 speed=12 /home/rolgal/backup.iso")
ohne variablen zweisung aus, dann sollten die ausgaben in der console erfolgen?

ich habe nämlich versucht im interpreter die zeile so auszuführen. - da war aber mit dem brennen bald schluss!

mfg

roland
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 29. November 2002, 14:01

Hi roland,

heisst das: führe ich
os.popen3("/usr/bin/cdrecord -v dev=0,3,0 speed=12 /home/rolgal/backup.iso")
ohne variablen zweisung aus, dann sollten die ausgaben in der console erfolgen?


Nein! wenn Du ohne variablen Zuweisung os.popen3 ausführst, werden die Pipes an Nichts zugewiesen, das Heißt Du hast keinen Zugriff mehr auf die Ausgaben des gestarteten Kommandos und kannst diesem auch keine weiteren Anweisungen über _stdin zukommen lassen. Ausserdem wird eine der Pipes _stdout oder _stderr irgendwann vollaufen und dann wird das ausgeführte Kommando (cdrecord) die Arbeit einstellen.
Für den Fall, daß die Aus- und Eingaben über die console gehen gibts die Funktion system(cmd) auch aus dem os-Modul.

Gruß

Fritz

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], martinjo