2017-10-30 3 views
0

WindowsでPython 2.7を使用すると、次のコードは機能しますが、msvcで問題が発生します。ここでパイプ経由のデータ送信(BytesIOバッファ)は機能しますが、致命的なPython例外が発生します

import io 
import matplotlib.pyplot as plt 
import matplotlib.pyplot as plt2 
from multiprocessing import Process, Pipe 

def tmpPlot(conn): 
    plt.plot([1,2,4,2]) 
    plt.title("title") 

    buf = io.BytesIO() 
    plt.savefig(buf, format='png') 
    buf.seek(0) 
    conn.send(plt.imread(buf)) 
    conn.close 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=tmpPlot, args=(child_conn,)) 
    p.start() 

    imgData = parent_conn.recv() 

    imgplt = plt2.imshow(imgData) 

    plt2.show() 

は誤りです:pythonw.exe続く

MSVC Error

は、作業メッセージを停止しました:短い睡眠コマンドを追加

Problem signature: 
    Problem Event Name: APPCRASH 
    Application Name: pythonw.exe 
    Application Version: 0.0.0.0 
    Application Timestamp: 59bd8782 
    Fault Module Name: python27.dll 
    Fault Module Version: 2.7.14150.1013 
    Fault Module Timestamp: 59bd877e 
    Exception Code: 40000015 
    Exception Offset: 0014098b 
    OS Version: 6.0.6002.2.2.0.768.3 
    Locale ID: 1033 
    Additional Information 1: ac4a 
    Additional Information 2: 817fddeef0c50f6183a834229ec12634 
    Additional Information 3: 3df9 
    Additional Information 4: 47d9390827b4b422b52d14c0c48ab5d9 

Read our privacy statement: 
    http://go.microsoft.com/fwlink/?linkid=50163&clcid=0x0409 
+0

これは、スレッド内の 'pyplot'の使用に依存するようです。 [この簡略化された例](https://pastebin.com/E6PYkcvv)を参照してください。正常に動作します。 pyplot行のコメントを外すと、エラーが発生します。これは、バッファを使用することにすべて依存しません。 – ImportanceOfBeingErnest

+0

追加テストでは、conn.send(data)ステートメントの後に遅延を追加すると、エラーが回避されることが分かりました。 sendコマンドが完了したことを検出するよりエレガントな方法はありますか?任意の時間の代わりにそれが完了するまで待つか? – user3701730

+0

使用される遅延はtime.sleep(.001)です。どのくらいの時間スリープしても問題ありません – user3701730

答えて

0

は、トリックを行うようです。.. 。

conn.send(plt.imread(buf)) 
time.sleep(.001) 
conn.close 

エレガントではないが機能する。

関連する問題