IndexError: py2exe kullanılırken tuple dizini aralık dışı


107

Şu anda py2exe kullanarak bir yürütülebilir dosya yapmaya çalışıyorum. Python 3.6 kullanıyorum. Komut Ben ithalatı kullanıyorum openpyxlve pptxben pycharm kullanın veya komut penceresini kullanarak komut dosyasını çalıştırdığınızda ve çalışır cezası.

Çıktı şu hatayı üretir:

IndexError: tuple index out of range

Aşağıda cmdçıktıyı bulabilirsiniz :

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>

Ne sebep olur IndexError?

Düzenleme: işte setup.pydosya:

from distutils.core import setup
import py2exe

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

2
bize setup.pydosyanızı gösterir misiniz ? çünkü sorun orada ve py2exehangisinde iyi çalışmıyor.
Jean-François Fabre

1
Merhaba Jean-Francois, dosyayı orijinal gönderiye ekledim. Şimdiden teşekkürler!
Dennis

1
olduğu Storybookmaker.pyaynı dizine dosya setup.py? setup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])dosyayı bulduğunuzdan emin olmayı deneyebilirsiniz .
Jean-François Fabre

1
@ Jean-FrancoisFabre C: \ Python36 klasöründe hem setup.py hem de Storybookmaker.py, bu önemli olmamalı ama yine de kodunuzla denedim. Aynı IndexError değerini alır. Başka düşünceleriniz var mı?
Dennis

Yanıtlar:


98

Python 3.6 , CPython için bayt kodunu tamamen yeniden tasarladı (artık bir "bayt" kodu değil, tüm işlem kodlarının 1-3 yerine iki bayt genişliğinde olduğu bir kelime kodudur).

Gördüğünüz hata py2exe, py2exeyalnızca 3.3 ve 3.4 için talep desteğinin en son yayınlanan sürümü göz önüne alındığında , yeni kelime kodu işlem kodları hakkında bilgi sahibi olamayacak veya bunları destekleyemeyecek işlem kodu ayrıştırma kodunda meydana gelir ; en py2exeson güncellendiklerinde onlar henüz tasarlanmamıştı . Bayt kodu genellikle sürümden sürüme, Python 3.5'i bile kırabilecek küçük şekillerde değişir (yalnızca 3.3 ve 3.4 desteği açıkça talep edilir), ancak 3.6'nın başarısız olması% 100 garantilidir.

Güncelleme: Bu noktada (Kasım 2019), son py2exesürümden bu yana beş yıldan fazla zaman geçti ve 2020'nin başında (Python 2 desteği tamamen sona erdiğinde), Python'un desteklenen herhangi bir sürümünde çalışmayacak (3.4 zaten çıktı destek). Sanırım projenin terk edildiğini söylemek güvenli; diğer seçenekleri bulun, örneğin cx_Freezeveya PyInstaller.


4
Öyleyse herhangi bir alternatif yok mu?
Alex Jolig

@AlexJolig: Var, ancak hepsinin Python 3.6 uyumlu olup olmadığını kontrol etmedim. PyInstaller ve cx_Freeze'in farkındayım; başkaları olabilir.
ShadowRanger

8
Test ettim cx_freeze. Python3.6 ile uyumludur ancak tek bir exe dosyası oluşturamaz. Sorun Pyinstallerşu ki, x64 işletim sistemi aracılığıyla x86 exe dosyası oluşturamazsınız
Alex Jolig

Bu bilgi için teşekkürler. Bunun bir yerde önceden belgelenmemesine biraz şaşırdığımı söylemeliyim. Py2exe açıklaması bile sadece söylüyor Python 3.3 and later are supported. Elbette, geriye dönüp bakıldığında, bu kadar eski bir şeyin işe yaramasını beklemek muhtemelen biraz saflıktır, ancak bu alanda yeni başlayan biriyseniz, başa çıkmanız gereken yeterince acemi kafa karışıklığı vardır.
fostandy

40

Kullandığım çözüm alternatif olarak PyInstaller kullanmaktı çünkü Py2Exe geliştirmeyi python 3.4'te durdurdu ve yeni sürümlerle çalışmayacak.

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

Bu, programınız adlı bir klasörde bulunan program.exe dosyanızla dist adında bir alt dizin oluşturacaktır.

Oluşturulan tüm dosyaları tek bir yürütülebilir dosyaya yerleştirmek için -F'yi kullanın.

C:/>pyinstaller -F yourprogram

GUI'ler için konsol ekranını kaldırmak istiyorsanız -w ile kullanabilirsiniz.

C:/>pyinstaller -w yourprogram.py

Her şeyi bir araya getirerek.

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

PyInstaller hakkında daha fazlasını buradan okuyun .

Python sürüm 3.7.3.


2
Programı başka bilgisayarlarda çalıştırırsam, "Hiçbir modül bulunamadı
hatası

