Python Script auf zweitem PC aufrufen

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
Benutzeravatar
bake
User
Beiträge: 29
Registriert: Dienstag 20. November 2007, 08:12
Wohnort: Hamburg

Vielleicht gab es ja schon mal einen ähnlichen Thread, habe aber per Suche keinen gefunden. Vielleicht sind mir ja auch nur die falschen Begriffe eingefallen. :)

Zu meinem Problem: Ich habe hier zwei Rechner stehen und möchte gerne von dem einen (Ubuntu 8.04) innerhalb einer Funktion ein Script auf dem anderen PC (Windows XP) ausführen. Wie ließe sich das bewerkstelligen?

Falls das nicht gehen sollte, mein eigentliches Problem:
Ich habe hier einen Linux Server und einen Windows Client. An dem Windows-Client befindet sich eine USB-Webcam, die wenn eine bestimmte Funktion auf dem Server aufgerufen wird ein Snapshot erstellen soll.
Es gibt zwar ein Programm mit dem man USB Geräten eine Netzwerkadresse zuordnen kann, es ist aber leider nur ein Client für Windows verfügbar und nicht für Linux.
Um das Problem zu umgehen, habe ich mir überlegt ein Script auf dem Windows PC aufzurufen welches den Snapshot erstellt.

Vielen Dank fürs durchlesen, vielleicht fällt euch ja etwas zu dem Problem ein :)
[i]who we are is but a stepping stone to
what we can become...[/i]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo bake!

Es gibt viele Möglichkeiten so etwas zu bewerkstelligen. Wenn es aber weder sicher, noch zeitnah sein muss, dann gibt es eine total einfache Lösung dafür.

Lass auf dem Windows-Computer ein Python-Programm laufen, welches alle fünf Sekunden prüft ob eine leere Textdatei auf einem Netzlaufwerk zur Verfügung steht. Wenn ja, dann lösche die Datei und führe das aus, was du dort auf dem Windows-Computer machen musst.

Wenn das Programm mit der Arbeit fertig ist, dann lässt du es einfach wieder alle fünf Sekunden prüfen, ob die Textdatei existiert, oder nicht...

Der Linux-Computer muss einfach nur eine Textdatei in einem Netzlaufwerk erstellen. Schon legt das Programm auf dem Windows-Rechner, spätestens nach fünf Sekunden los.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
bake
User
Beiträge: 29
Registriert: Dienstag 20. November 2007, 08:12
Wohnort: Hamburg

Danke Gerold, dann habe ich schonmal eine Möglichkeit das Problem zu lösen. :) Wie würde denn eine sichere und sauberer Lösung aussehen? Die Möglichkeit mit der Textdatei funktioniert zwar, aber wirklich schön ist sie finde ich nicht.
[i]who we are is but a stepping stone to
what we can become...[/i]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

bake hat geschrieben:Wie würde denn eine sichere und sauberer Lösung aussehen?
Hallo bake!

Eine recht saubere Lösung wäre z.B. ein XMLRPC-Server auf dem Windows-Computer. Siehe: http://www.python-forum.de/topic-5478.html

Sicherer wird es, wenn man das XMLRPC-Protokoll verschlüsselt. Z.B mit http://pypi.python.org/pypi/pyXMLRPCssh (ungetestet)

Eine sehr sichere und flexible Lösung wäre Cygwin auf dem Windows-Computer. Man installiert unter Cygwin den SSH-Server, erstellt ein Schlüsselpaar und ruft das Programm vom Linux Computer aus per SSH auf. Dann können so gut wie alle Kommandozeilenprogramme auf dem Windows-Computer aufgerufen werden.

Aufgerufen werden können die Programme z.B. mit http://pypi.python.org/pypi/PuSSH

Man kann aber auch ``ssh`` mit http://pypi.python.org/pypi/pexpect ansteuern. Oder wenn man mit Schlüsselpaaren arbeitet, dann genügt es, ``ssh`` mit ``subprocess.Popen`` aufzurufen.

