IndexError: ดัชนี tuple อยู่นอกช่วงเมื่อใช้ py2exe


107

ฉันกำลังพยายามสร้างไฟล์ปฏิบัติการโดยใช้ 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ผล
Jean-François Fabre

1
สวัสดี Jean-Francois ฉันได้เพิ่มไฟล์ในโพสต์ต้นฉบับแล้ว ขอบคุณล่วงหน้า!
Dennis

1
เป็นStorybookmaker.pyแฟ้มในไดเรกทอรีเดียวกันเป็นsetup.py? คุณสามารถลองsetup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])ค้นหาไฟล์ได้
Jean-François Fabre

1
@ Jean-FrancoisFabre ทั้ง setup.py และ Storybookmaker.py ในโฟลเดอร์ C: \ Python36 ดังนั้นมันก็ไม่สำคัญ แต่ฉันก็ลองใช้รหัสของคุณต่อไป ได้รับ IndexError เดียวกัน ความคิดอื่น ๆ ?
Dennis

คำตอบ:


98

Python 3.6 ออกแบบ bytecode ใหม่ทั้งหมดสำหรับ CPython (ไม่ใช่รหัส "ไบต์" อีกต่อไป แต่เป็นรหัสคำโดยที่ opcodes ทั้งหมดมีความกว้างสองไบต์แทนที่จะเป็น 1-3)

ความล้มเหลวที่คุณเห็นเกิดขึ้นในpy2exeรหัสการแยกวิเคราะห์ opcode ซึ่งเนื่องจากเวอร์ชันล่าสุดที่โพสต์ล่าสุดของการpy2exeอ้างสิทธิ์สนับสนุน 3.3 และ 3.4 อาจไม่มีความรู้หรือสนับสนุน opcodes รหัสคำใหม่ พวกเขาไม่เคยคิดpy2exeเลยด้วยซ้ำว่ามีการอัพเดทครั้งล่าสุด Bytecode มักจะเปลี่ยนไปในรูปแบบเล็กน้อยจากเวอร์ชันหนึ่งไปยังเวอร์ชันที่สามารถทำลายแม้กระทั่ง Python 3.5 (ให้การสนับสนุน 3.3 และ 3.4 เท่านั้นที่อ้างสิทธิ์อย่างชัดเจน) แต่ 3.6 รับประกัน 100% ว่าจะล้มเหลว

อัปเดต:ณ จุดนี้ (พฤศจิกายน 2019) เป็นเวลากว่าห้าปีแล้วนับตั้งแต่py2exeรุ่นล่าสุดและภายในต้นปี 2020 (เมื่อการสนับสนุน Python 2 สิ้นสุดลงอย่างสมบูรณ์) จะไม่ทำงานบน Python เวอร์ชันที่รองรับ (3.4 ออกไปแล้ว ของการสนับสนุน) ฉันคิดว่ามันปลอดภัยที่จะบอกว่าโครงการนี้ถูกละทิ้ง หาตัวเลือกอื่น ๆ เช่นหรือcx_FreezePyInstaller


4
ไม่มีทางเลือกอื่นเลยเหรอ?
Alex Jolig

@AlexJolig: มีแม้ว่าฉันจะไม่ได้ตรวจสอบว่าเข้ากันได้กับ Python 3.6 ทั้งหมดหรือไม่ ฉันรู้จัก PyInstaller และ cx_Freeze; อาจมีคนอื่น ๆ
ShadowRanger

8
ฉันได้ทดสอบcx_freezeแล้ว เข้ากันได้กับ python3.6 แต่ไม่สามารถสร้างไฟล์ exe ไฟล์เดียวได้ ปัญหาPyinstallerคือคุณไม่สามารถสร้างไฟล์ x86 exe ผ่านระบบปฏิบัติการ x64
Alex Jolig

ขอบคุณสำหรับข้อมูลนี้ ต้องบอกว่าฉันประหลาดใจเล็กน้อยที่นี่ไม่ได้มีการบันทึกไว้ที่ไหนสักแห่ง แม้คำอธิบาย py2exe Python 3.3 and later are supportedเพียงกล่าวว่า แน่นอนว่าในการมองย้อนกลับไปอาจเป็นเรื่องไร้เดียงสาที่จะคาดหวังว่าบางสิ่งที่เก่ามากจะใช้งานได้ แต่เมื่อคุณเป็นผู้เริ่มต้นในพื้นที่นี้มีมือใหม่มากพอที่จะจัดการกับความสับสน
fostandy

40

วิธีแก้ปัญหาที่ฉันใช้คือใช้ PyInstaller เป็นทางเลือกเนื่องจาก Py2Exe หยุดการพัฒนาที่ python 3.4 และจะไม่ทำงานกับเวอร์ชันที่ใหม่กว่า

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

สิ่งนี้จะสร้างไดเร็กทอรีย่อยที่เรียกว่า dist โดยมี yourprogram.exe อยู่ในโฟลเดอร์ชื่อ yourprogram

ใช้ -F เพื่อวางไฟล์ที่สร้างขึ้นทั้งหมดในไฟล์ปฏิบัติการไฟล์เดียว

C:/>pyinstaller -F yourprogram

การใช้งานสามารถใช้ -w เพื่อหากคุณต้องการลบจอแสดงผลคอนโซลสำหรับ GUI

C:/>pyinstaller -w yourprogram.py

วางทุกอย่างสลับกัน

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

อ่านเพิ่มเติมเกี่ยวกับ PyInstaller ที่นี่

Python เวอร์ชัน 3.7.3


2
ถ้าฉันรันโปรแกรมบนคอมพิวเตอร์เครื่องอื่นฉันจะได้รับ "No module found erros .. "
yarin Cohen

