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


106

私は現在、py2exeを使用して実行可能ファイルを作成しようとしています。私はPython 3.6を使用しています。私が使用しているスクリプトはインポートでopenpyxlありpptx、Pycharmを使用したり、コマンドウィンドウを使用してスクリプトを実行したりすると正常に実行されます。

出力はエラーを生成します:

IndexError: tuple index out of range

以下は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'])

2
setup.pyファイルを見せてもらえますか?問題はそこにあり、py2exeどちらもうまく機能しないためです。
ジャン=フランソワ・ファーブル

1
こんにちはJean-Francoisです。元の投稿にファイルを追加しました。前もって感謝します!
Dennis

1
であるStorybookmaker.pyと同じディレクトリにあるファイルはsetup.pysetup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])ファイルの場所を確認してみてください。
ジャン=フランソワ・ファーブル

1
@ Jean-FrancoisFabre C:\ Python36フォルダーにあるsetup.pyとStorybookmaker.pyの両方なので、問題はないはずですが、コードで試してみました。同じIndexErrorを取得します。他に何か考えはありますか?
デニス

回答:


96

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

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

更新:この時点(2019年11月)では、前回のpy2exeリリースから5年以上経過しており、2020年の初め(Python 2のサポートが完全に終了したとき)までは、サポートされているどのバージョンのPython(3.4はすでにリリースされています)では実行されません。サポートの)。プロジェクトが中止されたと言っても安全だと思います。cx_Freezeまたはなどの他のオプションを検索しますPyInstaller


4
だから代替手段はありませんか?
Alex Jolig 2017年

@AlexJolig:ありますが、すべてがPython 3.6互換かどうかは確認していません。PyInstallerとcx_Freezeは知っています。他にもあるかもしれません。
ShadowRanger 2017年

8
私はテストしましたcx_freeze。python3.6と互換性がありますが、単一のexeファイルを作成できません。問題Pyinstallerは、x64 os経由でx86 exeファイルを作成できないことです
Alex Jolig

この情報をありがとう。これが実際にどこかに前もって文書化されていないことに少し驚いていると言わなければならない。py2exeの説明でさえ、単に言っているだけPython 3.3 and later are supportedです。確かに、後から考えると、非常に古いものが機能することを期待するのはおそらく少しナイーブですが、この領域の初心者であれば、対処するのに十分な初心者の交絡があります。
fostandy

39

Py2Exeはpython 3.4で開発を停止し、新しいバージョンでは動作しないため、私が使用したソリューションはPyInstallerを代替として使用することでした。

C:/>pip install pyinstaller
C:/>pyinstaller yourprogram.py

これにより、yourprogramというフォルダに含まれるyourprogram.exeを使用して、distというサブディレクトリが作成されます。

-Fを使用して、生成されたすべてのファイルを1つの実行可能ファイルに配置します。

C:/>pyinstaller -F yourprogram

GUIのコンソール表示を削除する場合は、-w toを使用できます。

C:/>pyinstaller -w yourprogram.py

全部入れて。

C:/>pyinstaller -w -F yourprogram.py

PyInstallerの詳細については、こちらをご覧ください

Pythonバージョン3.7.3。


2
他のコンピューターでプログラムを実行すると、「No module found erros ..」が表示されます
yarin Cohen

pyinstallerについての解決策に感謝します。Windows 10でminggw64 python3.8.2リリースとgtkを使用してスタンドアロンプ​​ロジェクトを正常に作成しました。gi、gtk、dlls..everythingは、minggw64シェルの単純な「$ pyinstaller yourprogram」コマンドを使用してdistフォルダーにあります。pyinstaller + cythonは素晴らしいコンボのように見えます。
ジェローム

10

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


4
あなたのように、私はcx_freezeを使用して実行可能ファイルを作成しました。これは、これが私のpythonバージョンと互換性があり、使いやすいためです。設定ファイルを共有していただきありがとうございます。これを参考にしてください。
デニス

from PyQt5 import QtGuiどうすれば入力できpackagesますか?唯一PyQt5か、QtGuiそれとも両方か?
Hrvoje T

Hrvoje T、私は全体を含めましたPyQt5
Taras Mykhalchuk


7

私はPython 3.4.3をインストールして回避策を試しました:

C:\socket> c:\Python34\python.exe setup.py py2exe

1)スクリプトフォルダーに入力します

2)お持ちのアンチウイルスを無効にします(奇妙なことに、別のSO質問xDで知ってください)

3)python 3.4.3インタープリターを絶対パスで呼び出します。私の場合は、次の場所にインストールしました。

C:\Python34

4)コマンドを実行する

C:\Python34\python.exe setup.py py2exe

Python 3.5でも同じことをしようとしましたが、py2exeのインストールで行き詰まりました。pipには新しいバージョンが必要なので、エラーが発生します。You are using pip version 8.1.1, however version 9.0.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.pipをアップグレードしようとすると、同じエラーが発生します。
Dennis

私が見るように、あなたには2つの選択肢1) Try with Python 3.4.3, this one i have already tested. 2) Identify which python you have, when you type at console 'python', what version says?があります: あなたが2つのpythonを持っていて、どれを更新したいかを指定する必要があるかもしれません。
RicardoMartínez2017年

ところで、@Dennis
リカルド・マルティネス

マルチネスのバージョンは、3.6ではなく3.5になりました。3.5へのパスを指定しましたが、3.6にはすでに9.0.1があるため、pip 8.1.1は3.5にのみインストールされます。複数のバージョンでアドバイスしてみます。
デニス

申し訳ありませんが遅延のため、あなたのPythonフォルダに入力して実行「のpython -mピップインストール--upgradeピップ」、そしてあなたのPython 3.5ピップを更新
リカルド・マルティネス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.