我需要能够在其中创建带有 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..