Python 如何从不同模块访问相同的多处理命名空间

Python 如何从不同模块访问相同的多处理命名空间,python,module,namespaces,multiprocessing,python-multiprocessing,Python,Module,Namespaces,Multiprocessing,Python Multiprocessing,我需要能够创建包含pySerial对象的共享对象。在从位置列表中找到设备后,子进程只会创建一次此对象。其他进程将在以后使用它 Python多处理管理器无法了解嵌入到其他对象中的对象的更改。 因此,如果我创建管理器: import multiprocessing as mp manager=mp.Manager() ns=manager.Namespace() 我可以在进程之间共享对象 ns.obj = SerialReader() 在哪里 class SerialReader(object)

我需要能够创建包含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)其中

但我不能引用ns.obj.ser,因为如果它将从新进程运行,它将被协调为未定义。如果我们在conntrollers.py中的其他方法中引用self.ser并尝试在新流程中运行它们,我们将遇到相同的情况

编辑:我找到了将命名空间导入模块的方法:

from __main__ import ns
或者在创建对象时将ns发送到init。 但问题依然存在。ns.obj是非类型对象,因为此对象仍在创建过程中。所以我不能输入ns.obj.ser=self.ser 如果我尝试向SerialReader()发送ns

并尝试在SerialReader_init_uu中打印它,我得到:



我也不能将ser添加到其中。

不同的进程有不同的地址空间,因此变量
ns
只能在一个进程中使用(除非使用共享内存)。您考虑过多线程吗?谢谢您的评论。是的,我在这种情况下使用它。我已经纠正了一个小问题。也许现在更容易理解了。
from __main__ import ns
ns.obj = SerialReader(ns)
<NamespaceProxy object, typeid 'Namespace' at 0xa21b70c; '__str__()' failed>