Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 6, 2013 18:20:28

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

py2exe problems

Делаю из скрипта exe:

from distutils.core import setup
import py2exe
setup(console=["main.py"])
Упаковка проходит успешно, библиотеки которые использую в скрипте упаковываются и складываются в library корректно, но при запуске exe выдает ошибку:
Traceback (most recent call last):
  File "latlong.py", line 4, in <module>
    g = Grab(log_file='out2.html')
  File "grab\base.pyc", line 225, in __init__
    was not executed yet.
  File "grab\base.pyc", line 239, in setup_transport
ImportError: No module named transport.curl
Я так понял косяк в том что библиотека обращается к другой либе которая не была упакована при создании exe?
PS/ Пробовал при создании –includies curl,urllib,pyurl, не помогло. Может не так добавляю? Помогите решить проблему.)

Отредактировано noob_saibot (Дек. 5, 2013 17:53:26)

Офлайн

#2 Ноя. 7, 2013 11:50:37

helm2004
От: Украина, Винница
Зарегистрирован: 2008-02-27
Сообщения: 630
Репутация: +  9  -
Профиль   Отправить e-mail  

py2exe problems

Пути к обращению файла не правильные

_file = os.path.abspath(sys.argv[0])
path = os.path.dirname(_file)

Отредактировано helm2004 (Ноя. 7, 2013 11:52:08)

Офлайн

#3 Ноя. 7, 2013 12:42:56

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

py2exe problems

Ниже приведена моя программа:

# -*- coding: utf-8 -*-
from grab import *
import xlrd
g = Grab(log_file='out2.html')
g.setup(proxy='proxy', proxy_type='http', proxy_userpwd='lol:wat')
x=raw_input(u"Город")
y=raw_input(u"Название улицы или что там у тебя")
z=raw_input(u"Улица или шоссе или еще что-то")
n=raw_input(u"Номер")
m=0
g.go("http://geocode-maps.yandex.ru/1.x/?geocode=+"+x+",+"+y+"+"+z+",+"+n)
stroka=g.xpath_text("//*").split()
lat=float(stroka[-1])
long=float(stroka[-2])
print "Your location:",lat,long
rb = xlrd.open_workbook('D://llla.xls',formatting_info=True)
sheet = rb.sheet_by_index(0)
for x in xrange(1,713):
    lat1=float(sheet.cell_value(x,2))
    long1=float(sheet.cell_value(x,3))
    if (-0.009)<lat-lat1<(0.009) and (-0.009)<long-long1<(0.009):
        print sheet.cell_value(x,1),sheet.cell_value(x,0),sheet.cell_value(x,2),sheet.cell_value(x,3)
        m=m+1
if m==0:
    print "No one"
При запуске в скриптере, программа отрабатывает без ошибок. Далее я её складываю в exe с помощью py2exe. Происходит это автоматически и пути к либам я не указываю. Все эти либы автоматом сложились в library.zip. Где мне необходимо прописать абсолютные пути к либам? В программе или в настройках setup при упаковке exe? Или я все не так понял?

ЗЫ ошибка вылазит при запуске exe
ЗЫ2 Прокси спрятать забыл

Отредактировано noob_saibot (Ноя. 7, 2013 12:47:31)

Офлайн

#4 Ноя. 7, 2013 13:15:20

helm2004
От: Украина, Винница
Зарегистрирован: 2008-02-27
Сообщения: 630
Репутация: +  9  -
Профиль   Отправить e-mail  

py2exe problems

У тебя программа не находит этот файл g = Grab(log_file='out2.html')
Укажи ему абсолютный путь.

Офлайн

#5 Ноя. 7, 2013 13:30:40

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

py2exe problems

helm2004
У тебя программа не находит этот файл g = Grab(log_file='out2.html')Укажи ему абсолютный путь.
Этот html служит для сохранения результата работы grab на компе. После выполнения скрипта, в out2.html мы видим последнюю страницу. out2.html создается автоматически в директории с питоном. НО я для уверенности сделал как вы написали, и добавил в программу:
_file = os.path.abspath(sys.argv[0])
path = os.path.dirname(_file)
g=Grab(log_file=path+"\out2.html")
В скриптере выполняется, в exe все таже ошибка:
Traceback (most recent call last):
  File "latlong.py", line 9, in <module>
    g = Grab(log_file=path+'\out2.html')
  File "grab\base.pyc", line 225, in __init__
  File "grab\base.pyc", line 239, in setup_transport
