PyInstallerで構築されたWindowsEXEがマルチプロセッシングで失敗する

ニコラ

私のプロジェクトでは、Pythonのmultiprocessingライブラリを使用して__main__に複数のプロセスを作成しています。プロジェクトは、PyInstaller2.1.1を使用して単一のWindowsEXEにパッケージ化されています。

私は次のような新しいプロセスを作成します。

from multiprocessing import Process
from Queue import Empty

def _start():
    while True:
        try:
            command = queue.get_nowait()
        # ... and some more code to actually interpret commands
        except Empty:
            time.sleep(0.015)

def start():
    process = Process(target=_start, args=args)
    process.start()
    return process

そして__main__で:

if __name__ == '__main__':
    freeze_support()

    start()

残念ながら、アプリケーションをEXEにパッケージ化して起動すると、次の行でWindowsError5または6(ランダムに見える)が表示されます。

command = queue.get_nowait()

PyInstallerのホームページのレシピによると、アプリケーションを単一のファイルとしてパッケージ化する場合、Windowsでマルチプロセッシングを有効にするにはコードを変更する必要があります。

私はここでコードを再現しています:

import multiprocessing.forking
import os
import sys


class _Popen(multiprocessing.forking.Popen):
    def __init__(self, *args, **kw):
        if hasattr(sys, 'frozen'):
            # We have to set original _MEIPASS2 value from sys._MEIPASS
            # to get --onefile mode working.
            # Last character is stripped in C-loader. We have to add
            # '/' or '\\' at the end.
            os.putenv('_MEIPASS2', sys._MEIPASS + os.sep)
        try:
            super(_Popen, self).__init__(*args, **kw)
        finally:
            if hasattr(sys, 'frozen'):
                # On some platforms (e.g. AIX) 'os.unsetenv()' is not
                # available. In those cases we cannot delete the variable
                # but only set it to the empty string. The bootloader
                # can handle this case.
                if hasattr(os, 'unsetenv'):
                    os.unsetenv('_MEIPASS2')
                else:
                    os.putenv('_MEIPASS2', '')


class Process(multiprocessing.Process):
    _Popen = _Popen


class SendeventProcess(Process):
    def __init__(self, resultQueue):
        self.resultQueue = resultQueue

        multiprocessing.Process.__init__(self)
        self.start()

    def run(self):
        print 'SendeventProcess'
        self.resultQueue.put((1, 2))
        print 'SendeventProcess'


if __name__ == '__main__':
    # On Windows calling this function is necessary.
    if sys.platform.startswith('win'):
        multiprocessing.freeze_support()
    print 'main'
    resultQueue = multiprocessing.Queue()
    SendeventProcess(resultQueue)
    print 'main'

この「解決策」に対する私の不満は、1つは、パッチが正確に何であるかが完全に不明確であり、2つは、どの部分が解決策であり、どの部分が単なる解決策であるかを推測することが不可能になるほど複雑な方法で書かれていることです。図。

誰かがこの問題についていくつかの光を共有し、PyInstallerで構築された単一ファイルのWindows実行可能ファイルでマルチプロセッシングを可能にするプロジェクトで正確に何を変更する必要があるかについての洞察を提供できますか?

ニコラ

このPyInstallerチケットを見つけた後、私自身の質問に答えます

どうやら私たちがしなければならないのは、以下に示すようにProcess(と_Popen)クラスを提供し、の代わりにそれを使用することだけですmultiprocessing.ProcessWindowsでのみ機能するようにクラスを修正および簡略化しました。* ixシステムでは、異なるコードが必要になる場合があります。

完全を期すために、上記の質問からの適合サンプルを次に示します。

import multiprocessing
from Queue import Empty

class _Popen(multiprocessing.forking.Popen):
    def __init__(self, *args, **kw):
        if hasattr(sys, 'frozen'):
            os.putenv('_MEIPASS2', sys._MEIPASS)
        try:
            super(_Popen, self).__init__(*args, **kw)
        finally:
            if hasattr(sys, 'frozen'):
                os.unsetenv('_MEIPASS2')


class Process(multiprocessing.Process):
    _Popen = _Popen


def _start():
    while True:
        try:
            command = queue.get_nowait()
        # ... and some more code to actually interpret commands
        except Empty:
            time.sleep(0.015)

def start():
    process = Process(target=_start, args=args)
    process.start()
    return process

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Python2.7でマルチプロセッシングのインポートが失敗する

分類Dev

このマルチプロセッシングコードが失敗するのはなぜですか?

分類Dev

Googleの音声テキストAPIがマルチプロセッシングPythonで失敗する

分類Dev

プールのマルチプロセッシングが失敗する

分類Dev

マルチプロセッシングで復号化に失敗したか、レコードMacが不良

分類Dev

マルチプロセッシングで復号化に失敗したか、レコードMacが不良

分類Dev

マルチプロセッシングでネストされたプロセスを起動する

分類Dev

マルチプロセッシングプールでスローされた例外が検出されない

分類Dev

