私は現在py2exeを使って実行ファイルを作成しようとしています。私はPython 3.6を使っています。私が使っているスクリプトはopenpyxlとpptxをインポートしていて、Pycharmを使っているときやコマンドウィンドウを使ってスクリプトを実行しているときにうまく動きます。出力はエラーを生成します:
IndexError:タプルインデックスが範囲外
以下にcmdの出力があります。
C:\Python36>python setup.py py2exe
running py2exe
Traceback (most recent call last):
File "setup.py", line 4, in <module>
setup(console=['Storybookmaker.py'])
File "C:\Python36\lib\distutils\core.py", line 148, in setup
dist.run_commands()
File "C:\Python36\lib\distutils\dist.py", line 955, in run_commands
self.run_command(cmd)
File "C:\Python36\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
File "C:\Python36\lib\site-packages\py2exe\distutils_buildexe.py", line 188, in run
self._run()
File "C:\Python36\lib\site-packages\py2exe\distutils_buildexe.py", line 267, in _run
builder.analyze()
File "C:\Python36\lib\site-packages\py2exe\runtime.py", line 160, in analyze
self.mf.import_hook(modname)
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 120, in import_hook
module = self._gcd_import(name)
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 274, in _gcd_import
return self._find_and_load(name)
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 357, in _find_and_load
self._scan_code(module.__code__, module)
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 388, in _scan_code
for what, args in self._scan_opcodes(code):
File "C:\Python36\lib\site-packages\py2exe\mf3.py", line 417, in _scan_opcodes
yield "store", (names[oparg],)
IndexError: Tuple index out of range
C:\Python36>
IndexErrorの原因は何ですか?
編集:これはsetup.py
ファイルです
from distutils.core import setup
import py2exe
setup(console=['Storybookmaker.py'])
Python 3.6 CPython用にバイトコードを完全に再設計しました (これはもう「バイト」コードではなく、ワードコードです。オペコードは1〜3ではなく2バイトです)。
あなたが目にしている失敗はpy2exe
オペコード解析コードで発生します、それはpy2exe
の最新の投稿されたバージョンだけが3.3と3.4のサポートを主張するので、おそらく新しいワードコードオペコードの知識もサポートもできません。 py2exe
が最後に更新された時点では、それらも考えられていませんでした。バイトコードはしばしばバージョンごとに少しずつ変化し、Python 3.5でも壊れる可能性があります(3.3と3.4のサポートのみが明示的に主張されている場合)が、3.6は失敗することが100%保証されています。
回避策としてcx_freezeを使用したのと同じ問題がありました。私のアプリはwxPython、windows 10、python 3.6、cx_freeze 5.5.1に基づいています。
これは私が使ったセットアップファイルで、distフォルダにmsiファイルがあります。
#setup.py
import sys, os
from cx_Freeze import setup, Executable
__version__ = "1.1.0"
include_files = ['logging.ini', 'config.ini', 'running.png']
excludes = ["tkinter"]
packages = ["os", "idna", "requests","json","base64","pyodbc"]
setup(
name = "appname",
description='App Description',
version=__version__,
options = {"build_exe": {
'packages': packages,
'include_files': include_files,
'excludes': excludes,
'include_msvcr': True,
}},
executables = [Executable("b2b_conn.py",base="Win32GUI")]
)`
それからpython setup.py bdist_msi
私がPy2Exeとして使っていた解決策はpython 3.4で開発を止めていて、新しいバージョンではうまくいかないでしょう。
C:/>pip install pyinstaller
C:/>pyinstaller yourprogram.py
これは、yourprogram.exeというフォルダーに格納されているyourprogram.exeと共に、distというサブディレクトリーを作成します。
生成されたすべてのファイルを1つの実行可能ファイルに入れるには、-Fを使用します。
C:/>pyinstaller -F yourprogram
GUIのコンソール表示を削除したい場合は、-w toを使用できます。
C:/>pyinstaller -w yourprogram.py
それをすべて一緒にすること。
C:/>pyinstaller -w -F yourprogram.py
PyInstallerについてもっと読む ここ 。
Pythonバージョン3.7.3.
デニス、あなたより数時間遅れて、私は運なしで同じことをテストします、私はPython 3.6をインストールしました、そして現時点では、それは動作しません。
私は回避策を試みる、私はPython 3.4.3をインストールした、そしてこれを試してみる:
C:\socket> c:\Python34\python.exe setup.py py2exe
1)自分のスクリプトフォルダに入力します2)あなたが持っているウイルス対策を無効にします(奇妙なことに、別のSO question xDが知っています)
2)私の場合は、私はにインストールされている、彼の絶対パスでPython 3.4.3インタプリタを呼び出します。
C:\Python34
3)コマンドを実行する
c:\Python34\python.exe setup.py py2exe
私のように役立つことを願っています