2017-01-10 7 views
31

В настоящее время я пытаюсь сделать исполняемый файл с помощью py2exe. Я использую Python 3.6. В сценарии я использую импорт openpyxl и pptx и отлично работает, когда я использую Pycharm или запускаю скрипт с помощью командного окна. Выход выдает ошибку:Python - IndexError: индекс tuple вне диапазона при использовании py2exe

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?

Edit: здесь setup.py файл

from distutils.core import setup 
import py2exe 

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

вы можете показать нам свой 'setup.py' файл? потому что проблема есть, а не в 'py2exe', которая работает нормально. –

+0

Привет, Жан-Франсуа, я добавил файл в исходное сообщение. Заранее спасибо! – Dennis

+0

является файлом 'Storybookmaker.py' в том же каталоге, что и' setup.py'? вы можете попробовать «setup (console = [os.path.join (os.path.dirname (__ file __,« Storybookmaker.py »)]), чтобы найти файл. –

ответ

5

Деннис, через несколько часов, чем вы, я испытать то же самое, не повезло, я установил Python 3.6 и на данный момент, это не работает ,

я пытаюсь Walkaround, я установил Python 3.4.3, и попробуйте следующее:

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

1) ввести в папку сценария 2) отключить все антивирусные что у вас есть (странно, знаю другой SO вопрос XD)

2) называют интерпретатор Python 3.4.3 на его абсолютный путь, в моем случае, я установил в:

C:\Python34 

3) выполнить команду

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

надежда, что поможет как мне

+0

Я попытался сделать то же самое с Python 3.5, но застрял при установке py2exe, потому что pip нуждается в более новой версии, я получаю сообщение об ошибке. 'Вы используете pip версию 8.1.1, однако версия 9.0.1 доступна. Вы должны рассмотреть возможность обновления с помощью команды «python -m pip install --upgrade pip». Когда я пытаюсь обновить pip, я получаю ту же ошибку! – Dennis

+0

Как я вижу, у вас есть 2 варианта: '1) Попробуйте с Python 3.4.3, этот я уже тестировал.' '2) Определите, какой из python у вас есть, когда вы вводите на консоль« python », какая версия говорит? Возможно, у вас есть 2 python и вам нужно указать, какой из них вы хотите обновить. –

+0

, кстати, @Dennis –

30

Python 3.6 completely redesigned the bytecode for CPython (это не «байт» код вообще больше, это wordcode, где все опкоды два байта в ширину вместо 1-3).

вы видите происходит сбой в py2exe опкод код синтаксического анализа, который, учитывая самые последние размещены версия py2exe только утверждает поддержку 3.3 и 3.4, не могли бы иметь знания, или поддержки, новых wordcode опкодами ; они даже не были задуманы в то время py2exe на последнем месте. Байт-код часто изменяется малыми способами от версии к версии, которая может сломаться даже Python 3.5 (при условии, что только поддержка 3,3 и 3,4 заявлена ​​явно), но 3.6 на 100% гарантированно сбой.

+0

Итак, нет ли альтернатив? –

+0

@AlexJolig: Есть, хотя я не проверял, совместимы ли они все с Python 3.6. Я знаю PyInstaller и cx_Freeze; могут быть и другие. – ShadowRanger

+2

Я протестировал 'cx_freeze'. Он совместим с python3.6, но не может создать один файл exe. Проблема с 'Pyinstaller' заключается в том, что вы не можете создавать x86 exe-файл через x64 os –

2

У меня была такая же проблема, как обходной путь я использовал 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

+0

Как и вы, я использовал cx_freeze для создания исполняемого файла, потому что это было совместимо с моей версией python и было проще в использовании. Благодарим вас за то, что вы поделились своим файлом установки, чтобы люди могли использовать это в качестве примера. – Dennis