ขอบคุณสำหรับการแก้ปัญหาของคุณเกี่ยวกับ pyinstaller จัดการสร้างโปรเจ็กต์แบบสแตนด์อโลนได้สำเร็จโดยใช้ minggw64 python3.8.2 release และ gtk บน windows 10: gi, gtk, dlls .. ทุกอย่างอยู่ที่นี่ในโฟลเดอร์ dist โดยใช้คำสั่ง "$ pyinstaller yourprogram" ง่ายๆในเชลล์ minggw64 pyinstaller + cython ดูเหมือนคอมโบที่ดี
jerome

10

ฉันมีปัญหาเดียวกันกับวิธีแก้ปัญหาที่ฉันใช้ cx_freeze แอปของฉันใช้ wxPython, windows 10, python 3.6, cx_freeze 5.5.1

นี่คือไฟล์ติดตั้งที่ฉันใช้และฉันได้รับไฟล์ msi ในโฟลเดอร์ 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")]
)`

แล้ว python setup.py bdist_msi


4
เช่นเดียวกับคุณฉันใช้ cx_freeze เพื่อสร้างไฟล์ปฏิบัติการเพราะเข้ากันได้กับเวอร์ชัน python ของฉันและใช้งานง่ายกว่า ขอขอบคุณที่แบ่งปันไฟล์การตั้งค่าของคุณเพื่อให้ทุกคนสามารถใช้เป็นตัวอย่างได้
Dennis

ถ้าฉันมีฉัน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?อาจเป็นคุณมี python 2 ตัวและต้องระบุว่าคุณต้องการอัปเดตตัวใด
Ricardo Martínez

โดยอง @Dennis
Ricardo Martínez

มาร์ติเนซเวอร์ชันนี้พูดว่า 3.5 แทนที่จะเป็น 3.6 ฉันระบุพา ธ เป็น 3.5 และ pip ​​8.1.1 ติดตั้งสำหรับ 3.5 เท่านั้นเนื่องจาก 3.6 มี 9.0.1 อยู่แล้ว ฉันจะลองให้คำแนะนำกับคุณหลายเวอร์ชัน
Dennis

ขออภัยในความล่าช้าป้อนในโฟลเดอร์ Python ของคุณและเรียกใช้ 'python -m pip install --upgrade pip' และอัปเดต Python 3.5 Pip ของคุณ
Ricardo Martínez

0

ในขณะที่เขียน python-version ล่าสุดคือ 3.8และpy2exe ใช้งานได้จนถึง python-3.4 pyinstallerทำงานได้จนถึง python-3.7 ใช้pyinstaller 's เลือกบรรทัดคำสั่ง (เช่น--onefileที่จะทำให้การปฏิบัติการแบบสแตนด์อโลน) เป็นเรื่องง่ายกว่าตัวเลือกลงในการเข้ารหัสpy2exe ' s ไฟล์ setup.py ... โดยเฉพาะอย่างยิ่งตั้งแต่ไฟล์ setup.py ที่ทำงานสำหรับ python2 จะไม่ได้ทำงาน สำหรับ python3 ตัวเลือกpyinstaller ที่มีประโยชน์อีกตัวคือ--noconsoleเพื่อให้การเรียกใช้งานเริ่มต้นเป็นกระบวนการพื้นหลัง

ดังนั้นวิธีการแก้ปัญหาเวลาน้อยใช้หลามโมดูลvirtualenv จากนั้นคุณสามารถสร้างไฟล์ปฏิบัติการได้โดยไม่ต้องถอนการติดตั้ง Python-เวอร์ชันปัจจุบันพร้อมกับโมดูลทั้งหมดเพื่อแทนที่ด้วยเวอร์ชันเก่ากว่า

C:\Users\jf>pip install virtualenv
C:\Users\jf>python -m virtualenv box37 -p c:\users\jf\python37\python.exe
C:\Users\jf>C:\Users\jf\box37\Scripts\activate
(box37) C:\Users\jf>
(box37) C:\Users\jf>pip install pyinstaller
(box37) C:\Users\jf>pyinstaller --onefile test.py
(box37) C:\Users\jf>deactivate
C:\Users\jf>

ตัวเลือกบรรทัดคำสั่ง-pc: \ path \ to \ target \ python \ interpreterเป็นตัวพิมพ์เล็กและใหญ่! สำหรับpyinstaller ให้ใช้เส้นทางที่คุณดาวน์โหลด python-3.7 ไปยัง ( py2exeเส้นทางไปยัง 3.4)

เมื่อสร้าง env เสมือน สร้างไดเร็กทอรีที่มีชื่อของคุณ (เช่น box37) ในไดเร็กทอรีการทำงาน การเรียกใช้สคริปต์\ Script \ เปิดใช้งานภายในไดเร็กทอรีนี้เข้าสู่ virutal env - ประกาศ (box37) ปรากฏก่อนพร้อมต์ของฉัน

ภายใน python virtual env pipใช้เพื่อติดตั้งโมดูลที่ python ภายนอกเข้าไม่ได้ - สังเกตว่ามันมีไดเร็กทอรี \ Lib \ site-package ของตัวเอง ดังนั้นสิ่งที่ทำให้Virtualenvเป็นโมดูลการตั้งค่าการทดสอบที่สมบูรณ์แบบ - หากคุณทำผิดพลาดเพียงแค่ลบไดเร็กทอรี (เช่น box37)

ดาวน์โหลด Python 3.7 , ตัวติดตั้งปฏิบัติการ Windows x86-64 ดาวน์โหลดตัวติดตั้งPython 3.4 , Windows x86-64 MSI

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.