ubuntuusers.de

[Python] Shell Befehle ausführen?

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

detructor15

(Themenstarter)

Anmeldungsdatum:
16. Januar 2007

Beiträge: 5733

Warum denkst du eigentlich, dass ausgerechnet DU völlig ohne lesen der Doku auskommst?

das eine Doku zu nennen ist eine Beleidigung an alle Dokumentationen weltweit.

Da stehen ein paar Sätze von wegen
"das ist $funktionsname Parameter sind blablubb" dann kommen ein paar Beispiele und das wars.
Eine Erklärung was der Befehl macht hab ich nicht gefunden...

Note: If the cmd argument to popen2 functions is a string, the command is executed through /bin/sh. If it is a list, the command is directly executed.

(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)

>
p = Popen(["somestring"], shell=True, bufsize=bufsize,
stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin) (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
=⇒
p = Popen(["mycmd", "myarg"], bufsize=bufsize,
stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin) The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen, except that: * subprocess.Popen raises an exception if the execution fails * the capturestderr argument is replaced with the stderr argument. * stdin=PIPE and stdout=PIPE must be specified. * popen2 closes all file descriptors by default, but you have to specify close_fds=True with subprocess.Popen.

was bedeuten die =⇒ ?
Gehören die in den Code?
Wenn nicht, was haben die da zu suchen?

Es wird nicht geklärt:
→ Was ist bufsize?
→ Was bezwecken stdin = PIPE und stdout = PIPE ? Da wird 2 Variablen der gleiche Wert zugewiesen, wenn ich das richtig sehe, was IMHO vollkommen Sinnfrei ist
→ "close_fds=True" "popen2 closes all file descriptors by default, but you have to specify close_fds=True with subprocess.Popen." und warum muss ich das spezifizieren? Wenn popen das sowieso macht, warum dann dieses close_fds?
→ "(child_stdout, child_stdin) = (p.stdout, p.stdin)" warum wird hier wieder 2 Variablen etwas zugewiesen was schon in 2 anderen Variablen steht? Vorallendingen: Es ist wieder der gleiche Wert in 2 Variablen der übergeben wird...
→ "the capturestderr argument is replaced with the stderr argument." hä? in dem gesamten code steht weder das eine noch das andere...sehr verwirrend
→ "stdin=PIPE and stdout=PIPE must be specified." warum? was machen die?

Entschuldige vielmals das ich keinen Abiturabschluss habe und auch keinen Professor in Informatik!
Und entschuldige vielmals das Python nicht meine Muttersprache ist und das ich hier nicht ganz durchblicke.
Und entschuldige vielmals, dass ich nachfrage bzw. Sachen erklärt haben möchte.

👿

e1bart0 Team-Icon

Avatar von e1bart0

Anmeldungsdatum:
12. Mai 2007

Beiträge: 927

Wohnort: München

Der Link von audax war nur ein Teil der Dokumentation, indem es darum geht, wie man popen2 (der Vorschlag von Flint) durch subprocess ersetzen kann. Wenn du auf der Seite weitergesucht hättest, wärst du auf die Seite http://docs.python.org/lib/node528.html gekommen, dort wird subprocess ausführlich erklärt.

detructor15

(Themenstarter)

Anmeldungsdatum:
16. Januar 2007

Beiträge: 5733

da sind nur Links zu http://docs.python.org/lib/node538.html aber nicht zu node528

Previous Page Up one Level Next Page Python Library Reference Contents Module Index Index
Previous: 17.1.3.5 Replacing os.popen* Up: 17.1.3 Replacing Older Functions Next: 17.2 socket
17.1.3.6 Replacing popen2.*

Note: If the cmd argument to popen2 functions is a string, the command is executed through /bin/sh. If it is a list, the command is directly executed.

(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)

>
p = Popen(["somestring"], shell=True, bufsize=bufsize,
stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin) (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
=⇒
p = Popen(["mycmd", "myarg"], bufsize=bufsize,
stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin) The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen, except that: * subprocess.Popen raises an exception if the execution fails * the capturestderr argument is replaced with the stderr argument. * stdin=PIPE and stdout=PIPE must be specified. * popen2 closes all file descriptors by default, but you have to specify close_fds=True with subprocess.Popen. Previous Page Up one Level Next Page Python Library Reference Contents Module Index Index
Previous: 17.1.3.5 Replacing os.popen* Up: 17.1.3 Replacing Older Functions Next: 17.2 socket

ist alles was mir da angezeigt wird.
Previous Page führt zu node538, nextpage zu module-socket.html und pageup zu node 533
andere Links sind auf der Site nicht

Aber danke für den Link ☺

If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. (Unix only)

der Parameter kann doch gar nicht unter Linux funktionieren?!? Unix != Linux, oder nicht?!

*edit
*ratter* achso, du meinst wenn ich auf dem Server weitergesucht hätte?!

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

Wohnort: Bochum

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

detructor15 hat geschrieben:

→ Was ist bufsize?
→ Was bezwecken stdin = PIPE und stdout = PIPE ? Da wird 2 Variablen der gleiche Wert zugewiesen, wenn ich das richtig sehe, was IMHO vollkommen Sinnfrei ist
→ "close_fds=True" "popen2 closes all file descriptors by default, but you have to specify close_fds=True with subprocess.Popen." und warum muss ich das spezifizieren? Wenn popen das sowieso macht, warum dann dieses close_fds?
→ "(child_stdout, child_stdin) = (p.stdout, p.stdin)" warum wird hier wieder 2 Variablen etwas zugewiesen was schon in 2 anderen Variablen steht? Vorallendingen: Es ist wieder der gleiche Wert in 2 Variablen der übergeben wird...
→ "the capturestderr argument is replaced with the stderr argument." hä? in dem gesamten code steht weder das eine noch das andere...sehr verwirrend
→ "stdin=PIPE and stdout=PIPE must be specified." warum? was machen die?

→ Die Größe des Buffers. Erst wird der vollgeschrieben und dann geht das in einem Rutsch an dein Programm. → Du willst ihn wohl auf 0 setzen
→ Keine Variablen, sondern Keyword-Argumente und bezwecken, dass stdin und stdout geöffnet werden
→ popen2 ist das alte, subprocess.Popen das neue
→ nur um zu zeigen, wie man auf die zugreift.
→ darfst du getrost ignorieren, zeigt nur Unterschiede zur alten Implementierung auf
→ sie 2.

Wenn du Python lernen willst, hol dir nen gutes Buch dazu. O'Reilly-Bücher sind immer gut, und das aus dem MTP-Verlag ist ebenfalls gut.

btw:
Linux ist nach dem Vorbild von Unix gebaut, ebenso wie Solaris, *BSD, etc...
Unix ist also Synonym für all diese...

e1bart0 Team-Icon

Avatar von e1bart0

Anmeldungsdatum:
12. Mai 2007

Beiträge: 927

Wohnort: München

detructor15 hat geschrieben:

Previous Page führt zu node538, nextpage zu module-socket.html und pageup zu node 533

Du hättest noch ein zweites Mal auf pageup klicken sollen, dann wärst du auf den Link von Fredo gekommen, dort ist u.a. auch ein Link zu meinem Link. 😉
Ansonsten hättest du auch im Inhaltsverzeichnis (vier Mal pageup 😉) nach subprocess suchen können.

detructor15

(Themenstarter)

Anmeldungsdatum:
16. Januar 2007

Beiträge: 5733

Wenn du Python lernen willst, hol dir nen gutes Buch dazu. O'Reilly-Bücher sind immer gut, und das aus dem MTP-Verlag ist ebenfalls gut.

ich hab 1mal versucht mit einem Buch eine Sprache zu lernen, seitdem hasse ich Java...

Danke für die Erklärungen, tschuldigung das ich weiter oben *etwas* angepisst reagiert hab...

Saddy

Anmeldungsdatum:
2. Mai 2006

Beiträge: 1148

Okay, angenommen ich habe einen Befehl mit Pipes, Quotes und allem drum und dran (grep, awk, tr). Welche Funktion aus dem subprocess-Modul benutze ich da am besten wenn ich weder Zeichen escapen noch den Befehl irgendwie splitten und stdout haben will?

Antworten |