IndexError: indeks tupel di luar jangkauan saat menggunakan py2exe

106

Saat ini saya mencoba membuat file yang dapat dieksekusi menggunakan py2exe. Saya menggunakan Python 3.6. Skrip yang saya gunakan impor openpyxldan pptxdan berjalan dengan baik ketika saya menggunakan Pycharm atau menjalankan skrip menggunakan jendela perintah.

Output menghasilkan kesalahan:

IndexError: tuple index out of range

Di bawah ini Anda dapat menemukan cmdhasilnya:

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>

Apa penyebabnya IndexError?

Edit: ini setup.pyfilenya:

from distutils.core import setup
import py2exe

setup(console=['Storybookmaker.py'])
Dennis
sumber
2
dapatkah Anda menunjukkan setup.pyfile Anda ? karena masalahnya ada dan bukan di py2exemana yang berfungsi dengan baik.
Jean-François Fabre
1
Hai Jean-Francois, saya telah menambahkan file di postingan asli. Terima kasih sebelumnya!
Dennis
1
adalah Storybookmaker.pyfile dalam direktori yang sama dengan setup.py? Anda dapat mencoba setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])untuk menemukan file tersebut.
Jean-François Fabre
1
@ Jean-FrancoisFabre Baik setup.py dan Storybookmaker.py di folder C: \ Python36, jadi itu tidak masalah tetapi saya tetap mencobanya dengan kode Anda. Itu mendapatkan IndexError yang sama. Ada pemikiran lain?
Dennis

Jawaban:

96

Python 3.6 sepenuhnya mendesain ulang bytecode untuk CPython (ini bukan kode "byte" sama sekali, ini adalah kode kata, di mana semua opcode lebarnya dua byte, bukan 1-3).

Kegagalan yang Anda lihat terjadi dalam py2exekode parsing opcode, yang, mengingat versi terbaru yang diposting py2exehanya mengklaim dukungan untuk 3.3 dan 3.4, tidak mungkin memiliki pengetahuan, atau dukungan untuk, opcode kode kata baru; mereka bahkan belum dipahami pada saat py2exeterakhir diperbarui. Bytecode sering berubah dalam cara-cara kecil dari versi ke versi yang dapat merusak Python 3.5 (mengingat hanya dukungan 3.3 dan 3.4 yang diklaim secara eksplisit), tetapi 3.6 dijamin 100% gagal.

Pembaruan: Pada titik ini (November 2019), sudah lebih dari lima tahun sejak py2exerilis terakhir , dan pada awal tahun 2020 (ketika dukungan Python 2 hilang sepenuhnya), itu tidak akan berjalan pada versi Python yang didukung (3.4 sudah keluar dukungan). Saya pikir aman untuk mengatakan proyek tersebut ditinggalkan; temukan opsi lain, misalnya cx_Freezeatau PyInstaller.

ShadowRanger
sumber
4
Jadi apakah tidak ada alternatif lain?
Alex Jolig
@AlexJolig: Ada, meskipun saya belum memeriksa apakah semuanya kompatibel dengan Python 3.6. Saya mengetahui PyInstaller dan cx_Freeze; mungkin ada orang lain.
ShadowRanger
8
Saya sudah menguji cx_freeze. Ini kompatibel dengan python3.6 tetapi tidak dapat membuat satu file exe. Masalahnya Pyinstalleradalah Anda tidak dapat membuat file exe x86 melalui os x64
Alex Jolig
Terima kasih atas info ini. Harus mengatakan saya agak terkejut ini tidak benar-benar didokumentasikan di suatu tempat. Bahkan deskripsi py2exe hanya mengatakan Python 3.3 and later are supported. Tentu, jika dipikir-pikir, mungkin agak naif mengharapkan sesuatu yang begitu tua untuk bekerja, tetapi ketika Anda seorang pemula di bidang ini, ada cukup banyak pemula yang harus dihadapi.
fostandy
39

