PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Python] Daten aus Linux Pipe lesen



lrg0
03.03.2012, 18:21
Hallo
Ich will ein Python-Script beim Starten mit Daten aus einem anderen Programm füttern können.
echo "hallo" | main.py

Das Script soll aber auch ohne Fehler oder merkwürdigem Verhalten aufgerufen werden können, ohne Daten mit einer Pipe zu übergeben.

Wie kann ich das in Python realisieren?


Mit merkwürdigem Verhalten meine ich, dass zum Beispiel aus stdin gelesen wird bis EOF gesendet wird.

Hu5eL
03.03.2012, 19:08
und wo ist da das Problem? Prüf einfach ob Parameter übergeben wurden. Falls nicht evtl STDIN horchen und hier info holen...

lrg0
03.03.2012, 20:57
Hast du das schon mal probiert? Es klappt nicht.
Wenn ich etwas mit | übergebe landet es nicht in sys.argv

---------- Post added at 21:57 ---------- Previous post was at 20:59 ----------

Bin jetzt zur Lösung mit sys.stdin.isatty() gekommen



#!/usr/bin/python
import sys
print sys.stdin.isatty()

Fraud4Life
03.03.2012, 21:53
root@www3.bankenverband.de:~/Work > cat test.py
import sys
while 1:
try:
line = sys.stdin.readline()
except KeyboardInterrupt:
break

if not line:
break

print line
root@www3.bankenverband.de:~/Work > echo fraud is philanthropy | python test.py
fraud is philanthropy

root@www3.bankenverband.de:~/Work >






:-/

lrg0
03.03.2012, 22:57
Fraud4Life: Da wartet das Script auf EOF. Das ist was ich nicht wollte. Mit sys.stdin.isatty() kann man da ne schnelle Lösung erstellen. Finde nur leider nicht viel zu der Methode isatty(). Kann nicht genau sagen, was das ist und wie/warum das funktioniert.

Fraud4Life
04.03.2012, 00:05
root@ws-fra1.win-ip.dfn.de:~/Work > cat sick.py
#!/usr/bin/env python
import sys

def main(argv = sys.argv):

if not sys.stdin.isatty():
for s in sys.stdin.readlines():
print "Pipe(d): " + s,

# Parameter, yo
L = sys.argv[1:]
if len(L)!=0:
print "CLI Parameter-List: " + str(L)
sys.exit(0)
pass

if __name__ == "__main__":
try:
main(sys.argv)
except KeyboardInterrupt:
pass

# EOF, yo
root@ws-fra1.win-ip.dfn.de:~/Work > ./sick.py
root@ws-fra1.win-ip.dfn.de:~/Work > ./sick.py siiiickk
CLI Parameter-List: ['siiiickk']
root@ws-fra1.win-ip.dfn.de:~/Work > ./sick.py siiiickk 123 456 no skills
CLI Parameter-List: ['siiiickk', '123', '456', 'no', 'skills']
root@ws-fra1.win-ip.dfn.de:~/Work > echo lol pipaments |./sick.py
Pipe(d): lol pipaments
root@ws-fra1.win-ip.dfn.de:~/Work > echo gangbangparty bei steffie > test.txt
root@ws-fra1.win-ip.dfn.de:~/Work > cat test.txt |./sick.py
Pipe(d): gangbangparty bei steffie
root@ws-fra1.win-ip.dfn.de:~/Work >