2

所以我试图腌制一个大字典,其中包括:numpy 数组、其他字典、文件名和简单变量。

但是当我启动一个将加载数据的子进程时,我得到了一个“不安全的字符串泡菜”错误。

如果我在调用子进程之前杀死主进程,并通过命令行手动运行它,它工作正常......

问题可能在于使用 stdout 和 stderr 进行 PIPE-ing。

我尝试过使用一些用于泡菜转储的协议,但无济于事。

这是我的代码中的一个示例:

    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)

带有不安全的字符串泡菜错误。另外,我的代码中的 self.cp 是我拥有的自定义进度,它将根据我的每个子流程的标准输出生成进度。我有一个带有线程类的工作版本,但速度非常慢,如果我同时运行 5 个子进程,子处理版本会给我至少 5 倍(到 9 倍)的速度。

以前有没有其他人在子进程中加载​​泡菜文件时遇到问题?我有程序可以进行子处理并且可以加载泡菜,但从来没有使用管道到标准输出。

谢谢!

4

1 回答 1

1

菜鸟的错...

没有打电话:

    dataout.close()

转储之后.... -_-

于 2012-08-20T22:48:20.330 回答