Pipes, Handles und Bildschirmausgabe?

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.
Antworten
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Hi,

wonach suche ich, wenn mein Skript zwar Bildschirmausgaben machen soll, aber Daten über eine Pipe an ein anderes Programm leiten soll?

Also so:

Code: Alles auswählen

>script.py | program.exe
script: blah
...
program: done!
>_

Pipes unter Windows:
http://technet.microsoft.com/en-us/libr ... 90982.aspx

Wenn ich also STDOUT weiterhin benutzen möchte, muss man wohl irgendwie ein anderes "Handle" verwenden.

Nur wie geht das, und geht das überall (win32, linux, mac)?

Zu Python habe ich nicht viel gefunden:
http://docs.python.org/lib/module-pipes.html
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

subprocess.PIPE kann das.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Mhh, auf Anhieb finde ich da leider nichts zu.

Ich möchte, dass der Anwender den Output des Skripts an ein beliebiges Programm pipen kann, und trotzdem die Bildschirmausgabe bekommt.

Die Idee habe ich von der ImageMagick-Syntax, bei "-" statt einem Dateinamen werden die Daten "gepiped". Aber wohl auch über STDXXX.

Vielleicht bleibt mir doch nichts anderes, als STDOUT für Daten zu verwenden, oder eine Datei zu benutzen. Aber dann muss für den Komfort wieder ein (Batch-)Skript benutzt werden.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

sebastian@debian-sid:~$ ls -l
insgesamt 16
drwx------ 2 sebastian sebastian 4096 24. Sep 21:02 Desktop
drwxr-xr-x 2 sebastian sebastian 4096 27. Sep 11:48 downloads
drwxr-xr-x 2 sebastian sebastian 4096 25. Sep 21:57 mp3
drwxr-xr-x 2 sebastian root      4096 27. Sep 13:09 scrots
sebastian@debian-sid:~$ ls -l | grep mp3
drwxr-xr-x 2 sebastian sebastian 4096 25. Sep 21:57 mp3
sebastian@debian-sid:~$ python
Python 2.5.2 (r252:60911, Aug  8 2008, 09:22:44) 
[GCC 4.3.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import Popen, PIPE
>>> ls = Popen(['ls', '-l'], stdout=PIPE)
>>> grep = Popen(['grep', 'mp3'], stdin=ls.stdout, stdout=PIPE)
>>> out = grep.communicate()[0]
>>> print out
drwxr-xr-x 2 sebastian sebastian 4096 25. Sep 21:57 mp3
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Hallo, das ist zwar auch interessant, aber nicht das was ich gerne hätte.
lunar

@arghargh
Ein Programm hat zwei Standardströme zur Ausgabe, sys.stdout und sys.stderr. Beide haben verschiedene Dateideskriptoren und sind somit voneinander unabhängig. Die normalen Umleitungsoperatoren der Shell operieren nur auf FD 0, also sys.stdout.

Wenn du also zur Ausgabe wirklich wichtiger Daten sys.stderr nutzt, erscheinen diese auch auf dem Bildschirm, wenn der Nutzer eine Umleitung vornimmt.

Code: Alles auswählen

# cat stdout.py
import sys
print >> sys.stdout, 'This is standard output'
print >> sys.stderr, 'This is standard error'

# python stdout.py
This is standard output
This is standard error

# python stdout.py > /dev/null
This is standard error

# python stdout.py &> /dev/null
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Hi,

daran hatte ich sogar zwischendurch auch mal gedacht - und wieder vergessen.

Da ich annehme, dass unter Linux stderr "gelogged" wird, sollte ich das aber wohl lieber nicht missbrauchen. Oder ist der Trick üblich?
BlackJack

Was meinst Du mit "geloggt"? Und was für ein Trick? `stderr` ist dafür Da den Anwender über Fehler, oder falls er das wünscht über den Fortschritt des Programms und Ähnliches zu informieren. Da ist kein Trick dabei.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Stderr klingt so, als hätte man sich dabei gedacht, dass normale Ausgaben nicht dafür vorgesehen wären.
Aber wenn es üblich ist, die Programmausgabe (wie von print) über stderr ablaufen zu lassen, um so besser, dann ist ja stdout für die Daten zum Pipen frei.
lunar

arghargh hat geschrieben:Stderr klingt so, als hätte man sich dabei gedacht, dass normale Ausgaben nicht dafür vorgesehen wären.
Es ist für Ausgaben gedacht, die der Nutzer unbedingt sehen sollte. Deswegen leiten Shells normalerweile auch nur stdout um. Und weil getreu dem Unix Motto "no news is good news" normalerweise nur Fehlermeldungen ausgegeben werden und keine Erfolgsmeldungen, sind halt die einzigen Ausgaben, die der Nutzer unbedingt sehen sollte, Fehlerausgaben. Daher der Name ...

stdout ist dagegen auch eigentlich nicht für "Nachrichten" an den Nutzer gedacht, sondern eben für Dateien, die gerne auch mal zur Weiterverarbeitung gepiped werden.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Der Nutzer hängt nutzt das Prog einach so:

Code: Alles auswählen

fooprogramm | tee | grep foo
Antworten