2016-06-27 7 views
1

Pyro4を初めて使用しているので、Pyro4パッケージに含まれているサンプルを試してみるよりも良い方法がありますか?だから私の最初の動機は、単に一つの仕事をすることでした、それは例 "倉庫"です。アイデアは、人に倉庫を訪問させ、持ち物や店舗を選択させることです。 "warehouse.py"ファイルにはPyroデーモン情報が含まれ、 "visit.py"には人と倉庫間のやり取りが行われます。Pyro4シリアライズエラー:サポートされていないシリアライズクラス

ネームサーバ(私の場合は:pyro4-ns -n Hodorで始まり、ホストファイルにC:\Windows\System32\drivers\etcというエントリがあります)と "warehouse.py"が2つの別々のターミナルウィンドウで実行されている必要があります。私が3番目のターミナルウィンドウで "visit.py"経由で通信を開始するたびに、最初に動作し、何かを保存したいかどうかを私に尋ねます。
:私が行う場合、私はエラーメッセージを取得 "Pyro4.errors.SerializeError:サポートされていないシリアル化されたクラス:person.Visitor": "

from __future__ import print_function 
import Pyro4 
import person 


class Warehouse(object): 
    def __init__(self): 
     self.contents=["chair","bike","flashlight","laptop","couch"] 

    def list_contents(self): 
     return self.contents 

    def take(self, person, item): 
     self.contents.remove(item) 
     print("{0} took the {1}.".format(person.name, item)) 

    def store(self, person, item): 
     self.contents.append(item) 
     print("{0} stored the {1}.".format(person.name, item)) 


def main(): 
    warehouse=Warehouse() 
    Pyro4.Daemon.serveSimple(
      { 
       warehouse: "warehouse" 
      }, 
      host = "Hodor", 
      ns=True) 

if __name__=="__main__": 
    main() 

ここ

File "visit.py", line 10, in <module> 
    janet.visit(warehouse) 
    File "C:\Users\RickJames\Pyro_other_machine\person.py", line 14, in visit 
    self.retrieve(warehouse) 
    File "C:\Users\RickJames\Pyro_other_machine\person.py", line 25, in retrieve 
    warehouse.take(self, item) 
    File "C:\Python34\lib\site-packages\Pyro4\core.py", line 171, in __call__ 
    return self.__send(self.__name, args, kwargs) 
    File "C:\Python34\lib\site-packages\Pyro4\core.py", line 428, in _pyroInvoke 
    raise data 
Pyro4.errors.SerializeError: unsupported serialized class: person.Visitor 

は "warehouse.py" でありますperson.py ":

、最後に "" visit.py:

import sys 
import Pyro4 
import Pyro4.util 
from person import Visitor 

warehouse=Pyro4.Proxy("PYRONAME:warehouse") 
janet=Visitor("Janet") 
henry=Visitor("Henry") 
janet.visit(warehouse) 
henry.visit(warehouse) 

私は、デフォルトでPyro4がシリアライザ "蛇"を使用していることを知っています。私は 'marshal'、 'json'、 'dill'、 'pickle'に切り替えようとしましたが、誰も私の問題を解決しませんでした。また、いくつかのシリアライザのセキュリティに関する問題をすべて読んだので、私は "蛇"を保ちたいと思います。

答えて

0

ソースファイルが間違っています。自分で入力しましたか?どこから彼らを得ましたか?これらの古いバージョンはPyro4の最近のバージョンでは、それ以来作られてきたシリアライザの仕組みが一部変更されているため、実際には動作しません。

あなたのコードがもう動作しない最も重要な理由は、Visitorクラスでは、入金メソッドと取得メソッドで、コードがVisitorインスタンスをWarehouse pyroサービスに渡すためです。これはPyroにシリアル化する方法を伝えていない限り不可能です。これは簡単な例であるため、その複雑さはここには含まれていませんが、Pyroのドキュメントで読むことができます。この例の正しいバージョンでは、人物の名前がのみが倉庫サービスに渡されるため、問題が完全に回避されます。

正しいバージョンはthe current Pyro4 documentationからコピーすることも、Pyro4ソースディストリビューションのexamples/warehouse/phase3フォルダにコピーすることもできます。

完全性のために、正しいバージョンは次のとおりです。 "person.py":次に

from __future__ import print_function 
import sys 

if sys.version_info < (3, 0): 
    input = raw_input 


class Person(object): 
    def __init__(self, name): 
     self.name = name 

    def visit(self, warehouse): 
     print("This is {0}.".format(self.name)) 
     self.deposit(warehouse) 
     self.retrieve(warehouse) 
     print("Thank you, come again!") 

    def deposit(self, warehouse): 
     print("The warehouse contains:", warehouse.list_contents()) 
     item = input("Type a thing you want to store (or empty): ").strip() 
     if item: 
      warehouse.store(self.name, item) 

    def retrieve(self, warehouse): 
     print("The warehouse contains:", warehouse.list_contents()) 
     item = input("Type something you want to take (or empty): ").strip() 
     if item: 
      warehouse.take(self.name, item) 

、 "visit.py":

# This is the code that visits the warehouse. 
import sys 

import Pyro4 
import Pyro4.util 
from person import Person 


sys.excepthook = Pyro4.util.excepthook 

warehouse = Pyro4.Proxy("PYRONAME:example.warehouse") 
janet = Person("Janet") 
henry = Person("Henry") 
janet.visit(warehouse) 
henry.visit(warehouse) 

そして最後に、 "warehouse.py":

from __future__ import print_function 
import Pyro4 


@Pyro4.expose 
class Warehouse(object): 
    def __init__(self): 
     self.contents = ["chair", "bike", "flashlight", "laptop", "couch"] 

    def list_contents(self): 
     return self.contents 

    def take(self, name, item): 
     self.contents.remove(item) 
     print("{0} took the {1}.".format(name, item)) 

    def store(self, name, item): 
     self.contents.append(item) 
     print("{0} stored the {1}.".format(name, item)) 


def main(): 
    Pyro4.Daemon.serveSimple(
     { 
      Warehouse: "example.warehouse" 
     }, 
     ns=True) 


if __name__ == "__main__": 
    main() 

パイロ4.45でこれらの作業罰金。

+0

よろしくお願い致します。私はそのパッケージについてグーグルでサンプルを手に入れました。そして今あなたがそれを言いました - ディレクトリはPyro4-4.18と言います。 – RickJames

関連する問題