IndexError: tuple index nằm ngoài phạm vi khi sử dụng py2exe


106

Tôi hiện đang cố gắng tạo tệp thực thi bằng py2exe. Tôi sử dụng Python 3.6. Tập lệnh tôi đang sử dụng nhập openpyxlpptxchạy tốt khi tôi sử dụng Pycharm hoặc chạy tập lệnh bằng cửa sổ lệnh.

Đầu ra tạo ra lỗi:

IndexError: tuple index out of range

Dưới đây bạn có thể tìm thấy cmdđầu ra:

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>

Điều gì gây ra IndexError?

Chỉnh sửa: đây là setup.pytệp:

from distutils.core import setup
import py2exe

setup(console=['Storybookmaker.py'])

2
bạn có thể cho chúng tôi xem setup.pytệp của bạn không? bởi vì vấn đề là ở đó và không phải trong py2exeđó hoạt động tốt.
Jean-François Fabre

1
Xin chào Jean-Francois, tôi đã thêm tệp trong bài đăng gốc. Cảm ơn trước!
Dennis

1
Storybookmaker.pytập tin trong cùng một thư mục với setup.py? bạn có thể cố gắng setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])để chắc chắn định vị tệp.
Jean-François Fabre

1
@ Jean-FrancoisFabre Cả setup.py và Storybookmaker.py trong thư mục C: \ Python36, vì vậy điều đó không thành vấn đề nhưng tôi vẫn thử nó với mã của bạn. Nó nhận được cùng một IndexError. Có suy nghĩ nào khác không?
Dennis

Câu trả lời:


96

Python 3.6 đã thiết kế lại hoàn toàn mã bytecode cho CPython (nó không phải là mã "byte" nữa, nó là một mã từ, trong đó tất cả các mã opcode đều có chiều rộng là hai byte thay vì 1-3).

Lỗi mà bạn đang thấy xảy ra trong py2exemã phân tích cú pháp opcode, với phiên bản được đăng gần đây py2exenhất chỉ có tuyên bố hỗ trợ cho 3.3 và 3.4, không thể có kiến ​​thức hoặc hỗ trợ cho các opcode từ mới; chúng thậm chí chưa được hình thành vào thời điểm py2exeđược cập nhật lần cuối. Bytecode thường thay đổi theo những cách nhỏ từ phiên bản này sang phiên bản khác có thể phá vỡ thậm chí cả Python 3.5 (chỉ hỗ trợ 3.3 và 3.4 được tuyên bố rõ ràng), nhưng 3.6 được đảm bảo 100% không thành công.

Cập nhật: Tại thời điểm này (tháng 11 năm 2019), đã hơn năm năm kể từ lần py2exephát hành cuối cùng và đến đầu năm 2020 (khi hỗ trợ Python 2 hết hiệu lực hoàn toàn), nó sẽ không chạy trên bất kỳ phiên bản Python nào được hỗ trợ (3.4 đã hết hạn hỗ trợ). Tôi nghĩ rằng thật an toàn khi nói rằng dự án bị bỏ rơi; tìm các tùy chọn khác, ví dụ cx_Freezehoặc PyInstaller.


4
Vì vậy, không có bất kỳ lựa chọn thay thế?
Alex Jolig

@AlexJolig: Có, mặc dù tôi chưa kiểm tra xem chúng có tương thích với Python 3.6 hay không. Tôi biết về PyInstaller và cx_Freeze; có thể có những người khác.
ShadowRanger

8
Tôi đã thử nghiệm cx_freeze. Nó tương thích với python3.6 nhưng nó không thể tạo một tệp exe duy nhất. Vấn đề với Pyinstallerlà bạn không thể tạo tập tin exe x86 qua một os x64
Alex Jolig

Cảm ơn vì thông tin này. Phải nói rằng tôi hơi ngạc nhiên vì điều này không thực sự được ghi lại ở đâu đó. Ngay cả mô tả py2exe chỉ đơn thuần nói Python 3.3 and later are supported. Chắc chắn, trong nhận thức muộn màng, có lẽ hơi ngây thơ khi mong đợi một thứ gì đó quá cũ kỹ hoạt động nhưng khi bạn là người mới bắt đầu trong lĩnh vực này, có đủ điều khó hiểu đối với người mới.
fostandy

