web-dev-qa-db-ja.com

Python - IndexError:py2exe使用時のタプルインデックスが範囲外

私は現在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'])
74
Dennis

Python 3.6 CPython用にバイトコードを完全に再設計しました (これはもう「バイト」コードではなく、ワードコードです。オペコードは1〜3ではなく2バイトです)。

あなたが目にしている失敗はpy2exeオペコード解析コードで発生します、それはpy2exeの最新の投稿されたバージョンだけが3.3と3.4のサポートを主張するので、おそらく新しいワードコードオペコードの知識もサポートもできません。 py2exeが最後に更新された時点では、それらも考えられていませんでした。バイトコードはしばしばバージョンごとに少しずつ変化し、Python 3.5でも壊れる可能性があります(3.3と3.4のサポートのみが明示的に主張されている場合)が、3.6は失敗することが100%保証されています。

57
ShadowRanger

回避策として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

8

私が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.

8
recurseuntilfor

デニス、あなたより数時間遅れて、私は運なしで同じことをテストします、私は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

私のように役立つことを願っています

5