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
Tutorial zu Subprocesses
Hallo,
leider nicht in Deutsch, aber immer wieder gerne gelesen und referenziert:
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?
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?
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?
-
- 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.
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
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?
wie soll ich die Parameter als Liste angeben bzw welche Parameter überhaupt?
Und was soll ich anstelle von shell=True benutzen?
@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.
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.
Hallo
dann übergib die Argumente doch mal als Liste wie es dir schon geraten wurde
Gruß....busfahrer
dann übergib die Argumente doch mal als Liste wie es dir schon geraten wurde
Code: Alles auswählen
subprocess.Popen(["root", "apt-get", "update"])
Alles wird gut ;-)
@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.
-
- 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