IndexError: py2.exe का उपयोग करते समय tuple index को सीमा से बाहर


106

मैं वर्तमान में py2.exe का उपयोग करके एक निष्पादन योग्य बनाने की कोशिश कर रहा हूं। मैं पायथन 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जिसमें ठीक काम करता है।
जीन फ़्राँस्वा Fabre

1
हाय जीन-फ्रेंकोइस, मैंने फाइल को मूल पोस्ट में जोड़ दिया है। अग्रिम में धन्यवाद!
डेनिस

1
के Storybookmaker.pyरूप में एक ही निर्देशिका में फ़ाइल है setup.py? आप setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])फ़ाइल का पता लगाना सुनिश्चित करने का प्रयास कर सकते हैं ।
जीन फ़्राँस्वा Fabre

1
@ जीन-फ्रेंकोइसफैबरे सेटअप और स्टोरीबुकमेकरोकोम दोनों ही C: \ Python36 फ़ोल्डर में, ताकि कोई फर्क न पड़े लेकिन मैंने इसे आपके कोड के साथ वैसे भी आज़माया। यह एक ही IndexError मिलता है। कोई और विचार?
डेनिस

जवाबों:


96

पायथन 3.6 ने पूरी तरह से CPython के लिए बाइटकोड को फिर से डिज़ाइन किया (यह अब बिल्कुल भी "बाइट" कोड नहीं है, यह एक शब्दकोष है, जहां सभी ऑपकोड 1-3 के बजाय दो बाइट्स चौड़े हैं)।

आपको जो विफलता दिखाई दे रही है, वह py2exeओपकोड पार्सिंग कोड में होती है , जिसने py2exe3.3 और 3.4 के लिए केवल दावों के समर्थन का सबसे हाल ही में पोस्ट किया गया संस्करण दिया है , संभवतः नए वर्डकोड ऑपकोड के लिए या समर्थन का ज्ञान नहीं हो सकता है; py2exeपिछली बार अपडेट किए जाने के समय उनकी कल्पना भी नहीं की गई थी । बाइटकोड अक्सर संस्करण से संस्करण में छोटे तरीके से बदलता है जो पायथन 3.5 को भी तोड़ सकता है (केवल 3.3 और 3.4 समर्थन को स्पष्ट रूप से दावा किया गया है), लेकिन 3.6 को विफल करने की गारंटी 100% है।

अपडेट: इस बिंदु पर (नवंबर २०१ ९), यह पिछले py2exeरिलीज़ के पांच साल से अधिक समय से है , और २०२० की शुरुआत में (जब पायथन २ सपोर्ट लैप्स पूरी तरह से), यह पायथन के किसी भी समर्थित संस्करण पर नहीं चलेगा (३.४ पहले से ही बाहर है समर्थन का)। मुझे लगता है कि यह कहना सुरक्षित है कि परियोजना को छोड़ दिया गया है; अन्य विकल्प खोजें, जैसे cx_Freezeया PyInstaller


4
तो क्या कोई विकल्प नहीं है?
एलेक्स जॉलीग

@AlexJolig: हालांकि, मैंने जांच नहीं की है कि वे सभी पायथन 3.6 संगत हैं। मैं PyInstaller और cx_Freeze से अवगत हूं; अन्य भी हो सकते हैं।
शैडो रेंजर

8
मैंने परीक्षण किया है cx_freeze। यह python3.6 के साथ संगत है, लेकिन यह एक एकल exe फ़ाइल नहीं बना सकता है। आपके साथ समस्या यह है Pyinstallerकि आप एक x64 ओएस के माध्यम से x86 exe फ़ाइल नहीं बना सकते हैं
एलेक्स जोलीग

इस जानकारी के लिए धन्यवाद। मुझे कहना चाहिए कि मुझे आश्चर्य है कि यह वास्तव में सामने कहीं दस्तावेज नहीं है। यहां तक ​​कि py2exe वर्णन केवल कहता है Python 3.3 and later are supported। निश्चित रूप से, दृष्टिहीनता में, काम करने के लिए कुछ पुराना होने की उम्मीद करना थोड़ा सा भोलापन है, लेकिन जब आप इस स्थान पर शुरुआत करते हैं, तो इससे निपटने के लिए पर्याप्त नौसिखिया संघर्ष होता है।
फॉस्टंडी

39

मैंने जो समाधान किया वह PyInstaller को एक विकल्प के रूप में उपयोग करना था क्योंकि Py2Exe ने अजगर 3.4 पर विकास रोक दिया और नए संस्करणों के साथ काम नहीं करेगा।

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

