我需要能够使用pySerial对象创建共享对象。从位置列表中查找设备后,此对象将仅由子进程创建一次。其他进程将在以后使用它。
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
或在创建对象时将ns发送到 init 。 但问题仍然存在。 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 ..