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 :oops:
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``.

Code: Alles auswählen

In [276]: 'true' == True
Out[276]: False

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 :cry:, 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!