17

PyInstallerを介してPythonスクリプトを作成しようとしています。次のコマンドを使用して、構成、スペックファイルの生成、およびビルドを行いました。

wget pyinstaller.zip, extracted it, python Configure.py, etc, then:

python pyinstaller/Makespec.py --onefile myscript.py
python pyinstaller/Build.py myscript.spec 

生成されたスペックファイルは次のとおりです。

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'],
             pathex=['/home/user/projects/icinga_python/releases/v2.1'])
pyz = PYZ(a.pure)
exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'myscript'),
          debug=False,
          strip=False,
          upx=True,
          console=1 )

これにより、ディレクトリに実行可能ファイルが作成されましたdist/。このファイルを実行しようとすると、次のようになります。

Traceback (most recent call last):
  File "<string>", line 12, in <module>
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook
    raise ImportError, "No module named %s" % fqname
ImportError: No module named mysql

この実行可能ファイルを実際のPythonコードのディレクトリに移動すると、異なる結果が得られました。

Traceback (most recent call last):
  File "<string>", line 12, in <module>
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 436, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 521, in doimport
    exec co in mod.__dict__
  File "CLUSTER/mysql/icingasql.py", line 13, in <module>
    import urllib2
  File "/home/user/projects/myscript/releases/v2.1/pyinstaller/iu.py", line 455, in importHook
    raise ImportError, "No module named %s" % fqname
ImportError: No module named urllib2

... pyinstallerのドキュメントでは、それが私が必要/望んでいるオプションであることがわかり--onefileますが、何らかの理由ですべてがコンパイルされているわけではありません。

このスクリプトには、実際には特別なものは含まれていません。SQLステートメント用に作成した簡単なモジュールと、特定のWebサイトの解析が含まれています。

4

3 に答える 3

8

問題は、pyinstallerが第2レベルのインポートを認識しないことです。したがって、モジュールAをインポートすると、pyinstallerはこれを認識します。ただし、 Aにインポートされた追加のモジュールは表示されません。

Pythonスクリプトで何も変更する必要はありません。不足しているインポートをスペックファイルに直接追加できます。以下を追加するだけですa = Analysis(...)

hiddenimports=["mysql"],

これは結果であるはずです:

a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'icinga.py'],
         pathex=['/home/user/projects/icinga_python/releases/v2.1'], hiddenimports=["mysql"],)

その後、スペックファイルを引数としてpyinstallerを実行します。

于 2017-01-26T08:53:11.883 に答える
7

このエラーは、コードに動的インポートがある場合に発生する可能性があります。その場合、pyinstallerはそれらのパッケージをexeファイルに含めません。その場合、次のことができます。

  1. これらのパッケージの未使用のインポートをコードに追加します
  2. pyinstallerにそれを含めるように伝えます

1つのファイルオプションは、コードの実行において何も変更しません。--onefile exeを作成すると、pyinstallerによって作成されたすべてのファイルがexeファイルにパックされ、exeを実行するたびにローカル温度に解凍されます。

于 2014-08-27T08:27:51.077 に答える
2

今日同じ問題に遭遇したので、2セントを追加するだけです-6年後:D

Windowsの場合:

1) cmd => rightclick => with admin rights
2) Enter in cmd: "pip install pyinstaller"
3) navigate in cmd to the folder of "yourMain.py"
4) Enter in cmd: "pyinstaller --onefile --windowed yourMain.py"

5) If you import other scripts / data in "yourMain.py": 
Manually enter the folder "dist" (gets created - where "yourMain.exe" should be by now), 
and copy your scripts or folder structure there

(e.g. /assets/sounds; /assets/graphics; /scripts; anotherscript.py )

次に、ダブルクリックしてexeを実行することができました。

かなり簡単であることが判明しました。私にとってのトリックは、「-onefile」と他のファイルを「dist」フォルダーに追加することでした。

「--windowed」は、exeを起動したときにPythonコマンドウィンドウがポップアップしないようにするためのものです。

于 2017-11-16T19:11:51.327 に答える