Seite 1 von 2

Verfasst: Montag 5. Februar 2007, 18:37
von Leonidas
sape hat geschrieben:
The executable argument specifies the program to execute. It is very seldom needed: Usually, the program to execute is defined by the args argument.[...]
Wo steht hier das ein iterable erwartet wird?
Ich spreche doch gar nicht von ``executable``. Aber es ist auf der selben Seite, hier:
http://docs.python.org/lib/node529.html hat geschrieben:args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence or string, but can be explicitly set by using the executable argument.
Wenn wir noch mal darüber nachdenken (oder einfach in den Quellcode schauen) warum dort eine Liste akzeptiert wird kommen wir zu etwas sehr praktischem: subprocess.Popen kann, wenn man ihm statt einem String eine Liste übergibt, selbst quoten, ansonsten muss man das selbst machen. Und warum man besser quoten lässt statt selber quotet (bzw. es sogar vergisst), muss ich nicht erklären, oder?

In diesem Beispiel ist es ja egal, aber ich finde es ist besser Beispiele zu bringen, die problemloser sind wenn man auf die Idee kommt sie zu erweitern. Was wenn man Leerzeichen in den Argumenten hat?

Verfasst: Montag 5. Februar 2007, 19:01
von birkenfeld
Leonidas hat geschrieben:Könnten wir nun dazu übergehen, den ersten Parameter von subprocess.Popen generell als Liste/Tupel zu übergeben? Wunderbar, danke...
Bis 2.5.1 bitte nur Listen, siehe http://python.org/sf/1357915...

Verfasst: Dienstag 6. Februar 2007, 08:05
von jens
Leonidas hat geschrieben:Könnten wir nun dazu übergehen, den ersten Parameter von subprocess.Popen generell als Liste/Tupel zu übergeben?
Ah, sorry, hab gestern die zwei Wörter "den ersten" überlesen ;)

Also hier die Optimal Lösung:

Code: Alles auswählen

import sys, subprocess

command = ["ping", "heise.de"]

process = subprocess.Popen(
    command,
    shell   = True,
    stdout  = subprocess.PIPE
)
for line in iter(process.stdout.readline, ''):
    sys.stdout.write("\t%s\n" % line.rstrip())

print "ENDE"

Verfasst: Dienstag 6. Februar 2007, 17:18
von Leonidas
birkenfeld hat geschrieben:Bis 2.5.1 bitte nur Listen, siehe http://python.org/sf/1357915...
Ah, stimmt - ich bin sogar mal über diesen Bugreport gestolpert.

Verfasst: Dienstag 6. Februar 2007, 19:38
von BlackJack
Hat das Windows-``ping`` auch eine Option ``-c NUM`` um die Anzahl der Pings anzugeben? Wenn man die einbaut, dann kommt das Skript auch unter Linux irgendwann zu einem Ende und bombardiert den armen Heise-Server nicht non-stop. :-)

Verfasst: Dienstag 6. Februar 2007, 21:28
von birkenfeld
Das sendet doch standardmäßig eh nur 4 Stück.

Verfasst: Dienstag 6. Februar 2007, 21:45
von sape
Leonidas hat geschrieben:[...]
Wenn wir noch mal darüber nachdenken (oder einfach in den Quellcode schauen) warum dort eine Liste akzeptiert wird kommen wir zu etwas sehr praktischem: subprocess.Popen kann, wenn man ihm statt einem String eine Liste übergibt, selbst quoten, ansonsten muss man das selbst machen. Und warum man besser quoten lässt statt selber quotet (bzw. es sogar vergisst), muss ich nicht erklären, oder?

In diesem Beispiel ist es ja egal, aber ich finde es ist besser Beispiele zu bringen, die problemloser sind wenn man auf die Idee kommt sie zu erweitern. Was wenn man Leerzeichen in den Argumenten hat?
Ok stimmt, hast Recht.

lg

Verfasst: Dienstag 6. Februar 2007, 23:43
von BlackJack
birkenfeld hat geschrieben:Das sendet doch standardmäßig eh nur 4 Stück.
Also ein ``ping`` ohne die Option läuft bei mir bis ich Strg+C drücke.

Verfasst: Mittwoch 7. Februar 2007, 00:08
von birkenfeld
Unter Windows?

Verfasst: Mittwoch 7. Februar 2007, 10:02
von BlackJack
Nein unter Linux.

Verfasst: Mittwoch 7. Februar 2007, 10:09
von birkenfeld
Eben. ;)

Verfasst: Mittwoch 7. Februar 2007, 10:35
von BlackJack
:?: Jetzt hast Du mich verwirrt.

Nochmal: Ich fragte ob ``ping`` unter *Windows* auch die Option `-c` kennt, weil man die unter *Linux* braucht.

Dann kann man die einbauen und das Skript läuft unter *Windows* und *Linux*.

Verfasst: Mittwoch 7. Februar 2007, 11:25
von birkenfeld
Achso, es soll unter beidem laufen.

Wie auch immer, unter Windows ist die Option `-n`.