Tutorial zu Subprocesses

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.
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

Hallo

kennt jemand ein für den Anfänger verständliches, am besten deutsches Tutorial zu Unterprozessen?
Hab mir die Englische Seite dazu durchgelesen und werde daraus nicht schlau.
Vorallem interessiert mich die Struktur, denn dazu habe ich keine wirkliche Beschreibung gefunden.

MfG
Warhead
User
Beiträge: 15
Registriert: Montag 28. Juni 2010, 12:54

Hallo,

leider nicht in Deutsch, aber immer wieder gerne gelesen und referenziert:
When altering one's own mind becomes as easy as programming a computer… What does it mean to be human?
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

Hm schade

Trotzdem danke
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

Habe jetzt ein paar Versuche mit subprocess.Popen('root', shell=True) und subprocess.Popen('rm /pf/ad/Datei', shell=True) gestartet

Leider ist da nichts geschehen, d.h. nach dem Vorgang war die Datei noch vorhanden. Durch manuelle Eingabe im Terminal wurde die Datei jedoch gelöscht.

Außerdem wollte ich die Programmkataloge per subprocess.Popen('apt-get update', shell=True) aktualisieren, doch da kam die Meldung, dass dpkg "locked" ist und "are you root?"

Was noch bemerkenswert war, war der Befehl find /| grep Datei
Normalerweise sollten nur Dateien gefunden werden, die dem Dateinamen entsprechen, doch die Ausführung über Subprocess führt zur Anzeige von Dateien, die bei weitem nichts mit dem Dateinamen zutun haben.


Was mache ich falsch?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erstens, sind die Aufrufe von subprocess jeweils voneinander unabhängig. Wenn du ``root`` ausführst (was soll das überhaupt sein?) und danach ``rm foobar`` heißt das nicht, dass ``rm foobar`` mit root-Rechten ausgeführt wurde. Zweitens: man sollte die Parameter nicht als String sondern als Liste angeben. Drittens: man sollte shell=True vermeiden.

Das siehst du etwa am Aufruf von ``apt-get``. Du bist nicht root. Als normaler User kann man apt-get nicht dazu bringen irgendwie die installierten Pakete zu aktualisieren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

Ich verwende das Betriebssystem Maemo, unter dem man mit dem Befehl "root" oder "sudo gainroot" Rootrechte bekommt.Der Befehl ist also gültig.

wie soll ich die Parameter als Liste angeben bzw welche Parameter überhaupt?
Und was soll ich anstelle von shell=True benutzen?
BlackJack

@Robokopp: Der Befehl selbst mag ja gültig sein, der gilt aber auch nur "für sich selbst". Wenn Du in einem `subprocess`-Aufruf root Rechte erlangst, dann gilt das nur für *genau den* Kindprozess und nicht für Befehle die Du danach mit weiteren `subprocess`-Aufrufen startest. Das müsstest Du also in einem Aufruf machen. Zum Beispiel in dem Du den Befehl und seine Argumente an ``sudo`` als Argumente übergibst.

Befehl und Parameter solltest Du als Liste übergeben und dafür das ``shell=True`` weglassen. Dann wird das nämlich nicht über eine zusätzliche Shell ausgeführt, die man dafür eigentlich gar nicht braucht. Und man muss sich bei den Parametern auch nicht darum kümmern, dass bestimmte Zeichen vor der Shell geschützt werden müssen.

Du musst Dich damit auseinander setzen, wie Prozesse starten und Parameter übergeben auf Programmebene funktioniert. Also was zum Beispiel eine Shell mit der Zeichenkette macht, die Du eingibst bevor damit ein Prozess gestartet werden kann.
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

Okay
aber ich kann die Terminalbefehle nicht aneinanderreihen innerhalb eines Subprozesses, also so subprocess.Popen("root","apt-get update", etc...) oder?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was du nutzen willst ist dann eher sudo
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

wieso denn bitte sudo?
der Befehl heißt nunmal root auf der Plattform
Mir ging es nur um die Aneinanderreihung der Befehle
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Hallo

dann übergib die Argumente doch mal als Liste wie es dir schon geraten wurde

Code: Alles auswählen

subprocess.Popen(["root", "apt-get", "update"])
Gruß....busfahrer
Alles wird gut ;-)
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

achso war das gemeint
vielen dank :lol:

ohne shell=True geht bei mir garnix
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Moment, kannst du ``root apt-get foobar`` ausführen? oder erst ``root`` und dann `at-get foobar``?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

nein
er führt zwar den root Befehl aus, aber danach ist schluss.

Habe es als Liste ausgeführt, wie Busfahrer beschrieben hat

mfg
BlackJack

@Robokopp: Die Frage war ob *Du* ohne ein Programm das auf der Kommandozeile so ausführen kannst. Kann ``root`` das überhaupt? Oder braucht es dafür vielleicht eine Option!? Oder nimm doch einfach ``sudo``. Aber bitte in dessen Dokumentation schauen und nicht wild raten.
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

achso
E: invalid operation foobar ist das Resultat
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``foobar`` war doch nur ein Platzhalter für irgendeine Operation. Die frage ist halt, ob du mit root direkt Programme mit root-Rechten starten kannst, oder das nur in der von ``root`` geöffneten root-Shell machen kanns. Mir scheint dass das funktioniert. Aber gut, probier mal ``root whoami`` auszuführen, um sicherzugehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

Achso

Ja es geht nur, wenn ich schon root bin und nicht wenn ich den root-Befehl mit einem anderen kombiniere
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ok, das ist schlecht. Kannst du das nicht mit ``sudo`` nutzen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Robokopp
User
Beiträge: 64
Registriert: Mittwoch 3. November 2010, 12:04

den sudo befehl kennt er zwar, jedoch verlangt er ein passwort und ich wüsste nich, dass ich irgendwann mal ein passwort auf dem handy festgelegt hab außer dem pin
und der funktioniert nicht
Antworten