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 docs--onefile
が必要/必要なオプションであることがわかりますが、何らかの理由ですべてがコンパイルされているわけではありません。
このスクリプトには、実際には特別なものは含まれていません。SQLステートメント用に作成した簡単なモジュールと、特定のWebサイトの解析が含まれています。
このエラーは、コードに動的インポートがある場合に発生する可能性があります。その場合、pyinstallerはそれらのパッケージをexeファイルに含めません。その場合、次のことができます。
1つのファイルオプションは、コードの実行において何も変更しません。 --onefile exeを作成している場合、pyinstallerによって作成されたすべてのファイルはexeファイルにパックされ、exeを実行するたびにローカル温度にアンパックされます。
今日同じ問題に遭遇したので、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を実行することができました。
かなり簡単であることが判明しました。私にとってのトリックは、「-onfile」と他のファイルを「dist」フォルダーに追加することでした。
「--windowed」は、exeを起動したときにpythonコマンドウィンドウがポップアップしないようにするためです。