だから私は、numpy配列、他の辞書、ファイル名、および単純な変数を含む大きな辞書を選択しようとしています。
しかし、データをロードするサブプロセスを起動すると、「安全でない文字列のピクルス」エラーが発生します。
サブプロセスを呼び出す前にメインプロセスを強制終了し、コマンドラインから手動で実行すると、正常に機能します...
問題は、stdoutとstderrを使用したPIPEにある可能性があります。
私はピクルスダンプのためにいくつかのプロトコルで遊んでみましたが、役に立ちませんでした。
これが私のコードからのサンプルです:
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は、私が持っているカスタムの進行状況であり、各サブプロセスからのstdoutに基づいて進行状況を生成します。Threadedクラスを使用した作業バージョンがありますが、非常に低速であり、5つのサブプロセスを同時に実行している場合、サブプロセスバージョンでは少なくとも5倍(9倍)の速度が得られます。
以前にサブプロセスでピクルスファイルをロードする際に問題が発生した人はいますか?私はサブプロセスを実行してピクルスをロードできるプログラムを持っていましたが、stdoutにPIPEを使用したことはありませんでした。
ありがとう!