Modul 'subprocess'

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
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Hallo,
ich möchte mir ein Programm schreiben, mit dem ich Mozilla öffne, ihm als Argument die Internetseite übergebe und anschließend noch zwei weitere Argumente: Benutzername und Passwort. Das wollte ich mit dem Modul 'subprocess' realisieren.
Ich kann allerdings als Argumente nur den Exe-File von Mozilla und ein optionales Argument übergeben, das hier die Internetseite sein muss. Weitere Argumente zu übergeben ist nicht möglich.

Hat da jemand eine Idee, wie man das machen könnte?

(Es geht hier im Übrigen um KEIN Knackprogramm, sowas mache ich nicht. Ich will mich nur automatisch auf einer Seite einloggen...)

Grüße Markus :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Markus12 hat geschrieben:Weitere Argumente zu übergeben ist nicht möglich.
Wieso? Fehlermeldung? Code?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Hier ist ein Beispielcode:

Code: Alles auswählen

Popen(executable=r'C:\Programme\Mozilla Firefox\firefox.exe', args='"%s" "%s" "%s"' %('www.web.de', 'thomas12', 'hallo123'))
(*Daten sind ausgedacht*)

Das habe ich allerdings erst eben bemerkt, dass man den Exe-File bei executable machen sollte.

Bis jetzt habe ich es immer so gemacht:

Code: Alles auswählen

Popen('"%s" "%s"' %(r'C:\Programme\Mozilla Firefox\firefox.exe', 'www.google.de')
Hier im letzten Beispiel halt ohne zusätzliche Argumente, nur Exe-File und Internetseite...

Hat da jemand vielleicht eine Lösung?
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Fehlermeldung gibt es nicht. Das einzige, was aber passiert ist, dass Firefox geöffnet wird, beim 1. Beispiel werden 2 Seiten geöffnet mit einmal www.thomas12.de und einmal eine Seite mit www.hallo.123.de^^

Keine Ahnung warum...
Das sind halt Seitenladefehler...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Versucht doch mal ``Popen([r'C:\Programme\Mozilla Firefox\firefox.exe', 'seite'], sonstige_parameter)``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Sag mal, hast du dir die Dokumentation zu subprocess überhaupt durchgelesen? "executable" verwendet man eigentlich nicht, und args sollte besser eine Liste sein:

Code: Alles auswählen

subprocess.Popen(['C:\Programme\Mozilla Firefox\firefox.exe', username, password])
Was dein eigentliches Problem angeht: Das lässt sich wohl nicht so lösen.

Ich würde einfach den eingebauten Passwort-Manager nutzen, und das Passwort darin ablegen.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Ich habe auch gelesen, dass man executable ebenso verwenden kann, oder den Exe-file als erstes Argumente übergibt!
Ich werde es mal versuchen, danke!
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

@lunar:
Außerdem steht dort, dass man einen String oder eine Sequenz übergeben kann, du müsstest doch wissen, dass auch ein Tuple eine Sequenz ist ;)

Ich habe zwar nicht die Dokumentation, aber dafür eine andere englische Erklärung gelesen, glaube sogar, dass es daraus entnommen war...
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Leonidas hat geschrieben:Versucht doch mal ``Popen([r'C:\Programme\Mozilla Firefox\firefox.exe', 'seite'], sonstige_parameter)``.
Ich habe mir schon gedacht, dass das nicht funktioniert, denn dein Argument "sonstige_parameter" müsste eine Integer sein, damit es funktioniert, weil bufsize gefragt war...
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

@lunar:

Code: Alles auswählen

subprocess.Popen(['C:\Programme\Mozilla Firefox\firefox.exe', username, password])
Dein Code kann auch nicht gehen, da die Internetseite nicht verbaut wurde...
BlackJack

@Markus12: Ja auch ein Tupel ist eine Sequenz. Das hast Du aber auch nicht gemacht.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

ja stimmt, da habe ich mich vertan, aber ich brauche auch keine Sequenz zu übergeben. ER hat glaube ich nicht die Doku gelesen, da steht nämlich, dass wenn man eine Sequenz übergibt, diese dann automatisch zu einem String konvertiert wird! Also brauche ich keine Liste *lach*
BlackJack

