Форум сайта python.su
5
Всем добрый вечер.
Задача такая: есть большая и толстая программа для винды на пайтоне. На компьютере, в котором будет запускаться программка, может не быть как пайтона, так и visual studio. Поэтому мной было принято решение запихать все это дело в exe. После многих раз неудачной пересборки, решил отписаться тут.
Дополнение: тестирую на 3х компьютерах (далее: первый, второй и третий), на первом стоит все (программу писал на нем): windows 8.1_64, python 2.7 32bit; второй - не стоит ничего пайтоновского, тоже win8.1, третий - стоит python 2.7 32bit, без всех не стандартных модулей, windows 8.
Теперь о проблемах: файл содержит много модулей, а именно:
import Tkinter import ttk import ftd2xx import numpy import cv2 import cv2.cv as cv import os import time import win32api import random import Image import ImageTk import tkFileDialog import cPickle
from distutils.core import setup import py2exe setup( windows=[{"script":"Test.pyw"}], options={"py2exe": {"includes":["sip"]}} )
python setup.py py2exe
ImportError: No module named sip
from distutils.core import setup import py2exe setup( windows=[{"script":"Test.pyw"}], options={"py2exe": {}} )
C:\Windows\System32\ftd2xx.dll
Traceback (most recent call last):
File "Test.pyw", line 5, in <module>
File "cv2.pyc", line 12, in <module>
File "cv2.pyc", line 10, in __load
ImportError: DLL load failed: Не найден указанный модуль.
python C:\Python27\pyinstaller-2.0\pyinstaller.py --windowed Test.pyw
from cx_Freeze import setup, Executable setup( name = "Test", version = "0.1", description = "test", executables = [Executable("Test.pyw")])
python setup.py build
, я не шучу, что-то с кодировками не то:File "Test.pyw", line 1, in <module>
File "C:\Python27\lib\lib-tk\Tkinter.py", line 38, in <module>
import FixTk
File "C:\Python27\lib\lib-tk\FixTk.py", line 65, in <module>
import _tkinter
ImportError: DLL load failed: %1 эх ты хЄё яЁшыюцхэшхь Win32.
Отредактировано Paranoia_Agent (Ноя. 26, 2014 02:02:41)
Офлайн
49
Положите все используемые библиотеки (dll и pyd) в папку сборки.
Офлайн
5
А есть способ получить список всех dll и pyd, используемых приложением?
Я видел только вариант, типа такого:
glob.glob('*.dll')Офлайн
49
Paranoia_Agent
А есть способ получить список всех dll и pyd, используемых приложением?
Paranoia_Agent
ImportError: DLL load failed: %1 эх ты хЄё яЁшыюцхэшхь Win32.
Отредактировано Alen (Ноя. 25, 2014 22:35:47)
Офлайн
58
Задам, наверное, не первый раз вопрос. А зачем такие мучения? Ведь проще работать с репо. Вот клиенту взбрело что-то в голову. Он Вам поплакался и вы быстренько в репо исправили. Он вытянул, обновился и имеет все прелести новой версии. Да и сам процесс менее мучителен и сложен. Нет танцев с бубном (лукавлю, потому как есть, но реже и меньше занимают по-времени, а если еще система одинаковая, то их вообще может не быть), нет проблем повторной сборки обновленного проекта со всеми вытекающими. Нет необходимости тестировать результат сборки в .ехе на пустой системе. Нет нервотрепки, связанной с решением не интересных и не свойственных питонисту задач…
По Вашему вопросу. pyInstaller отбрасывается 100%. Его использовать нельзя ни в коем случае.
Далее. Нет никаких гарантий, что собранный файл запустится на другой машине. Если в проекте еще и сторонние модули - то вообще можно зарываться в песок. Вероятность, что он запустится - как вероятность встретить динозавра посередине города: “50 на 50. Встречу или нет” 
P.S. Для таких задач рекомендую все же использовать csFreeze, только если проект сложный - настраивать его придется полноценно. Без этого никак. Простыми двумя строками тут не обойдется. В качестве теста собирали проект средней сложности. Проблем не возникало. Плюс, необходимо не забывать, что cxFreeze наитивно поддерживает 3.Х. На момент, когда я занимался такого рода извращениями, 3.Х поддерживал только он.
Отредактировано 4kpt_II (Ноя. 25, 2014 23:22:39)
Офлайн
5
Alen
Насчет dll попробую Process Explorer:
https://ru.wikipedia.org/wiki/Process_Explorer
А про кодировки я знаю
Просто вывод понравился.
4kpt_II
Спасибо, пойду копать cxFreeze
Офлайн
6
если ваш проект не требователен к памяти , можно и в 1 общий фаил подавить.
Офлайн
6
python pyinstaller.py --onefile your_main_file.py
Офлайн
58
sypper-pit
Вынужден повториться еще раз: pyinstaller использовать нельзя никогда!!!. Ибо это набор жутких хаков и костылей. Это открытие сделал не я, а JOHN_16 когда мы с ним планировали наколбасить статейку о создании exe в python. Если есть желание, найдите в моих темах это обсуждение. Именно там описаны все причины по которым нужно отказаться от использования этой ереси. К слову, эта штука даже не может собрать множество простых пакетов.
Офлайн
5
1) cx_freeze
Собрал:
import sys from cx_Freeze import setup, Executable includefiles = ['icon.ico', 'pic.jpg'] build_exe_options = { 'packages' : ['Tkinter', 'ttk','ftd2xx','numpy','cv2','os','time','win32api','random','Image','ImageTk','tkFileDialog','cPickle'],'include_files':includefiles} base = None if sys.platform == "win32": base = "Win32GUI" setup(name = "Test", version = "0.1", description = "Test", options = {"build_exe": build_exe_options}, executables = [Executable("Test.pyw",icon = "icon.ico",base=base)])
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py",
line 27, in <module>
exec(code, m._dict_)
File "Test.pyw", line 1, in <module>
File "C:Wython27\lib\lib-tk\Tkinter.py", line 38, in <module>
import FixTk
File "C:\Python27\lib\lib-tk\FixTk.py", line 65, in <module>
import _tkinter
ImportError: DLL load failed: %1 не является приложением Win32.
from distutils.core import setup import py2exe setup( windows=[{"script":"Test.pyw","icon_resources": [(1, "icon.ico")]}], data_files=['pic.jpg','icon.ico'], options={ "py2exe": { "unbuffered": True, "optimize": 2, "includes": ['Tkinter','ttk','ftd2xx','numpy','cv2','os','time','win32api','random','Image','ImageTk','tkFileDialog','cPickle'] } } )