pyinstaller ile ilgili çözümünüz için teşekkürler. Windows 10: gi, gtk, dlls'de minggw64 python3.8.2 sürümünü ve gtk'yi kullanarak bağımsız bir proje oluşturmayı başarıyla yönetin. minggw64 kabuğundaki basit bir "$ pyinstaller programınız" komutunu kullanarak her şey burada dist klasöründe. pyinstaller + cython güzel bir combo gibi görünüyor.
jerome

10

Cx_freeze kullandığım geçici çözümle aynı sorunu yaşadım. Uygulamam wxPython, windows 10, python 3.6, cx_freeze 5.5.1 tabanlı.

Bu kullandığım kurulum dosyası ve dist klasöründe msi dosyasını aldım.

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

sonra python setup.py bdist_msi


4
Sizin gibi, cx_freeze'i çalıştırılabilir bir dosya oluşturmak için kullandım çünkü bu benim python sürümümle uyumlu ve kullanımı daha kolaydı. Kurulum dosyanızı paylaştığınız için teşekkür ederiz, böylece insanlar bunu örnek olarak kullanabilirler.
Dennis

Varsa from PyQt5 import QtGuinasıl girebilirim packages? Sadece PyQt5veya sadece QtGuiveya her ikisi mi?
Hrvoje T

Hrvoje T, bütünü dahil ettim PyQt5.
Taras Mykhalchuk


7

Python 3.4.3'ü yükleyerek bir çözüm denedim:

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

1) komut dosyası klasörünüze girin

2) sahip olduğunuz herhangi bir virüsten koruma yazılımını devre dışı bırakın (garip bir şey, başka bir SO sorusu xD)

3) python 3.4.3 yorumlayıcısını mutlak yolundan çağırın, benim durumumda şunu yükledim:

C:\Python34

4) komutu yürütün

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

Python 3.5 ile aynı şeyi yapmaya çalıştım ama py2exe'yi kurarken takıldım çünkü pip daha yeni bir sürüme ihtiyaç duyuyor, bir hata alıyorum. 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'i yükseltmeye çalıştığımda aynı hatayı alıyorum!
Dennis

Gördüğüm gibi, 2 seçeneğiniz var: 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'a sahip olabilirsiniz ve hangisini güncellemek istediğinizi belirtmeniz gerekebilir.
Ricardo Martínez

Bu arada, @Dennis
Ricardo Martínez

Martinez, sürüm artık 3.6 yerine 3.5 diyor. 3.5 yolunu belirledim ve pip 8.1.1 yalnızca 3.5 için kuruldu, çünkü 3.6 zaten 9.0.1'e sahip. Size tavsiyeyi birden fazla versiyonla deneyeceğim.
Dennis

Gecikme için özür dilerim, Python Klasörünüzü girin ve 'python -m pip install --upgrade pip' komutunu çalıştırın ve Python 3.5 Pip'inizi güncelleyin
Ricardo Martínez

0

Yazma sırasında, en son python sürümü 3.8'dir ve py2exe, python-3.4'e kadar çalışır. pyinstaller, python-3.7'ye kadar çalışır. Kullanılması pyinstaller '(gibi s komut satırı seçenekleri --onefile tek başına çalıştırılabilir yapmak için) içine seçenekleri kodlama daha kolay py2exe python2 çalıştı setup.py dosyalar işi yok Özellikle beri ... setup.py dosyası s' python3 için. Bir başka yararlı pyinstaller seçeneği, yürütülebilir dosyanın bir arka plan işlemi olarak başlatılması için --noconsole'dur .

Yani, zamansız bir çözüm python modülü virtualenv'i kullanıyor . Ardından, eski bir sürümle değiştirmek için mevcut python sürümünüzü tüm modülleriyle birlikte kaldırmadan yürütülebilir dosyanızı oluşturabilirsiniz.

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 komut satırı seçeneği büyük / küçük harfe duyarlıdır! İçin pyinstaller kullanım yolu, (hiç piton-3.7 indirilen py2exe'nin 3.4 yolunu).

Sanal ortam oluşturulduğunda. çalışma dizininde sizin verdiğiniz adla (örn. box37) bir dizin oluşturur. Komut dosyası çalıştırılıyor \ Script'in \ etkinleştirmek bu dizin içinde virutal env girer. - istemimden önce görünen uyarı (kutu37).

Bir python sanal ortamının içinde. pip dışarıdan python'a erişilemeyen modülleri kurmak için kullanılır - kendi \ Lib \ site paketleri dizini olduğuna dikkat edin. Bu nedenle, virtualenv'i mükemmel bir test-kurulum modülü yapan şey - eğer batırırsanız, (örn. Box37) dizinini silin.

Windows x86-64 çalıştırılabilir yükleyici Python 3.7'yi indirin . Python 3.4 , Windows x86-64 MSI yükleyicisini indirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.