2

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

4

0 回答 0