Server mit RPC starten funktioniert (noch) nicht

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
MyPy17
User
Beiträge: 18
Registriert: Mittwoch 19. April 2023, 12:40

ich versuche eine RPC Kommunikation zu starten. Dazu habe ich folgendes gelesen:


https://www.tutorialspoint.com/python_n ... e_call.htm

Nachdem ich die letzte Version von rpyc installiert (5.3.1) https://pypi.org/project/rpyc/ habe bekomme ich auf den Aufruf von

Code: Alles auswählen

rpyc_classic.py
folgendes angezeigt:

Code: Alles auswählen

C:\Users\xyz\AppData\Local\Programs\Python\Python310\Lib\site-packages\rpyc\cli>rpyc_classic.py

C:\Users\xyz\AppData\Local\Programs\Python\Python310\Lib\site-packages\rpyc\cli>
[main 2023-05-03T05:40:55.529Z] [SharedProcess] using utility process
[main 2023-05-03T05:40:55.682Z] update#setState idle
[main 2023-05-03T05:40:58.553Z] [UtilityProcess id: 1, type: extensionHost, pid: <none>]: creating new...
[main 2023-05-03T05:40:58.571Z] [UtilityProcess id: 1, type: extensionHost, pid: 45904]: successfully created
[main 2023-05-03T05:40:58.630Z] [UtilityProcess type: shared-process, pid: <none>]: creating new...
[main 2023-05-03T05:40:58.635Z] [UtilityProcess id: 1, type: fileWatcher, pid: <none>]: creating new...
[main 2023-05-03T05:40:58.656Z] [UtilityProcess type: shared-process, pid: 56768]: successfully created
[main 2023-05-03T05:40:58.697Z] [UtilityProcess id: 1, type: fileWatcher, pid: 56300]: successfully created
[main 2023-05-03T05:41:00.896Z] [UtilityProcess id: 1, type: extensionHost, pid: 45904]: waiting to exit...
[main 2023-05-03T05:41:00.897Z] [UtilityProcess id: 1, type: fileWatcher, pid: 56300]: attempting to kill the process...
[main 2023-05-03T05:41:00.899Z] [UtilityProcess id: 1, type: fileWatcher, pid: 56300]: successfully killed the process
[main 2023-05-03T05:41:00.916Z] [UtilityProcess id: 1, type: fileWatcher, pid: 56300]: received exit event with code 0
[main 2023-05-03T05:41:01.424Z] [UtilityProcess id: 1, type: extensionHost, pid: 45904]: received exit event with code 0
[main 2023-05-03T05:41:01.425Z] Extension host with pid 45904 exited with code: 0, signal: unknown.

Kann mir jemand kurz sagen was dies bedeutet respektive was ich machen muss damit ich den Server starten kann?
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MyPy17: Was komisch bis falsch aussieht ist, dass das aktuelle Arbeitsverzeichnis irgend eines sein sollte, aber ganz sicher nicht innerhalb des installierten Python-Packages.

Das Programm wird beim installieren per ``pip`` mit installiert und sollte einfach so aufrufbar sein. Oder zumindest in einem ``bin``-Verzeichnis liegen, wahrscheinlich ``C:\Users\xyz\AppData\Local\Programs\Python\Python310\bin``.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

__blackjack__ hat geschrieben: Mittwoch 3. Mai 2023, 12:57 Das Programm wird beim installieren per ``pip`` mit installiert und sollte einfach so aufrufbar sein. Oder zumindest in einem ``bin``-Verzeichnis liegen, wahrscheinlich ``C:\Users\xyz\AppData\Local\Programs\Python\Python310\bin``.
Für Windows empfehle ich ein ``C:\Users\xyz\AppData\Local\Programs\Python\Python310\scripts``
Das Verzeichnis sollte nach der Python-Installation auch im Suchpfad eingetragen sein, so das man rpyc_classic von überall starten kann

Code: Alles auswählen

C:\Users\ab>rpyc_classic
May 03 16:37:39 INFO SLAVE/18812[MainThread]: server started on [127.0.0.1]:18812
Es liegt dort übrigens als Anwendung mit der Endung .exe
Wobei ich hier gerade nur ein Win7 zur Hand hatte und damit auch nur ein Python 3.8 installieren konnte. Bei Python 3.10 sieht es möglicherweise alles ganz anders aus... glaube ich aber erstmal nicht.
MyPy17
User
Beiträge: 18
Registriert: Mittwoch 19. April 2023, 12:40

grubenfox hat geschrieben: Mittwoch 3. Mai 2023, 15:47 Es liegt dort übrigens als Anwendung mit der Endung .exe
Wobei ich hier gerade nur ein Win7 zur Hand hatte und damit auch nur ein Python 3.8 installieren konnte. Bei Python 3.10 sieht es möglicherweise alles ganz anders aus... glaube ich aber erstmal nicht.

