IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

'Invalid class string'


Sujet :

Python

  1. #1
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut 'Invalid class string'
    Salut,

    je suis en train de dev une appli qui fonctionne sur le mode client/serveur.

    Quand je lance le serveur en local sur ma machine pas de soucis tout fonctionne, dès que je le lance sur la machine distante et que j'essai d'y accèder ca merde.
    Le probleme c'est que ca me le fait pas avec toutes les machines distante:s En l'occurence une sur deux... Ces machines sont des pc industriel et le dev est en python of course

    Ce n'est pas un probleme de reception des paquets puisque apparement le "serveur" recoit bien le premier paquet et apres plante :s


    Mon erreur :

    xmlrpclib.Fault: <Fault 1: "<class 'pywintypes.com_error'>: (-2147221005, 'Invalid class string', None, None)">

    Quelqu'un a déja eu ce genre de probleme? Parceque la même google est pas mon ami

  2. #2
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Surement un problème de décodage des données, mais sans la traceback complète de l'erreur ça être dur à corriger.

    Tu n'utiliserais pas des chaînes accentuées ou Unicode ?

  3. #3
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    voici le trackback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Traceback (most recent call last):
     
      File "K:\workspace\CITA\CITA_CLIENT\MOTEUR\CITA_TestSuite.py", line 114, in <module>
        Result_TestBoucle = eval(eval(CITA_TESTSUITE[CITA_TEST_SUITE])[index][1])
      File "<string>", line 1, in <module>
      File "K:\workspace\CITA\CITA_CLIENT\TEST_SUITE\UMTS\Test_Integration_UMTS.py", line 31, in Test_Integration_UMTS_3
        CITA_REMOTE["test"].Run_Notepad()
      File "C:\Python25\lib\xmlrpclib.py", line 1147, in __call__
        return self.__send(self.__name, args)
      File "C:\Python25\lib\xmlrpclib.py", line 1437, in __request
        verbose=self.__verbose
      File "C:\Python25\lib\xmlrpclib.py", line 1201, in request
        return self._parse_response(h.getfile(), sock)
      File "C:\Python25\lib\xmlrpclib.py", line 1340, in _parse_response
        return u.close()
      File "C:\Python25\lib\xmlrpclib.py", line 787, in close
        raise Fault(**self._stack[0])
    xmlrpclib.Fault: <Fault 1: "<class 'pywintypes.com_error'>:(-2147221005, 'Invalid class string', None, None)">

    J'ai pas d'accent, j'ai pensé a ca aussi mais non :s

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    A mon avis il faut que tu regardes plutôt de ce côté :

    Dans
    "K:\workspace\CITA\CITA_CLIENT\MOTEUR\CITA_TestSuite.py" :
    Result_TestBoucle = eval(eval(CITA_TESTSUITE[CITA_TEST_SUITE])[index][1])

    Et dans "K:\workspace\CITA\CITA_CLIENT\TEST_SUITE\UMTS\Test_Integration_UMTS.py" :
    CITA_REMOTE["test"].Run_Notepad()


    Ca serait pas au niveau du eval ?

  5. #5
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Euh, j'ai un doute, ton client est bien aussi développé en python comme le serveur ?

    Si c'est le cas, est-ce que tu peut modifer le fichier xmlrpc.py (en faisant une copie de sauvegarde) pour remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            return self._parse_response(h.getfile(), sock)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            x = h.getfile()
            print 'x =', x
            return self._parse_response(x, sock)
    #       return self._parse_response(h.getfile(), sock)
    Et poster la dernière valeur de x ?

  6. #6
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    tamiel> Je pense pas que ca vienne du eval vu qu'en local ca fonctionne.



    mchk0123> Oui le client comme le serveur sont dev en python. Pour le moment je veux juste que l'interaction entre les deux se fasse et donc mon client demande juste a mon serveur de lancer notepad...

    J'ai pas de fichier xmlrpc.py. J'ai un fichier test_xmlrpc.py dans c:/python25/lib/test mais c'est tout et dans ce fichier il n'y a pas la ligne que tu me demandes de changer:s


    Merci pour votre aide.




    edit : j'ai trouve ta ligne dans xmlrpclib.py je fais le changement




    edit2 :ca m'affiche ca :
    x = <socket._fileobject object at 0x00B8C370>

  7. #7
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    zut ... m'est trompé

    donc reviens à l'ancienne version et remplace plutôt la ligne 1335 en :

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                print 'response = [%s]' % response
                p.feed(response)

  8. #8
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    Ca me met ca...Moi ca me parle pas plus que ca :s



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    response = [<?xml version='1.0'?>
    <methodResponse>
    <fault>
    <value><struct>
    <member>
    <name>faultCode</name>
    <value><int>1</int></value>
    </member>
    <member>
    <name>faultString</name>
    <value><string>&lt;class 'pywintypes.com_error'&gt;:(-2147221005, 'Invalid class string', None, None)</string></value>
    </member>
    </struct></value>
    </fault>
    </methodResponse>
    ]

  9. #9
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Cool, j'y vois plus clair...

    2 choses l'une, soit ta requête à ton client est complètement foireuse (mauvaise syntaxe, ... etc) ; soit le pb. surviens pendant l'exécution de la requête sur le serveur

    je parie fortement sur la première

    dernièr test, peut tu revenir à la version d'origine et remplacer la ligne 1185 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            errcode, errmsg, headers = h.getreply()
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            errcode, errmsg, headers = h.getreply()
             print 'body = [%s]' % request_body
             print 'headers = [%r]' % headers
    Au fait tu as bien la même version de Python sur le serveur comme sur le client ?

    Un "print sys.version" t'affiche quoi ?

  10. #10
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    Ca m'affiche ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    body = [<?xml version='1.0'?>
    <methodCall>
    <methodName>Run_Notepad</methodName>
    <params>
    </params>
    </methodCall>
    ]
    headers = [<httplib.HTTPMessage instance at 0x00BB6EE0>]



    Ma requete pourrait etre defectueuse et fonctionner sur certaine machines et pas sur d'autres? ca me parait bizarre:s


    J'utilise py2exe pour créer un executable que je met sur le serveur, donc a priori pas de probleme de version. Et d'apres ce que j'ai lu py2exe est plutot "table"comme lib. Ca pourrait venir de la?

  11. #11
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Le format XMLRPC de la requête à l'air bonne, donc c'est plutôt la 2ème idée (pb d'exécution sur le serveur).

    Le code source du serveur est suffisament simple pour être posté ?

  12. #12
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    hum oui je pense


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    config = ConfigParser.ConfigParser()
    config.read('CITA_Serveur.cfg')	
    CITA_Port_Serveur = config.get('CITA_SERVEUR', 'Port')
    CITA_Version = config.get('CITA_SERVEUR', 'Version')
    CITA_Client_Authorized = config.get('CITA_SERVEUR', 'Client_Authorized')
     
    accessList=(
    	'127.0.0.1',
    	CITA_Client_Authorized
    	)
     
    class Server(SimpleXMLRPCServer):
    	def __init__(self,addr,port):
    		SimpleXMLRPCServer.__init__(self,(addr,port))
     
    	def server_bind(self):
    		self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    		SimpleXMLRPCServer.server_bind(self)
     
    	def verify_request(self,request, client_address):
    		if client_address[0] in accessList:
    			return 1
    		else:
    			return 0				
     
     
    server = Server('',int(CITA_Port_Serveur))
    server.register_instance(TestClass)
     
    #Initialisation du Log
    InitLog.InitLog()
    # Loggin en mode ROOT de demarage de la sequence de test
    logging.info("START CITA ")
     
    print "-----------------------------------------------------"
    print "Server is STARTED"
    print "-----------------------------------------------------"
    print " "
     
     
    server.serve_forever()
     
    # Loggin en mode ROOT de demarage de la sequence de test
    logging.info("END CITA")

    et le fichier de config 'CITA_Serveur.cfg':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [CITA_SERVEUR]
    Version = 1.0
    Port = 35779
    Client_Authorized = 192.168.3.13

  13. #13
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Ben ouis, mais il fait comment le serveur pour exécuter la méthode "Run_Notepad()" (elle est pas dans ta classe Server !) ? Elle est définie dans SimpleXMLRPCServer ?

    Je sais pas je connais pas Zope.

  14. #14
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    en fait elle est dans un fichier qui est importer dans ma classe server :s

    En fait je fais une bibliotheque de fonction qui se trouve dans un autre fichier, et c'est ces fonctions qui sont appelé à être lancé par le serveur.

    Avant le code que je t'ai mis ds mon précédent il y a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    from SimpleXMLRPCServer import SimpleXMLRPCServer
    import socket
    import os
    import ConfigParser
     
    #import de la brique de LOG
    import logging
    import sys
    #sys.path.append("COMMON\LIB")
    import InitLog
     
    import sys
    sys.path.append("..\..\TESTS\Test_Class")
    from ListClasse import *

    Et ma fonction se trouve dans ListClasse

  15. #15
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    ben oui, mais c'est là ou ça déc..... surement

    En standard, toute méthode appellée via XMLRPC doit être définie dans l'espace de nom de l'objet serveur XMLRPC instancié.
    Maintenant tout dépend comme est écrit ta classe SimpleXMLRPCServer.

    Si tu veux conserver la séparation dans un fichier <>, tu dois injecter le contenu du fichier dans ta classe Server ! Tu saura faire ce genre de chose ?

    Sinon le plus simple c'est de déplacer Run_Notapd dans Server.

  16. #16
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    class Server(SimpleXMLRPCServer):
    	def __init__(self,addr,port):
    		SimpleXMLRPCServer.__init__(self,(addr,port))
     
    	def server_bind(self):
    		self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    		SimpleXMLRPCServer.server_bind(self)
     
    	def verify_request(self,request, client_address):
    		if client_address[0] in accessList:
    			return 1
    		else:
    			return 0	
     
    	def Run_Notepad(self):
    		print test
    		return "Status_OK"

    Je viens de modifier la classe pour lui rajotuer la methode comme mis ci-dessus et j'ai tjs la meme erreur:s
    Mais en meme tps je vois pas comment il ne peux pas trouver sur cette machine et trouver sur les autres:s c'est vraiment bizarre

  17. #17
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Même si cela ne corrigera pas l'erreur, il manque un self à Run_Notepad. P'i rajoute un 'os.system("notepad.exe")' dés fois que le print soit pas affiché (ça arrive avec certains terminaux). Et remplace la valeur de retour par 1 (là c'est vraiment de bricole ), mais bon y'a une erreur de string qq part.

    Mais en meme tps je vois pas comment il ne peux pas trouver sur cette machine et trouver sur les autres:s c'est vraiment bizarre
    Ouais bizarre !?

    Du coup le code de SimpleXMLRPC est postable ?

  18. #18
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    Voici ce qui permet d'envoyer les infos au serveur.
    Je passe ce qu'il y a avant (juste de la recup d'info ds un fichier de config) mais les 3 print me donne ca comme affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TestSuite_UMTS
    TestSuite_UMTS
    eval = Test_Integration_UMTS_3()




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    CITA_TEST_SUITE = config_client.get('CITA_TEST_SUITE', 'TestSuite')
    print CITA_TEST_SUITE 
    CITA_TESTSUITE[CITA_TEST_SUITE]=CITA_TEST_SUITE
    print CITA_TESTSUITE[CITA_TEST_SUITE]
     
    index = 0
    while (index <= (len(eval(CITA_TESTSUITE[CITA_TEST_SUITE]))-1)) :
    	print 'eval = %s' % eval(CITA_TESTSUITE[CITA_TEST_SUITE])[index][1]
    	Result_TestBoucle = eval(eval(CITA_TESTSUITE[CITA_TEST_SUITE])[index][1])
    	logging.info(Result_TestBoucle + " : " + eval(CITA_TESTSUITE[CITA_TEST_SUITE])[index][0] + " : " + eval(CITA_TESTSUITE[CITA_TEST_SUITE])[index][1])
     	if (Result_TestBoucle == "Status_OK") :
     		eval(CITA_TESTSUITE[CITA_TEST_SUITE])[index][2] = Status_OK
     	index = index + 1
    et ensuite dans la fonction Test_Integration_UMTS_3() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def Test_Integration_UMTS_3() :
        CITA_REMOTE["test"].Run_Notepad()
        return "Status_OK"
    CITA_REMOTE étant defini de la facon suivante, c'est un tableau qui "contient" les machines distantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CITA_REMOTE[RemoteName] = Server("http://" + Remote_Cita_IP + ':' + Remote_Cita_PORT)

  19. #19
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    ???

    je me méfie de ce genre de truc

    Et le code source de SimpleXMLRPC ?

  20. #20
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    C'est quoi ton bout de code la?


    Commment ca simpleXMLRPC?

    En fait c'est pas moi qui ait fait la partie client/serveur moi je devais jsute faire les fonctions qui st executer par le serveur. Je comprend le code(enfin je pense lol) mais c'est pas moi qui l'ai écris.

    je devrais avoir un fichier qui s'appelle comme ca?Dans cecas l'erreur viens peut etre de la vu que j'en ai pas...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VB.NET]petit problème avec la classe string !!
    Par zouhib dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/06/2006, 11h58
  2. Question facile sur la classe string
    Par MarOne dans le forum Langage
    Réponses: 9
    Dernier message: 20/04/2006, 14h28
  3. la classe string
    Par amel2006 dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2006, 16h11
  4. [C++]la classe String
    Par bechbech dans le forum MFC
    Réponses: 5
    Dernier message: 01/04/2006, 15h35
  5. Fuite mémoire de la classe string
    Par jean_barac dans le forum SL & STL
    Réponses: 7
    Dernier message: 28/07/2005, 23h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo