web-dev-qa-db-ja.com

pyinstallerによって作成されたexeファイル。実行中に自己定義モジュールが見つかりません

2つのpythonファイルを作成します。ディレクトリ/ファイルの関係は次のとおりです。

mytest---
     |---mycommon.py
     |---myMainDir---
                     |----myMain.py

Mycommon.py:

def myFunc(a):
    ...

そしてmyMain.pyで:

import sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath('__file__')), '..'))
import mycommon.py
mycommon.myFunc("abc")

次に、pyinstallerを使用してexeを作成しました。

pyinstall.py -F mytest\myMainDir\myMain.py

MyMain.exeが作成されますが、実行すると、mycommonモジュールが見つからないことが通知されます。

10
DarkMagic

PyInstallerの公式マニュアル 説明 この問題:

一部のPythonスクリプトは、PyInstallerが検出できない方法でモジュールをインポートします。例: 、変数データで__import__()関数を使用するか、実行時にsys.path値を操作します。スクリプトにPyInstallerが知らないファイルが必要な場合は、それを手助けする必要があります。

それも suggests そのような場合に何をすべきか:

Analysisがモジュールが必要であることを認識したが、そのモジュールが見つからない場合は、スクリプトがsys.pathを操作していることが原因であることがよくあります。この場合の最も簡単な方法は、--paths=オプションを使用して、スクリプトがインポートを検索する可能性のある他のすべての場所を一覧表示することです。

pyi-makespec --paths=/path/to/thisdir --paths=/path/to/otherdir myscript.py

これらのパスは、分析中に現在のsys.pathに追加されます。

したがって、アプリケーションのビルド時に--paths引数を指定してください。 -p引数を指定する手動 states は同等です。

-p dir_list--paths=dir_list

インポートされたモジュールの検索パスを設定します(PYTHONPATHを使用するなど)。このオプションを使用すると、PyInstallerでコードがインポート用にsys.pathを変更するときに適切な場所を検索できます。 ;Windowsの下)または:(他のすべてのプラットフォーム)で区切られた1つ以上のパスを指定するか、オプションを指定します検索に複数のパスを与えるために複数回。

19
Yoel

また、pyinstallerがサブフォルダーへのpythonスクリプトを正しくインポートするには、サブフォルダーへのパスがsys.path.insertを介して比較的設定されているため、少し戦わなければなりませんでした。

Yoelの答えは私には正しいですが、Windowsでパスを慎重に設定する必要がありました。これが私がしたことです:

私の主なpyは:

D:\_Development\pCompareDBSync\pCompareDBSync\pCompareDBSync.py

私のインポートされたpyは:

D:\_Development\pCompareDBSync\pCompareDBSync\py\pCompareNVR.py

(私はフォルダ。\ py \にそのようなインポートされたpyの多くを持っていますが、ここでは例として1つだけ使用します)

私の主なPYには、次のものが含まれます。

sys.path.insert(0, 'py')

try:
    from pCompareNVR import fgetNV_sN_dict
    from pCompareNVR import findNVRJobInDBSync
    from pCompareNVR import getNVRRecords
    from pCompareNVR import saveNVRRecords
    from pCompareNVR import compareNVRs
except Exception as e:
    print('Can not import files:' + str(e))
    input("Press Enter to exit!")
    sys.exit(0)
pyinstaller --onefile pCompareDBSync.py 

-> py/pCompareNVR.pyを含まないpCompareDBSync.exe

メインPYとインポートされたPYに絶対パッドを含める必要がありました。

pyinstaller --onefile --paths=D:\_Development\pCompareDBSync\pCompareDBSync\ --paths=D:\_Development\pCompareDBSync\pCompareDBSync\py pCompareDBSync.py

-> py/pCompareNVR.pyが含まれていたpCompareDBSync.exe-> OK

そして、それは私のためにこの問題を解決しました!

1
Al-Noor Ladhani