alles klar - danke für den Tip. Nun wenn ich die .exe starte klappt es und der Server startet. Wenn man sich aber dieses Tutorial anschaut dann soll ja eigentlich das pythonscript gestartet werden mit:

Code: Alles auswählen

python bin/classic.py
wobei hier gesagt werden muss dass es dann wohl eher das

Code: Alles auswählen

python bin/rpyc_classic.py
sein sollte. Aber auch das klappt nicht weil es so den bin-Ordner gar nicht (mehr) gibt...! :roll:

Oder liege ich falsch?
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

MyPy17 hat geschrieben: Donnerstag 4. Mai 2023, 07:17 alles klar - danke für den Tip. Nun wenn ich die .exe starte klappt es und der Server startet. Wenn man sich aber dieses Tutorial anschaut dann soll ja eigentlich das pythonscript gestartet werden mit:

Code: Alles auswählen

python bin/classic.py
... und es soll Linux/Unix genutzt werden. Ich habe hier auf meinem Linux-Rechner im installierten Python einen bin-Ordner (zu Windows: siehe oben).
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MyPy17: So ein Tutorial kann nicht wirklich sinnvoll alle Eventualitäten abdecken. Python ist halt cross-plattform und so ähnlich sich die meisten Plattformen heute sind, es gibt halt doch Unterschiede. Alleine das ``python`` ist schon eine Annahme das man einfach ``python`` eingeben kann und dass das auf der Zielplattform wirklich so heisst, und nicht beispielsweise ``python3``, und dass es im Suchpfad für ausführbare Programme liegt.

Wo die Sachen bei der Installation landen hängt neben der Plattform auch noch davon ab ob man global für alle Benutzer, nur lokal für einen Benutzer, oder noch feiner nur in einem venv installiert. Und da kann dann nicht jedes Tutorial für jedes Python-Package all diese Sachen noch mal erklären. Da gibt es eigene Dokumentation für. In der Python-Dokumentation, und bei der Dokumentation für ``pip``.

Den ``bin/``-Ordner gibt es beispielsweise wenn man sich die Quellen herunter lädt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

__blackjack__ hat geschrieben: Donnerstag 4. Mai 2023, 12:54 Den ``bin/``-Ordner gibt es beispielsweise wenn man sich die Quellen herunter lädt.
Ach, da kommt der her... stimmt, meine lokalen Python-Versionen habe ich per pyenv installiert. Also aus den Quellen erstellt. Wollte mir hier unter Linux nicht das System-Python kaputt machen...
Danke für die Info.
MyPy17
User
Beiträge: 18
Registriert: Mittwoch 19. April 2023, 12:40

__blackjack__ hat geschrieben: Donnerstag 4. Mai 2023, 12:54 Den ``bin/``-Ordner gibt es beispielsweise wenn man sich die Quellen herunter lädt.
das ist gut zu wissen!

Nun was aber bei mir nicht klappt ist eine einfache server Kommunikation auf dem gleichen PC. Das heisst ich möchte den Server starten, dann auf dem Server ein pythonsctipt ausführen. Danach vom client aus Zugriff auf das script zu haben.

Beispiel:
Nehmen wir an auf dem Server gibt es ein script welche einfach eine Zahl ausgibt wenn dies vom Client aus aufgerufen wird.

Frage:
wie bekomme ich das hin?


Ich habe den rpyc server per .exe gestartet und wollte mit danach dieses Script starten was aber nicht funktioniert.

Code: Alles auswählen

import rpyc
import sys
 
if len(sys.argv) < 2:
   exit("Usage {} SERVER".format(sys.argv[0]))
 
server = sys.argv[1]
 
conn = rpyc.classic.connect(server)
rsys = conn.modules.sys
print(rsys.version)
 
ros = conn.modules.os
print(ros.uname())

Entweder mache ich komplett was falsch. Kann mir jemand so ein einfaches server-client script zeigen?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

"funktioniert nicht" ist eine sehr schlechte Fehlerbeschreibung. Was passiert konkret. Woran erkennst Du, dass es nicht funktioniert?

Und dann natürlich die Frage: was ist Dein eigentlicher Grund, warum Du denkst, rpyc würde Dich Deinem Ziel irgendwie näher bringen? Ist das nur Spielerei oder gibt es dafür einen wirklichen Anwendungsfall? (Zu mehr als Spielerei ist rpyc nämlich nicht zu gebrauchen).
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Och ich habe schon sinnvolle Dinge mit rpyc angestellt. Es wäre hier nicht meine erste Wahl, aber ist auch nicht ungeeignet. Und kommt im Zweifel auf, wenn der TE “rpc Python” googelt, wozu wir ihm hier ja geraten haben.
MyPy17
User
Beiträge: 18
Registriert: Mittwoch 19. April 2023, 12:40

