Seite 1 von 1
Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:19
von heiliga horsd
Moin,
wie kann ich mit subprocess.Popen etwas in der Shell sagen, sie soll etwas in eine Datei schreiben?
Code: Alles auswählen
subprocess.Popen(['ls', '-l', '> /home/xx/Desktop/ls.txt'])
funktioniert leider (warum auch immer?) nicht, kann mir jemand nen Tipp geben?
Lg HH
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:31
von cofi
heiliga horsd hat geschrieben:wie kann ich mit subprocess.Popen etwas in der Shell sagen, sie soll etwas in eine Datei schreiben?
Mit dem Aufruf wird keine Shell gestartet, also kann die Shell das auch gar nicht interpretieren
Entweder nimmst du `shell=True` auf, oder noch besser du schreibst das selbst in die Datei.
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:33
von BlackJack
@heiliga horsd: Das funktioniert so nicht weil da keine Shell beteiligt ist, die das '>' als Umleitung interpretieren könnte. Du kannst doch aber angeben was mit `stdout` und `stderr` passieren soll. Also zum Beispiel mit den entsprechenden Konstanten aus `subprocess` Umleitungen angeben, oder offene Dateiobjekte in welche die Ausgaben dann geschrieben werden. Gibt's da keine Beispiele in der Dokumentation!?
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:37
von heiliga horsd
Achso ich dachte das wird automatisch per Shell gemacht
Naja das Problem/Sinn der Sache ist, dass das Programm erst zur Laufzeit erfährt, was aufgerufen wird. Ich brauch halt öfters mal irgendwelche Befehle, und die dauernd in der Bash-History zu suchen nervt gewaltig! Daher dachte ich, schreib ich mir ein Programm, welches eine Textdatei ausließt (mit den Befehlen drin) und dann kann man per Tastendruck einen davon starten.... das mit dem shell=true werd ich sofort ausprobieren!
edit://
Code: Alles auswählen
subprocess.Popen(['ls', '-l', '> /home/xx/Desktop/ls.txt'], shell='true')
Rührt sich nix....

Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:44
von BlackJack
@heiliga horsd: Wenn Du das von einer Shell interpretieren lassen willst, dann übernimmt *die* ja das zerlegen der Argumente. Und die Zeichenkette ``'true'`` ist etwas anderes als der Wahrheitswert ``True``.
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:46
von Leonidas
Du solltest dir echt die Dokumentation ansehen, schon allein dein 'true' lässt einen Python-Programmierer grausen. Und Blackjack hat ja schon die Lösung verraten, also 1) Beitrag nochmal lesen 2) Beitrag verstehen 3) Funktionierenden Code schreiben.
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:48
von heiliga horsd
Code: Alles auswählen
subprocess.Popen(['ls -l > /home/michi/Desktop/ls.txt'], shell=True)
Funktioniert wunderbar! Danke euch beiden!!
Nun noch eine Frage: Wenn ich etwas per root ausführen will - sprich mit su/sudo -, brauch ich da irgendeinen Kniff/Trick? Immerhin muss ich dann ja noch irgendwie das Passwort übergeben und weiß grad nicht so recht wie ich das machen soll....
@Leonidas: Joa das mit dem True war echt peinlich, bin heute ein wenig durcheinander.... schlecht geschlafen, schlechtes Wetter, bisschen daneben...
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:53
von cofi
Das laesst den Admin in mir irgendwie grausen. Was genau hast du denn vor?
Anders gefragt, warum laesst sich das beispielsweise nicht mit (Bash-)Aliasen loesen, oder indem du den Interpreter mit Root-Rechten startest?
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 16:58
von heiliga horsd
Über das Root-Problem hab ich mir bisher kaum Gedanken gemacht, manchmal hab ich halt bspw. Probleme mit den Rechten (Bug in Ubuntu?), bspw. kann ich dann nur als Root Geräte mounten oder muss per halt (braucht root-Rechte) den PC ausschalten, weil er sich sonst nur abmeldet etc.
Interpreter mit Root-Rechten starten wäre eine Idee, macht mir aber auch irgendwie ein mulmiges Bauchgefühl wenn man dran denkt, dass man da doch plötzlich recht viel kaputt machen kann.
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 17:11
von Leonidas
@ heiliga horsd, vergiss doch ``shell`` und nutze den ``stdout``-Parameter. Wie BlackJack geschrieben hat.
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 17:19
von heiliga horsd
Ist denke ich besser wenn ich das für heute ruhen lasse und mir ein anderes mal das mit dem stdout durchlese, danke trotzdem an alle!
Re: Frage zu subprocess.Popen
Verfasst: Sonntag 18. Juli 2010, 20:10
von noisefloor
Hallo,
Über das Root-Problem hab ich mir bisher kaum Gedanken gemacht, manchmal hab ich halt bspw. Probleme mit den Rechten (Bug in Ubuntu?), bspw. kann ich dann nur als Root Geräte mounten oder muss per halt (braucht root-Rechte) den PC ausschalten, weil er sich sonst nur abmeldet etc.
Nee, nee - das ist kein Bug, sondern gewollt. Führ' dir am besten nochmal des Rechte-System von Linux und die Besonderheiten von Ubuntu vor Augen (oder les' bei
http://wiki.ubuntuusers.de nach

). Ggf. ist auch PolicyKit was für dich, je nach Problemstellung / "Welches-Recht-wird-gebraucht?". Wobei PolKit nicht wirklich trivial ist...
Gruß, noisefloor
Re: Frage zu subprocess.Popen
Verfasst: Montag 19. Juli 2010, 13:05
von heiliga horsd
Über Policy-Kit hab ich mich informiert, ich könnte es durchaus mit pkexec machen! IMO ist das sicherlich ein Bug, wenn ich meinen PC heute normal ausschalten kann und morgen nur mit Root-Rechten, heute auf USB-Geräte zugreifen kann und morgen nicht etc. und sich das regelmäßig wiederholt kann das nicht gewollt sein.... zumindest kenne ich keinen, der sowas will....
Re: Frage zu subprocess.Popen
Verfasst: Montag 19. Juli 2010, 15:29
von Dav1d
Code: Alles auswählen
with open('/home/michi/Desktop/ls.txt', 'w') as ls:
stdoutdata = subprocess.Popen(['ls', '-l'], shell=False).communicate()[0]
ls.write(stdoutdata)
und wieso immer einen externen Prozess ausführen

