Seite 1 von 1

Modul 'subprocess'

Verfasst: Freitag 11. Januar 2008, 18:31
von Markus12
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 :)

Re: Modul 'subprocess'

Verfasst: Freitag 11. Januar 2008, 18:39
von Leonidas
Markus12 hat geschrieben:Weitere Argumente zu übergeben ist nicht möglich.
Wieso? Fehlermeldung? Code?

Verfasst: Freitag 11. Januar 2008, 19:56
von Markus12
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?

Verfasst: Freitag 11. Januar 2008, 20:01
von Markus12
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...

Verfasst: Freitag 11. Januar 2008, 20:15
von Leonidas
Versucht doch mal ``Popen([r'C:\Programme\Mozilla Firefox\firefox.exe', 'seite'], sonstige_parameter)``.

Verfasst: Freitag 11. Januar 2008, 20:18
von 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.

Verfasst: Freitag 11. Januar 2008, 20:23
von Markus12
Ich habe auch gelesen, dass man executable ebenso verwenden kann, oder den Exe-file als erstes Argumente übergibt!
Ich werde es mal versuchen, danke!

Verfasst: Freitag 11. Januar 2008, 20:40
von Markus12
@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...

Verfasst: Freitag 11. Januar 2008, 20:46
von Markus12
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...

Verfasst: Freitag 11. Januar 2008, 20:49
von Markus12
@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...

Verfasst: Freitag 11. Januar 2008, 20:54
von BlackJack
@Markus12: Ja auch ein Tupel ist eine Sequenz. Das hast Du aber auch nicht gemacht.

Verfasst: Freitag 11. Januar 2008, 21:04
von Markus12
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*

Verfasst: Freitag 11. Januar 2008, 21:51
von 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.

Verfasst: Freitag 11. Januar 2008, 22:00
von gerold
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
:-)

Verfasst: Freitag 11. Januar 2008, 22:51
von Markus12
richtig, nicht gerold hat eine Antwort geschrieben, sondern du, BlackJack, und lunar *g*

Verfasst: Freitag 11. Januar 2008, 22:52
von Markus12
mhhh, aber wie kann ich das jetzt lösen?

Verfasst: Freitag 11. Januar 2008, 22:55
von 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!

Verfasst: Samstag 12. Januar 2008, 18:21
von Markus12
Ok danke, werde mich damit weiter beschäftigen...