Sirius3 hat geschrieben: Freitag 5. Mai 2023, 09:48 "funktioniert nicht" ist eine sehr schlechte Fehlerbeschreibung. Was passiert konkret. Woran erkennst Du, dass es nicht funktioniert?

Und dann natürlich die Frage: was ist Dein eigentlicher Grund, warum Du denkst, rpyc würde Dich Deinem Ziel irgendwie näher bringen? Ist das nur Spielerei oder gibt es dafür einen wirklichen Anwendungsfall? (Zu mehr als Spielerei ist rpyc nämlich nicht zu gebrauchen).
nun ich bekomme beim Aufruf von diesem Script folgende Fehlermeldung:
C:\temp>python server2.py localhost
Traceback (most recent call last):
File "C:\temp\server2.py", line 1, in <module>
import rpyc
File "C:\Users\AppData\Local\Programs\Python\Python310\lib\site-packages\rpyc\__init__.py", line 29, in <module>
from rpyc.core import (SocketStream, TunneledSocketStream, PipeStream, Channel,
File "C:\Users\AppData\Local\Programs\Python\Python310\lib\site-packages\rpyc\core\__init__.py", line 2, in <module>
from rpyc.core.stream import SocketStream, TunneledSocketStream, PipeStream
File "C:\Users\AppData\Local\Programs\Python\Python310\lib\site-packages\rpyc\core\stream.py", line 7, in <module>
import socket
File "C:\temp\socket.py", line 1, in <module>
from http import client
File "c:\users\appdata\local\programs\python\python310\lib\http\client.py", line 789, in <module>
class HTTPConnection:
File "c:\users\appdata\local\programs\python\python310\lib\http\client.py", line 837, in HTTPConnection
def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
AttributeError: partially initialized module 'socket' has no attribute '_GLOBAL_DEFAULT_TIMEOUT' (most likely due to a circular import)

und nein, dies ist jetzt keine Spielerei sondern eine Anwendung. Der Grund wieso ich rpyc verwende ist der, das es in diesem Forum empfohlen wurde. Wenn du jedoch eine (einfachere) und bessere Alternative kennst würde ich die gerne testen wollen!
MyPy17
User
Beiträge: 18
Registriert: Mittwoch 19. April 2023, 12:40

__deets__ hat geschrieben: Freitag 5. Mai 2023, 10:01 Och ich habe schon sinnvolle Dinge mit rpyc angestellt. Es wäre hier nicht meine erste Wahl, aber ist auch nicht ungeeignet. Und kommt im Zweifel auf, wenn der TE “rpc Python” googelt, wozu wir ihm hier ja geraten haben.

..und was wäre denn deine erste Wahl?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

In einem anderen Thread wurde dir HTTP-REST-API oder JSON-RPC empfohlen.

Dein Problem ist, dass Du eine Datei C:\temp\socket.py hast, und die überdeckt das offizielle socket-Modul. Datei umbenennen/löschen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich würde SimpleHTTPserver verwenden. Weil das schon dabei ist.
MyPy17
User
Beiträge: 18
Registriert: Mittwoch 19. April 2023, 12:40

Sirius3 hat geschrieben: Montag 8. Mai 2023, 10:51 In einem anderen Thread wurde dir HTTP-REST-API oder JSON-RPC empfohlen.

Dein Problem ist, dass Du eine Datei C:\temp\socket.py hast, und die überdeckt das offizielle socket-Modul. Datei umbenennen/löschen.

es wurde aber auch rpyc empfohlen. Schlussendlich sind dies lediglich andere Protokolle die wahrscheinlich zum gleichen Ergebnis führen aber mein Problem leider immer noch nicht lösen. Meine Frage ist ja einfach: Wie kann ich auf einem Server ein pythonscript ausführen auf welches ich dann von einem Client zugreifen kann? Wenn jemand ein Minibeispiel hat für ein Beispiel wäre es super. Mir ist es am Ende egal welches Protokoll dann verwendet wird. Es geht nur darum WIE dies gelöst werden kann.
MyPy17
User
Beiträge: 18
Registriert: Mittwoch 19. April 2023, 12:40

__deets__ hat geschrieben: Montag 8. Mai 2023, 11:17 Ich würde SimpleHTTPserver verwenden. Weil das schon dabei ist.
Ok.. .und WIE würdest du dies dann konkret lösen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich dachte da gibt es mehr Beispiele. Gibts nicht. Aber es gibt die darauf basierende XMLRPC-Variante, und das ist sogar noch einfacher. Und kommt mit Beispielen. https://docs.python.org/3/library/xmlrpc.server.html
Antworten