Obecnie próbuję utworzyć plik wykonywalny przy użyciu py2exe. Używam Pythona 3.6. Skrypt, którego używam, importuje openpyxl
i pptx
działa dobrze, gdy używam Pycharm lub uruchamiam skrypt za pomocą okna poleceń.
Dane wyjściowe generują błąd:
IndexError: tuple index out of range
Poniżej można znaleźć cmd
wynik:
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: oto setup.py
plik:
from distutils.core import setup
import py2exe
setup(console=['Storybookmaker.py'])
setup.py
plik? ponieważ problem istnieje i niepy2exe
działa dobrze.Storybookmaker.py
plik znajduje się w tym samym katalogu cosetup.py
? możesz spróbowaćsetup(console=[os.path.join(os.path.dirname(__file__,'Storybookmaker.py')])
zlokalizować plik.Odpowiedzi:
Python 3.6 całkowicie przeprojektował kod bajtowy dla CPythona (nie jest to już kod „bajtowy”, jest to kod słowny, w którym wszystkie rozkazy mają szerokość dwóch bajtów zamiast 1-3).
py2exe
Błąd, który widzisz, występuje w kodzie parsującym opcode, który, biorąc pod uwagę najnowszą opublikowaną wersję, którapy2exe
twierdzi, że obsługuje tylko wersje 3.3 i 3.4, prawdopodobnie nie może mieć wiedzy lub wsparcia dla nowych rozkazów kodu słownego; nie zostały one nawet poczęte w tym czasie,py2exe
zostały ostatnio zaktualizowane. Kod bajtowy często zmienia się w niewielkim stopniu od wersji do wersji, co może zepsuć nawet Python 3.5 (podane tylko wsparcie 3.3 i 3.4 jest wyraźnie deklarowane), ale 3.6 gwarantuje 100% niepowodzenie.Aktualizacja: w tym momencie (listopad 2019 r.) Minęło ponad pięć lat od ostatniej
py2exe
wersji , a do początku 2020 r. (Kiedy obsługa Python 2 całkowicie wygaśnie), nie będzie działać na żadnej obsługiwanej wersji Pythona (3.4 już jest wsparcia). Myślę, że można bezpiecznie powiedzieć, że projekt został porzucony; znajdź inne opcje, np .cx_Freeze
lubPyInstaller
.źródło
cx_freeze
. Jest kompatybilny z pythonem 3.6, ale nie może utworzyć pojedynczego pliku exe. ProblememPyinstaller
jest nie można utworzyć plik exe x86 poprzez OS x64Python 3.3 and later are supported
. Jasne, z perspektywy czasu prawdopodobnie naiwne jest oczekiwanie, że coś tak starego zadziała, ale kiedy jesteś początkującym w tej dziedzinie, jest wystarczająco dużo zamieszania dla początkujących, z którymi możesz sobie poradzić.Rozwiązaniem, którego użyłem, było użycie PyInstaller jako alternatywy, ponieważ Py2Exe zatrzymał rozwój w Pythonie 3.4 i nie będzie działać z nowszymi wersjami.
Spowoduje to utworzenie podkatalogu o nazwie dist z plikiem yourprogram.exe zawartym w folderze o nazwie yourprogram.
Użyj -F, aby umieścić wszystkie wygenerowane pliki w jednym pliku wykonywalnym.
Użyj opcji -w to, jeśli chcesz usunąć wyświetlanie konsoli dla GUI.
Łącząc to wszystko razem.
Przeczytaj więcej o PyInstaller tutaj .
Python w wersji 3.7.3.
źródło
Miałem ten sam problem, jako obejście użyłem cx_freeze. Moja aplikacja jest oparta na wxPythonie, Windows 10, Pythonie 3.6, cx_freeze 5.5.1
To jest plik instalacyjny, którego użyłem i mam plik msi w folderze dist.
następnie
python setup.py bdist_msi
źródło
from PyQt5 import QtGui
jak mam to wpisaćpackages
? TylkoPyQt5
czy tylkoQtGui
czy oba?PyQt5
.Odniosłem sukces z programem Python 3.6 przy użyciu rozwidlenia py2exe na https://github.com/albertosottile/py2exe .
źródło
Próbowałem obejść ten problem, instalując Python 3.4.3:
1) wejdź do folderu skryptów
2) dezaktywuj dowolny program antywirusowy, który posiadasz (dziwna rzecz, wiem po innym pytaniu SO xD)
3) wywołaj interpreter języka Python 3.4.3 według jego ścieżki absolutnej, w moim przypadku zainstalowałem w:
4) wykonać polecenie
źródło
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.
Kiedy próbuję zaktualizować pip, pojawia się ten sam błąd!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?
być może masz 2 pythony i musisz określić, który z nich chcesz zaktualizować.