2017-01-10 18 views
31

Obecnie próbuję zrobić plik wykonywalny przy użyciu py2exe. Używam Pythona 3.6. Skrypt, którego używam, importuje pliki openpyxl i pptx i działa poprawnie, gdy używam Pycharm lub uruchamiam skrypt za pomocą okna poleceń. Wyjście powoduje błąd:Python - IndexError: indeks krotka poza zasięgiem przy użyciu py2exe

IndexError: tuple index out of range

Poniżej można znaleźć wyjście 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> 

Co powoduje IndexError?

Edycja: tutaj jest plik setup.py

from distutils.core import setup 
import py2exe 

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

można pokazać nam swój 'setup.py' plik? ponieważ problem istnieje, a nie w 'py2exe', który działa dobrze. –

+0

Cześć Jean-Francois, dodałem plik w oryginalnym wpisie. Z góry dziękuję! – Dennis

+0

to plik 'Storybookmaker.py' w tym samym katalogu co plik' setup.py'? możesz wypróbować 'setup (console = [os.path.join (os.path.dirname (__ plik __, 'Storybookmaker.py')])', aby upewnić się, że zlokalizował plik –

Odpowiedz

5

Dennis, kilka godzin później, niż ty, i testować samo bez powodzenia, mam zainstalowanego Pythona 3.6 i przez chwilę nie działa .

staram się Walkaround, mam zainstalowane Python 3.4.3 i spróbuj tego:

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

1) wprowadzić w folderze skryptu 2) wyłączyć wszystkie programy antywirusowe, które masz (dziwne, wiem przez innego SO pytanie xD)

2) nazywamy python 3.4.3 interpretera przez jego bezwzględnej ścieżki, w moim przypadku, mam zainstalowane w:

C:\Python34 

3) wykonać polecenie

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

nadzieję, że pomoże jak ja

+0

Próbowałem zrobić to samo z Pythonem 3.5, ale utknąłem przy instalacji py2exe, ponieważ pip potrzebuje nowszej wersji, pojawia się błąd. 'Używasz wersji 8.1.1 pip, ale wersja 9.0.1 jest dostępna. Należy rozważyć aktualizację za pomocą polecenia "python -m pip install --upgrade pip". Kiedy próbuję uaktualnić pip, pojawia się ten sam błąd! – Dennis

+0

Jak widzisz, masz 2 opcje: '1) Wypróbuj w Pythonie 3.4.3, ten już przetestowałem." '2) Określ, który python masz, kiedy wpisujesz na konsoli 'python', jaka wersja mówi? 'może być masz 2 python i trzeba określić, który z nich chcesz zaktualizować. –

+0

przy okazji, @Dennis –

30

Python 3.6 completely redesigned the bytecode for CPython (to nie jest „bajt” kod w ogóle już, to wordcode, gdzie wszystkie rozkazy są dwa bajty szeroki zamiast 1-3).

Usterka, którą widzisz, pojawia się w kodzie parsującego kodu kodu, py2exe, który, biorąc pod uwagę najnowszą opublikowaną wersję py2exe, obsługuje tylko roszczenia 3.3 i 3.4, nie może mieć wiedzy na temat nowych kodów opcode ani obsługi nowych ; nie zostały nawet wymyślone w czasie, gdy py2exe była ostatnio aktualizowana. Kod bajtowy często zmienia się w niewielkim stopniu z wersji na wersję, która może przerwać nawet Python 3.5 (tylko 3,3 i 3,4 obsługiwane jest jawnie), ale 3.6 gwarantuje 100% niepowodzenie.

+0

Więc nie ma żadnych alternatyw? –

+0

@AlexJolig: Są, chociaż nie sprawdziłem, czy są one kompatybilne z Pythonem 3.6. Jestem świadomy PyInstaller i cx_Freeze; mogą być inni. – ShadowRanger

+2

Testowałem 'cx_freeze'. Jest zgodny z python3.6, ale nie może utworzyć jednego pliku exe. Problem z 'Pyinstaller' nie można utworzyć pliku exe x86 przez x64 os –

2

miałem ten sam problem, jak obejść użyłem cx_freeze. Moja aplikacja oparta jest na wxPythonie, Windows 10, python 3.6, cx_freeze 5.5.1

Jest to plik instalacyjny, którego użyłem i dostałem plik msi na folderze 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")] 
)` 

następnie python setup.py bdist_msi

+0

Podobnie jak ty, użyłem cx_freeze do utworzenia pliku wykonywalnego, ponieważ był on zgodny z moją wersją python i łatwiejszy w użyciu. Dziękujemy za udostępnienie pliku instalacyjnego, aby ludzie mogli używać tego jako przykładu. – Dennis

Powiązane problemy