Du solltest besser davon ausgehen das gerold in den meisten Fällen weiss wovon er spricht. :-)

Wenn man den Programmnamen und die Argumente in einer Sequenz übergibt, wird das Programm mit genau dieser Liste an Argumenten *direkt* aufgerufen und eben gerade *nicht* über den Umweg über eine Zeichenkette und eine Shell die diese Zeichenkette dann wieder in einzelne Argumente aufteilt. Wobei man dann aufpassen muss, wie die Shell das macht und das Zeichen mit spezieller Bedeutung für die Shell entsprechend "escape"t werden.

Welche Shell? Das ist abhängig vom Betriebssystem und welche Shell der jeweilige Benutzer eingestellt hat. Damit ist nicht einmal sicher welche Zeichen man wie "escape"n muss. Ist also eindeutig die schlechtere Wahl gegenüber der Sequenz und der direkten Übergabe der Argumente.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BlackJack hat geschrieben:Du solltest besser davon ausgehen das gerold in den meisten Fällen weiss wovon er spricht. :-)
Hallo BlackJack!

Danke! Aber diesmal bin ich unschuldig. :lol:

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

richtig, nicht gerold hat eine Antwort geschrieben, sondern du, BlackJack, und lunar *g*
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

mhhh, aber wie kann ich das jetzt lösen?
lunar

Markus12 hat geschrieben:ja stimmt, da habe ich mich vertan, aber ich brauche auch keine Sequenz zu übergeben. ER hat glaube ich nicht die Doku gelesen, da steht nämlich, dass wenn man eine Sequenz übergibt, diese dann automatisch zu einem String konvertiert wird! Also brauche ich keine Liste *lach*
Das ist in dieser Form einfach nur Unsinn!

Unter Linux stimmt das schon mal gar nicht, dort wird bei einem Aufruf mit einer Liste ge"fork"ed und anschließend im Kind-Prozess "execvp" ausgeführt. Das lädt die ausführbare Datei direkt in den Speicher der aktuellen Anwendung. Das funktioniert ohne Strings. Schon allein deswegen sollte man niemals einen String verwenden. Das führt nämlich unter Linux dazu, dass der gesamte(!) String als ein Argument angesehen wird, so dass dein bisheriger Weg (das zweite Beispiel in deinem Posting) niemals zum Erfolg führen kann!

Ein String kannst du nur dann sinnvoll verwenden, wenn du shell=True setzt. Wer das allerdings in seinem Programm macht, hat das Aufrufen von Kindprozessen absolut nicht verstanden. Da spielen nämlich alle Shell-Quoting Regeln mit, so dass eine geschickt eingeschleuste Nutzereingabe "unerwünschte" Nebeneffekte haben kann...

Unter Windows ist es richtig, dass (weil die WinAPI so bescheuert designed wurde) die Liste in einen String konvertiert wird. Allerdings mit einer speziellen Funktion, die sich um das (zumindest für die MS C Runtime) korrekte Escaping der übergebenen Argumente. Du machst kein Escaping, deine simple Tupel-Methode schlägt völlig fehl, sobald auch nur ein Anführungszeichen im Passwort vorkommt.

Wie du das Problem lösen kannst, weiß ich nicht. Firefox nimmt Passwort und Nutzername nicht auf der Kommandozeile entgegen (das wäre bei Web-Form-Logins auch gar nicht vernünftig zu realisieren). Folglich ist das Ganze hier OT. Schau mal auf der Firefox-Website nach...

Was die Verwendung des subprocess-Moduls angeht, schau in die Doku, ansonsten haben Leonidas und ich schon die korrekten Beispiele gepostet.

@gerold
Gib doch endlich zu, dass du meinen Account gecrackt hast, und hier unter falschem Namen unsinniges Zeug verbreitest ;) BlackJack hat dich durchschaut!
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Ok danke, werde mich damit weiter beschäftigen...
Antworten