input()関数が存在すると、マルチプロセッシングが失敗します。この背後にある理由は何ですか?

分類Dev

マルチプロセッシングが使用されている場合、scikit-learnおよびnumpy依存コードの再現に失敗する

分類Dev

奇妙なプロセスクローンがPythonマルチプロセッシングで表示されます

分類Dev

マルチプロセッシングプール初期化子がピクルス化に失敗する

分類Dev

Pythonでのマルチプロセッシング:返された最初の結果のみを保持する

分類Dev

Windows コマンド プロンプト経由で正常に送信された CURL Cookie が Windows バッチ ファイル経由で失敗する

分類Dev

取得したロック時にPythonマルチプロセッシングロックメカニズムが失敗する

分類Dev

ネストされた関数でマルチプロセッシングプールが機能しない

分類Dev

Python:マルチプロセッシングロックがここのプロセス間で共有されるのはなぜですか?

分類Dev

Pythonマルチプロセッシングの失敗。maxtasksperchildが設定されている場合はプール

分類Dev

Pythonマルチプロセッシング:マルチプロセッシングを使用すると、一部のクラス属性が失われます

分類Dev

装飾された関数でマルチプロセッシングを使用すると、PicklingErrorが発生します

分類Dev

印刷機能により、マルチプロセッシングプログラムが失敗します

分類Dev

Pythonとパンダでマルチプロセッシングを使用すると、ファイルが見つからない/失われます

分類Dev

Pythonマルチプロセッシングでdictが更新されないのはなぜですか?

分類Dev

マルチプロセッシングプールでdjangoモデルを更新すると、データベースがロックされます

分類Dev

「マッチグループ」句でSFTPが失敗する

分類Dev

Pythonマルチプロセッシングプールがマップ呼び出しでハングする

分類Dev

tolist変換された配列がPythonマルチプロセッシングで追加されないのはなぜですか?

分類Dev

Python> 3で部分的およびマップが失敗するマルチプロセッシングを使用するスクリプトは、2.7で正常に動作し、「_ thread.lock」をピクルスできません

分類Dev

マルチプロセッシングで動的にロードされた関数をターゲットとして使用するプール

Related 関連記事

  1. 1

    Python2.7でマルチプロセッシングのインポートが失敗する

  2. 2

    このマルチプロセッシングコードが失敗するのはなぜですか?

  3. 3

    Googleの音声テキストAPIがマルチプロセッシングPythonで失敗する

  4. 4

    プールのマルチプロセッシングが失敗する

  5. 5

    マルチプロセッシングで復号化に失敗したか、レコードMacが不良

  6. 6

    マルチプロセッシングで復号化に失敗したか、レコードMacが不良

  7. 7

    マルチプロセッシングでネストされたプロセスを起動する

  8. 8

    マルチプロセッシングプールでスローされた例外が検出されない

  9. 9

    input()関数が存在すると、マルチプロセッシングが失敗します。この背後にある理由は何ですか?

  10. 10

    マルチプロセッシングが使用されている場合、scikit-learnおよびnumpy依存コードの再現に失敗する

  11. 11

    奇妙なプロセスクローンがPythonマルチプロセッシングで表示されます

  12. 12

    マルチプロセッシングプール初期化子がピクルス化に失敗する

  13. 13

    Pythonでのマルチプロセッシング:返された最初の結果のみを保持する

  14. 14

    Windows コマンド プロンプト経由で正常に送信された CURL Cookie が Windows バッチ ファイル経由で失敗する

  15. 15

    取得したロック時にPythonマルチプロセッシングロックメカニズムが失敗する

  16. 16

    ネストされた関数でマルチプロセッシングプールが機能しない

  17. 17

    Python:マルチプロセッシングロックがここのプロセス間で共有されるのはなぜですか?

  18. 18

    Pythonマルチプロセッシングの失敗。maxtasksperchildが設定されている場合はプール

  19. 19

    Pythonマルチプロセッシング:マルチプロセッシングを使用すると、一部のクラス属性が失われます

  20. 20

    装飾された関数でマルチプロセッシングを使用すると、PicklingErrorが発生します

  21. 21

    印刷機能により、マルチプロセッシングプログラムが失敗します

  22. 22

    Pythonとパンダでマルチプロセッシングを使用すると、ファイルが見つからない/失われます

  23. 23

    Pythonマルチプロセッシングでdictが更新されないのはなぜですか?

  24. 24

    マルチプロセッシングプールでdjangoモデルを更新すると、データベースがロックされます

  25. 25

    「マッチグループ」句でSFTPが失敗する

  26. 26

    Pythonマルチプロセッシングプールがマップ呼び出しでハングする

  27. 27

    tolist変換された配列がPythonマルチプロセッシングで追加されないのはなぜですか?

  28. 28

    Python> 3で部分的およびマップが失敗するマルチプロセッシングを使用するスクリプトは、2.7で正常に動作し、「_ thread.lock」をピクルスできません

  29. 29

    マルチプロセッシングで動的にロードされた関数をターゲットとして使用するプール

ホットタグ

アーカイブ