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
Modul 'subprocess'
Hier ist ein Beispielcode:
(*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:
Hier im letzten Beispiel halt ohne zusätzliche Argumente, nur Exe-File und Internetseite...
Hat da jemand vielleicht eine Lösung?
Code: Alles auswählen
Popen(executable=r'C:\Programme\Mozilla Firefox\firefox.exe', args='"%s" "%s" "%s"' %('www.web.de', 'thomas12', 'hallo123'))
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')
Hat da jemand vielleicht eine Lösung?
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...
Keine Ahnung warum...
Das sind halt Seitenladefehler...
Sag mal, hast du dir die Dokumentation zu subprocess überhaupt durchgelesen? "executable" verwendet man eigentlich nicht, und args sollte besser eine Liste sein:
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.
Code: Alles auswählen
subprocess.Popen(['C:\Programme\Mozilla Firefox\firefox.exe', username, password])
Ich würde einfach den eingebauten Passwort-Manager nutzen, und das Passwort darin ablegen.
@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...
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...
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...Leonidas hat geschrieben:Versucht doch mal ``Popen([r'C:\Programme\Mozilla Firefox\firefox.exe', 'seite'], sonstige_parameter)``.
@lunar:
Dein Code kann auch nicht gehen, da die Internetseite nicht verbaut wurde...
Code: Alles auswählen
subprocess.Popen(['C:\Programme\Mozilla Firefox\firefox.exe', username, password])
@Markus12: Ja auch ein Tupel ist eine Sequenz. Das hast Du aber auch nicht gemacht.
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*
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.
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.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo BlackJack!BlackJack hat geschrieben:Du solltest besser davon ausgehen das gerold in den meisten Fällen weiss wovon er spricht.
Danke! Aber diesmal bin ich unschuldig.
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Das ist in dieser Form einfach nur Unsinn!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*
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!