Seite 1 von 1

Problem mit os.popen

Verfasst: Mittwoch 25. Februar 2009, 14:05
von SteeWeeDee
Hallo!

Habe folgendes Problem mit os.popen: Wenn ich es verwende bekomme ich die Fehlermeldung Schreibfehler: Broken Pipe.

Z.B.

Code: Alles auswählen

import os
a = os.popen("ls")
bekomme ich beim ausführen den Fehler:

ls: Schreibfehler: Broken Pipe.

Jemand eine Ahnung was man dagegen tun kann?

Verfasst: Mittwoch 25. Februar 2009, 14:10
von Rebecca
Ich kann den Fehler nicht reproduzieren. Ab Python 2.4 nutzt man aber eh subprocess fuer sowas.

Verfasst: Mittwoch 25. Februar 2009, 14:46
von kbr
Rebecca hat geschrieben:Ich kann den Fehler nicht reproduzieren. Ab Python 2.4 nutzt man aber eh subprocess fuer sowas.
Vielleicht noch als Ergänzung: die popen-Funktionen sind seit Python 2.6 deprecated und in Python 3.0 nicht mehr verfügbar.

Verfasst: Mittwoch 25. Februar 2009, 15:18
von SteeWeeDee
Gut habe es jetzt mit subprocess gemacht:

Ich möchte die Logdateien die in einem Verzeichnis sind mit ls auflisten:

Code: Alles auswählen

from subprocess import *

temppath = os.path.abspath(".")
path = os.path.join(temppath,r"Logfiles") # Pfad in der die Logs liegen

p = Popen(["ls " +path], stdout=PIPE)
out = p.communicate()[0]
Dann kommt die Fehlermeldung (dateien ist die Methode zum auflisten):

File "/home/stephan/gui.py", line 270, in dateien
p = POPEN(["ls " +path], stdout=PIPE)
File /usr/lib/python2.5/subprocess.py, in line 594, in __init__ errread, errwrite)
File /usr/lib/python2.5/subprocess.py, in line 1147, in _execute_child raise child_exception)

Verfasst: Mittwoch 25. Februar 2009, 15:27
von DasIch
Sternchen-Importe sind böse.

Außerdem nutzt du Python und nicht die bash, ``subprocess`` sollte man vermeiden, trotzdem soll man eine Liste mit Argumenten übergeben keine Liste mit dem Befehl als string. Wie auch immer, nutze ``os.listdir`` um eine Liste aller Dateien und Ordner in einem Verzeichnis zu bekommen.

Verfasst: Mittwoch 25. Februar 2009, 16:18
von SteeWeeDee

Code: Alles auswählen

p = Popen(["ls"], stdout=PIPE) 
funktioniert und gibt mir das Verzeichnis aus (leider nur das, worin das Programm liegt)

aber

Code: Alles auswählen

p = Popen(["os.listdir"], stdout=PIPE) 
kommt wiederum die Fehlermeldung, dich ich in dem Post um 16:18 geschrieben habe.

Gibt es noch eine andere Möglichkeit eine Ausgabe in eine Variable zu schreiben außer popen und subprocess? Oder was mache ich denn bei der Benutzung falsch?

Verfasst: Mittwoch 25. Februar 2009, 16:20
von helduel
Cool. :lol:

Code: Alles auswählen

>>> import os
>>> os.listdir
<built-in function listdir>
:wink:

Gruß,
Manuel

Verfasst: Mittwoch 25. Februar 2009, 21:16
von BlackJack
@SteeWeeDee: In beiden Fällen versuchst Du ein Programm auszuführen, das es nicht gibt.

Auf Deinem Rechner wird es weder das Programm ``'ls ' + path`` geben, noch das Programm 'os.listdir'. Das Argument von `subprocess.Popen` muss eine Liste bzw. Sequenz sein, mit dem Programmnamen, und nur dem, gefolgt von allen Argumenten als einzelne Elemente. Also das was das aufgerufene Programm als `sys.argv` bekommt.