Seite 1 von 1

Pipes, Handles und Bildschirmausgabe?

Verfasst: Samstag 27. September 2008, 14:30
von arghargh
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

Verfasst: Samstag 27. September 2008, 14:54
von snafu
subprocess.PIPE kann das.

Verfasst: Samstag 27. September 2008, 15:13
von arghargh
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.

Verfasst: Samstag 27. September 2008, 15:25
von snafu

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

Verfasst: Samstag 27. September 2008, 16:30
von arghargh
Hallo, das ist zwar auch interessant, aber nicht das was ich gerne hätte.

Verfasst: Samstag 27. September 2008, 16:38
von 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

Verfasst: Samstag 27. September 2008, 17:32
von arghargh
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?

Verfasst: Samstag 27. September 2008, 17:42
von 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.

Verfasst: Samstag 27. September 2008, 19:49
von arghargh
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.

Verfasst: Sonntag 28. September 2008, 10:40
von 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.

Verfasst: Sonntag 28. September 2008, 13:24
von audax
Der Nutzer hängt nutzt das Prog einach so:

Code: Alles auswählen

fooprogramm | tee | grep foo