pySerial オブジェクトを含む共有オブジェクトを作成できる必要があります。このオブジェクトは、場所のリストからデバイスを見つけた後、子プロセスによって 1 回だけ作成されます。他のプロセスは後でそれを使用します。
Python マルチプロセッシング マネージャーは、他のオブジェクトに埋め込まれたオブジェクトへの変更を認識できません。したがって、マネージャーを作成すると:
import multiprocessing as mp
manager=mp.Manager()
ns=manager.Namespace()
プロセス間でオブジェクトを共有できます。
ns.obj = SerialReader()
どこ
class SerialReader(object):
port = None
def connect(self):
#some code to test connected device
...
#end of that code
ser=serial.Serial(device, etc)
self.ser=ser
#or
self.saveport() #for future use
def saveport(self):
self.port = self.ser._port
ns.port= self.ser._port
次に、子プロセスで実行します。
p=Process(target = ns.obj.connect)
p.start()
結果を出力します:
print ns.obj.port
print ns.port
出力:
None
/dev/ttyACM0
次のような単純なコードを使用できるようにしたい:
ns.obj.ser.write(), ns.obj.somemethod(arg) ここで
...inside SerialReaders class...
def somemethod(self, arg):
if arg == condition:
self.ser.write('some text %s' %arg)
しかし、ns.obj.ser は、新しいプロセスから実行されると未定義と見なされるため、参照できません。conntrollers.py 内の他のメソッドで self.ser を参照し、それらを新しいプロセスで実行しようとすると、同じ状況になります。
編集:名前空間をモジュールにインポートする方法を見つけました:
from __main__ import ns
または、オブジェクトの作成時にinitにns を送信します。しかし、問題はまだ存在します。ns.obj は、このオブジェクトがまだ作成中であるため、NoneType オブジェクトです。したがって、ns.obj.ser= self.ser と入力できません ns を SerialReader() に送信しようとすると
ns.obj = SerialReader(ns)
SerialReader_ init _内に印刷しようとすると、次のようになります。
<NamespaceProxy object, typeid 'Namespace' at 0xa21b70c; '__str__()' failed>
私もそれにserを追加することはできません..