Solusi yang saya gunakan adalah menggunakan PyInstaller sebagai alternatif karena Py2Exe menghentikan pengembangan di python 3.4 dan tidak akan berfungsi dengan versi yang lebih baru.

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

Ini akan membuat subdirektori bernama dist dengan programAnda.exe yang terdapat dalam folder bernama programAnda.

Gunakan -F untuk menempatkan semua file yang dihasilkan dalam satu file yang dapat dieksekusi.

C:/>pyinstaller -F yourprogram

Gunakan dapat menggunakan -w ke jika Anda ingin menghapus tampilan konsol untuk GUI.

C:/>pyinstaller -w yourprogram.py

Menempatkan semuanya lebih keras.

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

Baca lebih lanjut tentang PyInstaller di sini .

Python versi 3.7.3.

berulang sampai
sumber
2
Jika saya menjalankan program di komputer lain, saya mendapatkan "No module found erros .."
yarin Cohen
terima kasih atas solusi Anda tentang pyinstaller. berhasil membuat proyek mandiri menggunakan rilis minggw64 python3.8.2 dan gtk di windows 10: gi, gtk, dlls..semuanya ada di sini di folder dist menggunakan perintah "$ pyinstaller yourprogram" sederhana di minggw64 shell. pyinstaller + cython terlihat seperti kombo yang bagus.
jerome
10

Saya memiliki masalah yang sama, sebagai solusi saya menggunakan cx_freeze. Aplikasi saya didasarkan pada wxPython, windows 10, python 3.6, cx_freeze 5.5.1

Ini adalah file setup yang saya gunakan dan saya mendapatkan file msi di folder dist.

#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")]
)`

kemudian python setup.py bdist_msi

Ezequiel Alanís
sumber
4
Seperti Anda, saya menggunakan cx_freeze untuk membuat sebuah executable karena ini kompatibel dengan versi python saya dan lebih mudah digunakan. Terima kasih telah membagikan file setup Anda sehingga orang dapat menggunakan ini sebagai contoh.
Dennis
Jika saya punya from PyQt5 import QtGuibagaimana cara memasukkannya packages? Hanya PyQt5atau hanya QtGuiatau keduanya?
Hrvoje T
Hrvoje T, saya sudah memasukkan semuanya PyQt5.
Taras Mykhalchuk
7

Saya telah sukses dengan program Python 3.6 menggunakan garpu py2exe di https://github.com/albertosottile/py2exe .

Rasjid Wilcox
sumber
Bekerja untuk saya di Python 3.7
adejones
7

Saya mencoba solusi, dengan menginstal Python 3.4.3:

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

1) masukkan ke dalam folder skrip Anda

2) nonaktifkan antivirus apa pun yang Anda miliki (anehnya, diketahui dengan pertanyaan SO lain xD)

3) panggil interpreter python 3.4.3 dengan jalur absolutnya, dalam kasus saya, saya telah menginstal di:

C:\Python34

4) jalankan perintah

C:\Python34\python.exe setup.py py2exe
Ricardo Martínez
sumber
Saya mencoba melakukan hal yang sama dengan Python 3.5 tetapi macet saat menginstal py2exe karena pip membutuhkan versi yang lebih baru, saya mendapatkan kesalahan. 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.Saat saya mencoba mengupgrade pip, saya mendapatkan error yang sama!
Dennis
Seperti yang saya lihat, Anda memiliki 2 pilihan: 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?mungkin Anda memiliki 2 python dan perlu menentukan mana yang ingin Anda perbarui.
Ricardo Martínez
ngomong-ngomong, @Dennis
Ricardo Martínez
Martinez versi sekarang mengatakan 3.5, bukan 3.6. Saya menentukan jalur ke 3.5 dan pip 8.1.1 hanya dipasang untuk 3.5, karena 3.6 sudah memiliki 9.0.1. Saya akan mencoba saran Anda dengan berbagai versi.
Dennis
Maaf atas keterlambatannya, masukkan ke dalam Folder Python Anda dan jalankan 'python -m pip install --upgrade pip', dan perbarui Python 3.5 Pip Anda
Ricardo Martínez