Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 25, 2014 21:51:25

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Программка в exe

Всем добрый вечер.
Задача такая: есть большая и толстая программа для винды на пайтоне. На компьютере, в котором будет запускаться программка, может не быть как пайтона, так и 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

Теперь о результатах:
1) py2exe
написал код с примера:
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": {}}
)
Собралось, запустилось, но на втором компьютере показал, что нет ftd2xx.dll.
Кинул в папку файл
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: Не найден указанный модуль.
Нет модуля cv2, но как тогда он запустился на предыдущей машине, на которой не стоит ничего. На этом решил попробовать что-нибудь другое.

2) pyinstaller
поставил, собрал:
python C:\Python27\pyinstaller-2.0\pyinstaller.py --windowed Test.pyw
На первой машине запускается.
На второй машине наблюдал странное программа не запускается, вообще никак, без всяких логов и выводов ошибок. Выполнял из консоли, высвечивает просто приглашение, как будто энтер нажимаешь.

3) cx_freeze
Сетап:
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.
Пробовал все по куче раз, пробовал разные аргументы, пробовал включать модули вручную, пробовал включать dll`ки как локальные файлы, что-то ничего не получается.
Прошу помочь хотя бы выбрать каким путем идти, заранее спасибо.

Отредактировано Paranoia_Agent (Ноя. 26, 2014 02:02:41)

Офлайн

#2 Ноя. 25, 2014 21:59:19

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Программка в exe

Положите все используемые библиотеки (dll и pyd) в папку сборки.

Офлайн

#3 Ноя. 25, 2014 22:07:04

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Программка в exe

А есть способ получить список всех dll и pyd, используемых приложением?
Я видел только вариант, типа такого:

glob.glob('*.dll')

Офлайн

#4 Ноя. 25, 2014 22:20:59

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Программка в exe

Paranoia_Agent
А есть способ получить список всех dll и pyd, используемых приложением?

В Linux/BSD есть команда lsof, может быть и в windows аналог есть, по крайней мере тут пишут, что есть:

http://stackoverflow.com/questions/15708/how-can-i-determine-whether-a-specific-file-is-open-in-windows

То есть попробуйте запустить своё приложение на рабочей машине, получить pid процесса, например, командой tasklist, а после listdlls -p pid .

Paranoia_Agent
ImportError: DLL load failed: %1 эх  ты хЄё  яЁшыюцхэшхь Win32.

А это cp866. (кириллистическая кодировка DOS).

Отредактировано Alen (Ноя. 25, 2014 22:35:47)

Офлайн

#5 Ноя. 25, 2014 23:21:18

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Программка в exe

Задам, наверное, не первый раз вопрос. А зачем такие мучения? Ведь проще работать с репо. Вот клиенту взбрело что-то в голову. Он Вам поплакался и вы быстренько в репо исправили. Он вытянул, обновился и имеет все прелести новой версии. Да и сам процесс менее мучителен и сложен. Нет танцев с бубном (лукавлю, потому как есть, но реже и меньше занимают по-времени, а если еще система одинаковая, то их вообще может не быть), нет проблем повторной сборки обновленного проекта со всеми вытекающими. Нет необходимости тестировать результат сборки в .ехе на пустой системе. Нет нервотрепки, связанной с решением не интересных и не свойственных питонисту задач…

По Вашему вопросу. pyInstaller отбрасывается 100%. Его использовать нельзя ни в коем случае.
Далее. Нет никаких гарантий, что собранный файл запустится на другой машине. Если в проекте еще и сторонние модули - то вообще можно зарываться в песок. Вероятность, что он запустится - как вероятность встретить динозавра посередине города: “50 на 50. Встречу или нет”

P.S. Для таких задач рекомендую все же использовать csFreeze, только если проект сложный - настраивать его придется полноценно. Без этого никак. Простыми двумя строками тут не обойдется. В качестве теста собирали проект средней сложности. Проблем не возникало. Плюс, необходимо не забывать, что cxFreeze наитивно поддерживает 3.Х. На момент, когда я занимался такого рода извращениями, 3.Х поддерживал только он.

Отредактировано 4kpt_II (Ноя. 25, 2014 23:22:39)

Офлайн

#6 Ноя. 26, 2014 02:10:31

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Программка в exe

Alen
Насчет dll попробую Process Explorer:
https://ru.wikipedia.org/wiki/Process_Explorer
А про кодировки я знаю Просто вывод понравился.

4kpt_II
Спасибо, пойду копать cxFreeze

Офлайн

#7 Ноя. 26, 2014 12:11:17

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Программка в exe

если ваш проект не требователен к памяти , можно и в 1 общий фаил подавить.

Офлайн

#8 Ноя. 26, 2014 12:15:42

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Программка в exe

Офлайн

#9 Ноя. 26, 2014 16:48:21

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Программка в exe

sypper-pit
Вынужден повториться еще раз: pyinstaller использовать нельзя никогда!!!. Ибо это набор жутких хаков и костылей. Это открытие сделал не я, а JOHN_16 когда мы с ним планировали наколбасить статейку о создании exe в python. Если есть желание, найдите в моих темах это обсуждение. Именно там описаны все причины по которым нужно отказаться от использования этой ереси. К слову, эта штука даже не может собрать множество простых пакетов.

Офлайн

#10 Ноя. 26, 2014 19:58:48

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

Программка в exe

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.

2) py2exe
Собрал:
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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version