ДЛЛки:
C:\Windows\SysWOW64\advapi32.dll
C:\Windows\SysWOW64\AudioSes.dll
C:\Windows\SysWOW64\avrt.dll
C:\Windows\SysWOW64\bcrypt.dll
C:\Windows\SysWOW64\bcryptprimitives.dll
C:\Windows\SysWOW64\cfgmgr32.dll
C:\Windows\SysWOW64\clbcatq.dll
C:\Windows\SysWOW64\combase.dll
C:\Windows\SysWOW64\comdlg32.dll
C:\Windows\SysWOW64\crypt32.dll
C:\Windows\SysWOW64\cryptbase.dll
C:\Windows\SysWOW64\cryptsp.dll
C:\Windows\SysWOW64\devenum.dll
C:\Windows\SysWOW64\devobj.dll
C:\Windows\SysWOW64\dwmapi.dll
C:\Windows\SysWOW64\ftd2xx.dll
C:\Windows\SysWOW64\gdi32.dll
C:\Windows\SysWOW64\IconCodecService.dll
C:\Windows\SysWOW64\imm32.dll
C:\Windows\SysWOW64\kernel.appcore.dll
C:\Windows\SysWOW64\kernel32.dll
C:\Windows\SysWOW64\KernelBase.dll
C:\Windows\SysWOW64\ksuser.dll
C:\Windows\SysWOW64\midimap.dll
C:\Windows\SysWOW64\MMDevAPI.dll
C:\Windows\SysWOW64\msasn1.dll
C:\Windows\SysWOW64\msctf.dll
C:\Windows\SysWOW64\msdmo.dll
C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.8387_none_5094ca96bcb6b2bb\msvcr90.dll
C:\Windows\SysWOW64\msvcrt.dll
C:\Windows\SysWOW64\nsi.dll
C:\Windows\SysWOW64\ntmarta.dll
C:\Windows\SysWOW64\ole32.dll
C:\Windows\SysWOW64\oleaut32.dll
C:\Windows\SysWOW64\powrprof.dll
C:\Windows\SysWOW64\rpcrt4.dll
C:\Windows\SysWOW64\rsaenh.dll
C:\Windows\SysWOW64\sechost.dll
C:\Windows\SysWOW64\secur32.dll
C:\Windows\SysWOW64\setupapi.dll
C:\Windows\SysWOW64\SHCore.dll
C:\Windows\SysWOW64\shell32.dll
C:\Windows\SysWOW64\shlwapi.dll
C:\Windows\SysWOW64\sspicli.dll
C:\Python27\tcl\reg1.2\tclreg12.dll
C:\Windows\SysWOW64\user32.dll
C:\Windows\SysWOW64\uxtheme.dll
C:\Windows\SysWOW64\version.dll
C:\Windows\SysWOW64\WindowsCodecs.dll
C:\Windows\SysWOW64\winmm.dll
C:\Windows\SysWOW64\winmmbase.dll
C:\Windows\SysWOW64\wintrust.dll
C:\Windows\System32\wow64.dll
C:\Windows\System32\wow64cpu.dll
C:\Windows\System32\wow64win.dll
C:\Windows\SysWOW64\ws2_32.dll
Драйвера:
C:\Windows\SysWOW64\msacm32.drv
C:\Windows\SysWOW64\wdmaud.drv
Файлы русификации windows:
C:\Windows\SysWOW64\ru-RU\avicap32.dll.mui
C:\Windows\System32\ru-RU\KernelBase.dll.mui
C:\Windows\System32\ru-RU\MMDevAPI.dll.mui
C:\Windows\SysWOW64\ru-RU\msvfw32.dll.mui
C:\Windows\System32\ru-RU\setupapi.dll.mui
C:\Windows\SysWOW64\ru-RU\wdmaud.drv.mui
Файлы кодировок:
C:\Windows\System32\C_1252.NLS
C:\Windows\System32\locale.nls
C:\Windows\Globalization\Sorting\SortDefault.nls
Отредактировано Paranoia_Agent (Ноя. 26, 2014 20:59:32)
Офлайн