यह एक उपनिर्देशिका बनाएगा जिसे yourprogram.exe के साथ डिस्टर्ब किया जाएगा जो कि आपके फोल्डरग्राम नामक फोल्डर में निहित है।

उपयोग -F एक निष्पादन योग्य फ़ाइल में सभी उत्पन्न फ़ाइलों को रखने के लिए।

C:/>pyinstaller -F yourprogram

यदि आप GUI के लिए कंसोल डिस्प्ले को हटाना चाहते हैं, तो -w का उपयोग कर सकते हैं।

C:/>pyinstaller -w yourprogram.py

यह सब togerther डाल रहा है।

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

PyInstaller के बारे में अधिक यहाँ पढ़ें ।

पायथन संस्करण 3.7.3।


2
यदि मैं अन्य कंप्यूटरों पर प्रोग्राम चलाता हूं, तो मुझे "कोई मॉड्यूल नहीं मिला
इरोस

pyinstaller के बारे में आपके समाधान के लिए धन्यवाद। सफलतापूर्वक विंडो 10 पर minggw64 python3.8.2 रिलीज़ और gtk का उपयोग करके एक स्टैंडअलोन प्रोजेक्ट बनाने का प्रबंधन करें: minggw64 शेल में एक साधारण "$ pinstallinstaller yourprogram" कमांड का उपयोग करके यहाँ दूर फ़ोल्डर में है। pyinstaller + साइथन एक अच्छा कॉम्बो की तरह दिखता है।
जेरोम

10

मेरे पास एक ही समस्या थी, क्योंकि वर्कअराउंड मैंने cx_freeze का उपयोग किया था। मेरा ऐप wxPython, windows 10, python 3.6, cx_freeze 5.5.1 पर आधारित है

यह सेटअप फ़ाइल है जिसका मैंने उपयोग किया है और मुझे डिस्ट फ़ोल्डर पर 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 का उपयोग किया क्योंकि यह मेरे पायथन संस्करण के साथ संगत था और उपयोग करने में आसान था। अपनी सेटअप फ़ाइल साझा करने के लिए धन्यवाद, ताकि लोग इसे एक उदाहरण के रूप में उपयोग कर सकें।
डेनिस

अगर मेरे पास है from PyQt5 import QtGuiतो मैं इसे कैसे दर्ज करूं packages? केवल PyQt5या केवल QtGuiया दोनों?
हृदयोज टी

ह्रीवो टी, मैंने पूरा शामिल किया है PyQt5
तारास मायखलचुक


7

मैंने पायथन 3.4.3 स्थापित करके वर्कअराउंड की कोशिश की:

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

1) अपने स्क्रिप्ट फ़ोल्डर में दर्ज करें

2) किसी भी एंटीवायरस को निष्क्रिय करें जो आपके पास है (अजीब बात है, एक और SO प्रश्न xD द्वारा जानें)

3) अपने पूर्ण मार्ग से अजगर 3.4.3 दुभाषिया को फोन करें, मेरे मामले में, मैंने इसमें स्थापित किया है:

C:\Python34

4) कमांड निष्पादित करें

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

मैंने पायथन 3.5 के साथ एक ही काम करने की कोशिश की, लेकिन py2exe स्थापित करने में फंस गया क्योंकि पाइप को एक नए संस्करण की आवश्यकता है, मुझे एक त्रुटि मिलती है। 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.जब मैं पाइप को अपग्रेड करने की कोशिश करता हूं, तो मुझे वही त्रुटि मिलती है!
डेनिस

जैसा कि मैंने देखा, आपके पास 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 अजगर हों और आपको यह निर्दिष्ट करने की आवश्यकता हो कि आप किसे अपडेट करना चाहते हैं।
रिकार्डो मार्टिनेज

वैसे, @ डेनिस
रिकार्डो मार्टिनेज

मार्टिनेज संस्करण अब 3.6 के बजाय 3.5 कहता है। मैंने 3.5 को पथ निर्दिष्ट किया है और पाइप 8.1.1 केवल 3.5 के लिए स्थापित है, क्योंकि 3.6 में पहले से 9.0.1 है। मैं आपको कई संस्करणों के साथ सलाह देने की कोशिश करूंगा।
डेनिस

देरी के लिए क्षमा करें, अपने पायथन फ़ोल्डर में प्रवेश करें और 'पायमॉन-एम पाइप इंस्टॉल - अपग्रेड पाइप' चलाएं, और अपने पायथन 3.5 पिप को अपडेट करें
रिकार्डो मार्टिनेज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.