我正在将一些代码从python 3移植到python 2.7,以便它可以与ROS工具集成,并遇到了pickle thread.lock错误的问题。
在python 3中运行时,一切正常,并且代码的多处理部分没有更改。
这是错误的代码。
from bin.gui.mainWindow_ui import *
from bin.client.Server import Server
from bin.common.Logger import Logger as log
from bin.common.Constants import Constants as con
from bin.parse.Data_NoROS import Data as data
from multiprocessing import Process, Pipe
import os
import time
LOG = log('DEBUG')
DATA = data()
SERVER = Server(DATA, LOG)
TAG = "MainWindow"
class MainWindow(QtWidgets.QMainWindow):
"""
Handles the ui elements and connects to worker service to execute processes.
"""
def __init__(self):
"""
Initializes values for the UI.
"""
QtWidgets.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.running = False
# configures
self._configure_signals()
# enable ui
self._enable_ui()
self.ui.textEdit_2.setText(' Not Connected')
# setup server process
self.gui_conn, self.data_conn = Pipe()
self.listenProcess = Process(target=SERVER.Listen, args=(self.data_conn,))
def Connect(self):
"""
Starts the server process for acquisition of the selected serial port.
This function is connected to the clicked signal of the Start button.
"""
self.running = True
LOG.i(TAG, "User clicked CONNECT")
self.listenProcess.start()
LOG.i(TAG, "Started Server Process as: PID".format(os.getpid()))
self.ui.textEdit_2.setTextColor(QtCore.Qt.darkGreen)
self.ui.textEdit_2.setText('\tSYSTEM READY')
self.UpdateGUI()
一旦我进入self.listenProcess.start(),就会收到以下错误消息
Traceback (most recent call last):
File "I:\eCHRApplication\bin\gui\mainWindow.py", line 60, in Connect
self.listenProcess.start()
File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\process.py", line 130, in start
self._popen = Popen(self)
File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\forking.py", line 277, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\forking.py", line 199, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 224, in dump
self.save(obj)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
save(state)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\forking.py", line 67, in dispatcher
self.save_reduce(obj=obj, *rv)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 401, in save_reduce
save(args)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 554, in save_tuple
save(element)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
save(state)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 731, in save_inst
save(stuff)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 692, in _batch_setitems
save(v)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
save(state)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 606, in save_list
self._batch_appends(iter(obj))
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 642, in _batch_appends
save(tmp[0])
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
save(state)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
save(state)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 306, in save
rv = reduce(self.proto)
TypeError: can't pickle thread.lock objects
(base) I:\eCHRApplication>Initializing server object
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\forking.py", line 381, in main
self = load(from_parent)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 1384, in load
return Unpickler(file).load()
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 864, in load
dispatch[key](self)
File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 886, in load_eof
raise EOFError
EOFError
任何帮助将不胜感激!