, wenn Python doch so eine schöne std-Bibliothek hat:
os.listdir()
Re: Frage zu subprocess.Popen
Verfasst: Montag 19. Juli 2010, 18:29
von heiliga horsd
ls -l war ja nur ein exemplarisches Beispiel, ich will halt nur den Prozess starten und eventuell anfallende Ausgaben irgendwie speichern können, Weiterverarbeitung im Programm ist nicht nötig, trotzdem danke für dein Beispiel!
Re: Frage zu subprocess.Popen
Verfasst: Montag 19. Juli 2010, 19:14
von lunar
@Dav1d: Das ist falsch (statt "shell=False" muss da "stdout=subprocess.PIPE" stehen), und geht eh kürzer:
Code: Alles auswählen
with open('/home/michi/Desktop/ls.txt', 'w') as sink:
subprocess.call(['ls', '-l'], stdout=sink)
Re: Frage zu subprocess.Popen
Verfasst: Mittwoch 21. Juli 2010, 11:33
von Rebecca
heiliga horsd hat geschrieben:Ich brauch halt öfters mal irgendwelche Befehle, und die dauernd in der Bash-History zu suchen nervt gewaltig!
Ich weiss ja nicht so genau, was du so machst, aber Ctrl-R im Terminal kennst du?
Re: Frage zu subprocess.Popen
Verfasst: Mittwoch 21. Juli 2010, 13:06
von heiliga horsd
Hey Danke! Den Trick kannte ich gar nicht, sehr hilfreich!