Hier noch ein paar Links:
- http://pypi.python.org/pypi/paramiko
- http://pypi.python.org/pypi/ssh4py
- http://pypi.python.org/pypi/pexpect

Aber es geht noch weiter. Es gibt richtig viele Möglichkeiten, um ein Programm auf einem anderen Computer aufzurufen. Z.B. kannst du auf dem Windows-Computer einen Mail-Server installieren. Wird ein Email an eine dort eingerichtete Mailbox gesendet, dann kann beim Empfang ein Programm ausgeführt werden. Die Parameter bekommt das Programm aus dem Email.

Du kannst auch einen LowLevel-Netzwerkserver programmieren. Oder einen Web-Server (z.B. Apache) einrichten. Beim Aufruf einer mit SSL gesicherten URL kann ein Programm aufgerufen werden. Oder du könntest den MSSQL-Server installieren und dort ActiveX-Funktionen per SQL aufrufen lassen. Der PostgreSQL-Server kann auch Python-Funktionen abarbeiten. So kannst du z.B. durch das Ausführen einer SQL-Abfrage eine Python-Funktion anstoßen... Und das ist längst noch nicht alles. Es gibt noch hunderte Möglichkeiten. Man muss nur abwägen, welche Möglichkeit für die jeweilige Aufgabe Sinn macht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
bake
User
Beiträge: 29
Registriert: Dienstag 20. November 2007, 08:12
Wohnort: Hamburg

Hi Gerold,
vielen Dank für deine Mühe und die Antwort(en).
Da hab ich ja erstmal was zu lesen! Aber ist ja immer gut, wenn man zwischen mehreren und in diesem Fall vielen Möglichkeiten wählen kann. :)
[i]who we are is but a stepping stone to
what we can become...[/i]
lunar

gerold hat geschrieben:Eine sehr sichere und flexible Lösung wäre Cygwin auf dem Windows-Computer. Man installiert unter Cygwin den SSH-Server, erstellt ein Schlüsselpaar und ruft das Programm vom Linux Computer aus per SSH auf. Dann können so gut wie alle Kommandozeilenprogramme auf dem Windows-Computer aufgerufen werden.
Man könnte imho ja auch mit Paramiko direkt in der Anwendung einen SSH-Server implementieren, und so die Anwendung direkt fernsteuern.
Benutzeravatar
bake
User
Beiträge: 29
Registriert: Dienstag 20. November 2007, 08:12
Wohnort: Hamburg

Habe mich jetzt an einer XMLRPC Lösung versucht, mit dem Beispiel von Gerold (per localhost) funktioniert es wunderbar. Wenn ich jetzt aber den Server auf dem einen und den Client auf dem anderen PC starte, dann bekomme ich auf der Clientseite die Fehlermeldung "socket.timeout: timed out" und serverseitig "error: (10053, 'Software caused connection abort')
Eine Firewall ist auf beiden Seiten nicht installiert, woran hapert es?

Code: http://paste.pocoo.org/show/88740/
Fehlercode: http://paste.pocoo.org/show/88741/
[i]who we are is but a stepping stone to
what we can become...[/i]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du solltest den Server auf 0.0.0.0 horchen lassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo bake!

Vielleicht musst du etwas von der Funktion ``makesnapshot`` zurück geben lassen. Z.B. ein ``return True``

Oder vielleicht braucht der Snapshot länger. --> Timeout erhöhen.

Versuche es auch mal ohne das Erstellen des Snapshots. Einfach, um ein Problem damit auszuschließen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
bake
User
Beiträge: 29
Registriert: Dienstag 20. November 2007, 08:12
Wohnort: Hamburg

Mit einem Rückgabewert und offenen Ohren auf 0.0.0.0 klappt es. Die Geschwindigkeit ist zwar nicht gerade berauschend, aber immerhin funktioniert das Ganze jetzt. Vielen Dank für eure Hilfe!
[i]who we are is but a stepping stone to
what we can become...[/i]
Antworten