Frage zu subprocess.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
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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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!?
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.... :(
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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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?
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

@ heiliga horsd, vergiss doch ``shell`` und nutze den ``stdout``-Parameter. Wie BlackJack geschrieben hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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!
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
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....
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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()
the more they change the more they stay the same
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!
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)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
heiliga horsd

Hey Danke! Den Trick kannte ich gar nicht, sehr hilfreich!
Antworten