Problem mit os.popen

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
SteeWeeDee
User
Beiträge: 34
Registriert: Donnerstag 18. September 2008, 14:10

Mittwoch 25. Februar 2009, 14:05

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?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 25. Februar 2009, 14:10

Ich kann den Fehler nicht reproduzieren. Ab Python 2.4 nutzt man aber eh subprocess fuer sowas.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
kbr
User
Beiträge: 895
Registriert: Mittwoch 15. Oktober 2008, 09:27

Mittwoch 25. Februar 2009, 14:46

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.
SteeWeeDee
User
Beiträge: 34
Registriert: Donnerstag 18. September 2008, 14:10

Mittwoch 25. Februar 2009, 15:18

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)
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 25. Februar 2009, 15:27

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.
SteeWeeDee
User
Beiträge: 34
Registriert: Donnerstag 18. September 2008, 14:10

Mittwoch 25. Februar 2009, 16:18

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?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Mittwoch 25. Februar 2009, 16:20

Cool. :lol:

Code: Alles auswählen

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

Gruß,
Manuel
BlackJack

Mittwoch 25. Februar 2009, 21:16

@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.
Antworten