39

Giải pháp tôi đã sử dụng là sử dụng PyInstaller như một giải pháp thay thế vì Py2Exe đã ngừng phát triển ở python 3.4 và sẽ không hoạt động với các phiên bản mới hơn.

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

Thao tác này sẽ tạo một thư mục con được gọi là dist với yourprogram.exe được chứa trong một thư mục có tên là chương trình của bạn.

Sử dụng -F để đặt tất cả các tệp được tạo trong một tệp thực thi.

C:/>pyinstaller -F yourprogram

Sử dụng có thể sử dụng -w để nếu bạn muốn loại bỏ màn hình giao diện điều khiển cho GUI.

C:/>pyinstaller -w yourprogram.py

Đưa tất cả vào togerther.

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

Đọc thêm về PyInstaller tại đây .

Phiên bản Python 3.7.3.


2
Nếu tôi chạy chương trình trên máy tính khác, tôi nhận được "Không tìm thấy mô-đun erros .."
yarin Cohen

cảm ơn vì giải pháp của bạn về pyinstaller. quản lý thành công để tạo một dự án độc lập bằng cách sử dụng bản phát hành minggw64 python3.8.2 và gtk trên windows 10: gi, gtk, dlls.. mọi thứ đều ở đây trong thư mục dist bằng lệnh đơn giản "$ pyinstaller yourprogram" trong minggw64 shell. pyinstaller + cython trông giống như một kết hợp đẹp mắt.
jerome

10

Tôi đã gặp vấn đề tương tự, như giải pháp thay thế tôi đã sử dụng cx_freeze. Ứng dụng của tôi dựa trên wxPython, windows 10, python 3.6, cx_freeze 5.5.1

Đây là tệp thiết lập mà tôi đã sử dụng và tôi nhận được tệp msi trên thư mục 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")]
)`

sau đó python setup.py bdist_msi


4
Giống như bạn, tôi đã sử dụng cx_freeze để tạo tệp thực thi vì tệp này tương thích với phiên bản python của tôi và dễ sử dụng hơn. Cảm ơn bạn đã chia sẻ tệp thiết lập của mình để mọi người có thể sử dụng tệp này làm ví dụ.
Dennis

Nếu có tôi from PyQt5 import QtGuilàm cách nào để nhập vào packages? Chỉ PyQt5hoặc duy nhất QtGuihoặc cả hai?
Hrvoje T

Hrvoje T, tôi đã bao gồm toàn bộ PyQt5.
Taras Mykhalchuk


7

Tôi đã thử một cách giải quyết khác, bằng cách cài đặt Python 3.4.3:

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

1) nhập vào thư mục tập lệnh của bạn

2) hủy kích hoạt bất kỳ phần mềm chống vi-rút nào mà bạn có (điều kỳ lạ, hãy biết bởi câu hỏi SO khác xD)

3) gọi trình thông dịch python 3.4.3 theo đường dẫn tuyệt đối của anh ta, trong trường hợp của tôi, tôi đã cài đặt trong:

C:\Python34

4) thực hiện lệnh

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

Tôi đã cố gắng làm điều tương tự với Python 3.5 nhưng gặp khó khăn khi cài đặt py2exe vì pip cần phiên bản mới hơn, tôi gặp lỗi. 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.Khi tôi cố gắng nâng cấp pip, tôi cũng gặp lỗi tương tự!
Dennis

Như tôi thấy, bạn có 2 lựa chọn: 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?có thể là bạn có 2 python và cần chỉ định cái nào bạn muốn cập nhật.
Ricardo Martínez

nhân tiện, @Dennis
Ricardo Martínez

Phiên bản Martinez hiện nói là 3.5 thay vì 3.6. Tôi đã chỉ định đường dẫn đến 3.5 và pip 8.1.1 chỉ được cài đặt cho 3.5, vì 3.6 đã có 9.0.1. Tôi sẽ thử lời khuyên của bạn với nhiều phiên bản.
Dennis

Xin lỗi vì sự chậm trễ, nhập bằng Python thư mục của bạn và chạy 'python -m pip cài đặt --upgrade pip', và cập nhật của bạn Python 3.5 Pip
Ricardo Martínez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.