ImportError: No module named transport.curl

ЗЫ я даже сделал так:
g=Grab()
Все осталось по прежнему.

Отредактировано noob_saibot (Ноя. 7, 2013 13:39:33)

Офлайн

#6 Ноя. 10, 2013 08:37:24

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

py2exe problems

Доброе утро.
Вообще траблы какието с py2exe, делаю подобную программу на mechanize:

# -*- coding: UTF-8 -*-
import mechanize
x=raw_input("Sity ")
y=raw_input("Street ")
z=raw_input("Type of street ")
n=raw_input("Number ")
br=mechanize.Browser()
br.set_proxies({'http':proxy:1234'})
br.add_proxy_password('nick','pswd')
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(),max_time=1)
print type(x)
x=x.encode("cp1251")
y=y.encode("cp1251")
z=z.encode("cp1251")
n=n.encode("cp1251")
print ("http://geocode-maps.yandex.ru/1.x/?geocode=+"+x+",+"+y+"+"+z+",+"+n)
res=br.open("http://geocode-maps.yandex.ru/1.x/?geocode=+"+x+",+"+y+"+"+z+",+"+n)
print res
content = res.read()
print content
coord=str(content).split()
lat=str(coord[-6]).split("<")
long=str(coord[-7]).split(">")
lat2=lat[0]
long2=long[1]
print lat,long,lat2,long2
в питоне отрабатывает стабильно.
Перевожу в exe:
Traceback (most recent call last):
  File "mechanize3.py", line 21, in <module>
    x=x.encode("cp1251")
  File "encodings\cp1251.pyc", line 12, in encode
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa2 in position 0: ordinal not in range(128)
Играя с кодировками починил exe файл (в скриптере работать перестал), он отрабатывает, но обращаясь к интернет странице выдает неверный результат, видимо проблема в кодировке (На запрашиваемой странице кодировка UTF-8). Логики почему не работает в exe и работает в скриптере и наоборот я не уловил. Может кто подскажет? Или на pyinstaller перейти? Но хотелось бы разобраться…

Офлайн

#7 Ноя. 10, 2013 11:55:05

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

py2exe problems

Вообщем первую проблему решил в тупую скопировав все библиотеки из граба. Но exe отрабатывает некорректно. При вводе параметров в скриптере x,y,z,n - имеют тип unicode, при выполнении в exe x,y,z,n - становятся str. Encode не помогает.(Так как это уже строка, видимо) Как мне починить exe чтобы он параметры в str не запихивал?)))

Офлайн

#8 Ноя. 10, 2013 12:15:50

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

py2exe problems

Пробовал выставить кодировку по умолчанию:

def setencoding():
    """Set the string encoding used by the Unicode implementation.  The
    default is 'ascii', but if you're willing to experiment, you can
    change this."""
    encoding = "unicode" # Default value set by _PyUnicode_Init()
    if 0:
        # Enable to support locale aware default string encodings.
        import locale
        loc = locale.getdefaultlocale()
        if loc[1]:
            encoding = loc[1]
    if 0:
        # Enable to switch off string to Unicode coercion and implicit
        # Unicode to string conversion.
        encoding = "undefined"
    if encoding != "unicode":
        # On Non-Unicode builds this will raise an AttributeError...
        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
не помогло.

Офлайн

#9 Ноя. 11, 2013 01:32:38

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

py2exe problems

noob_saibot
если у вас есть время и желание как вариант присмотритесь к альтернативам, к примеру cx_freeze мне понравился



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Ноя. 11, 2013 10:37:33

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

py2exe problems

JOHN_16
noob_saibotесли у вас есть время и желание как вариант присмотритесь к альтернативам, к примеру cx_freeze мне понравился
Все хорошо, но на рабочем компьютере админы VS2008 ставить не хотят, а без него cx_Freeze не ставится ругается на отсутствие vcvarsall.bat. (Своими силами обеспечиваю работоспособность отдела, а мне даже на встречу не идут) Так что возвращаюсь к py2exe. Рябзииии ну может кто сталкивался с подобными проблемами при работе в py2exe отпишитесь плиииз.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version