【发布时间】:2012-08-16 06:41:18
【问题描述】:
所以我试图腌制一个大字典,其中包括: numpy 数组, 其他词典, 文件名, 和简单的变量。
但是当我启动一个将加载数据的子进程时,我收到一个“不安全的字符串pickle”错误。
如果我在调用子进程之前杀死主进程,然后通过命令行手动运行它,它就可以正常工作......
问题可能在于使用 stdout 和 stderr 进行 PIPE。
我尝试使用一些协议来处理 pickle 转储,但无济于事。
这是我的代码示例:
dataout = open('Dataout.pickle','wb')
dictout = { dict of all the values }
pickle.dump(dictout, dataout)
for i in xrange(int(self.runs)):
self.names.append("%s_%i"%(self.name,i))
if self.rerun == 0:
self.chains.append(subprocess.Popen('python BaSIC_Model.py %s'%self.names[i], shell=False,stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True))#bufsize=0,
else:
self.chains.append(subprocess.Popen('python BaSIC_Model.py %s'%self.names[i], shell=False,stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True))#bufsize=0,
if self.Gui == 1:
self.cp = Cust_Progress.ProgRun("Running Chains", [0]*int(self.runs),self.itter)
self.cp.Play()
while True:
if not any([True if chain.poll() == None else False for chain in self.chains]):
print 'broke'
texts = [chain.stdout.read() for chain in self.chains]
print texts[0]
break
texts = [chain.stdout.readline() for chain in self.chains]
print texts[0]
if texts == None or None in texts:
texts = [0]*len(self.chains)
self.cp.UpdateIters(texts)
wx.Yield()
time.sleep(0.05)
self.cp.Done()
self.cp.UpdateIters(['Generating Plots']*int(self.runs))
从子进程中,它失败了:
inFile = open('Dataout.pickle','rb')
inputData = pickle.load(inFile)
出现不安全的字符串 pickle 错误。 另外,我的代码中的 self.cp 是我拥有的自定义进度,它将根据我的每个子进程的标准输出生成进度。我有一个带有 Threaded 类的工作版本,但速度非常慢,如果我同时运行 5 个子进程,子处理版本会给我至少 5 倍(到 9 倍)的速度。
以前有没有其他人在子进程中加载泡菜文件时遇到过问题? 我有一些程序可以进行子处理并且可以加载泡菜,但从来没有使用 PIPE 到标准输出。
谢谢!
【问题讨论】:
标签: python subprocess stdout pickle