Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 14, 2012 11:35:16

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка доступности модулей не запуская скрипт

Написал кое какое приложение, возник вопрос доступности этого скрипта для конечного пользователя, самым часто встречающейся ошибкой отсутствие необходимого модуля. В принципе не проблема написать инструкцию типа

try:
    from selenium import webdriver
except:
    print u'не могу загрузить модуль selenium, возможно у вас не установлен данный модуль, для установки перейдите по ссылке http://pypi.python.org/pypi/selenium и действуйте согласно инструкции'
    os.sys.exit(1)
Но эти куски кода загромождают (да и не очень логино), поэтому хочу написать скрипт который перед началом работы будет проверять и тестировать.
Вопрос: как можно проверить присутствие всех необходимых модулей в скрипте не запуская его (то есть как то извлечь из скрипта список всех модулей которые он подгружает)?

Отредактировано agryn (Окт. 14, 2012 11:37:05)

Офлайн

#2 Окт. 14, 2012 14:14:10

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Проверка доступности модулей не запуская скрипт

Обычно работа по установке нужных модулей выполняется при инсталляции разработанного вами модуля (см например distribute). Я за свою практику работы с питоном ни разу не встретился с вашей самой частой ошибкой.

agryn
перед началом работы будет проверять и тестировать.
А что вы будете тестировать? Код может содержать куски(и обычно содержит) которые в результате нетривиального анализа окружения подгружают те либо иные модули. Обычная ситуация когда перечень подгружаемых модулей зависит от входного потока данных или действий пользователя. Можно проверить перечень модулей которые могут быть потенциально подгружены. Но это тоже бесполезно, поскольку рядовой случай подгрузка разных модулей под разные ОС (тогда исправный модуль по вашему мнению будет неисправен).
Если вас интересует углубленное тестирование то посмотрите примеры http://docs.python.org/library/unittest.html
http://docs.python.org/library/doctest.html

Скорее всего вам надо пересмотреть что-то в своих подходах в работе с питоном.



Отредактировано doza_and (Окт. 14, 2012 14:15:58)

Офлайн

#3 Окт. 14, 2012 14:53:02

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Проверка доступности модулей не запуская скрипт

doza_and> ни разу не встретился с вашей самой частой ошибкой
Дело в том что установка некоторых зависимостей может быть опциональной (т.е. какой-то функционал становится недоступным), тогда такая проверка имеет право на существование (это мой мнение, мнение Гвидо по этому вопросу мне не известно :-).

agryn, про то что нужно правильно оформлять свой код/пакет/дистр только что было сказано (см. distutils+setuptools/distribute), да-да, я про setup.py с блэк-джеком и egg'йцами. Так вот, если все такие умные как яГвидо, то поголовно все нужные тебе зависимости уже кошерным способом установлены в систему (после python setup.py install/develop), а это значит что ты можешь пройтись по ним используя православный pkg_resources. С батарейками это не сработает, но зачем их проверять.

..bw



Офлайн

#4 Окт. 14, 2012 17:53:17

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Проверка доступности модулей не запуская скрипт

Когда-то уже спрашивал - а как поставить модули, не оформляя свой код в виде модуля?

Офлайн

#5 Окт. 14, 2012 20:35:10

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Проверка доступности модулей не запуская скрипт

:)

odnochlen
а как поставить модули, не оформляя свой код в виде модуля
Может чего путаю, но модулем является любой файл с кодом на питоне. Вы хотите распространять код не записывая ничего в файлы? Я наверное не понял вопроса….

“тогда такая проверка имеет право на существование”

ТС спрашивал как ее упростить или локализовать, и привел пример с выводом сообщения об ошибке импорта.
Если функционал - сообщить об ошибке импорта - то ничего делать не надо оно само грохнется и скажет что не удалось импортировать.
>>> import aaa
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
ImportError: No module named aaa
Если надо сделать что-то осмысленное то наверное надо не
try:
 .....
except:
  .....
а
try:
 .....
except ImportError:
  .....
на том уровне где еще можно обработать ошибку импорта.

ТС также хочет добавить функционал по проверке корректности установки ПО до его реального использования. Я предложил использовать для этого unit тесты.



Отредактировано doza_and (Окт. 14, 2012 20:49:21)

Офлайн

#6 Окт. 14, 2012 21:04:27

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Проверка доступности модулей не запуская скрипт

doza_and, в виде пакета, т.е. чтобы он не ставился в систему, ставил только зависимости.

Офлайн

#7 Окт. 15, 2012 03:51:32

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Проверка доступности модулей не запуская скрипт

odnochlen, используй pkg_resources что бы проверить что установлено и setuptools что бы установить, ничего нового и оригинального предложить не могу. Вот грубый пример (не проверял):

import warnings
import pkg_resources
import setuptools.command.easy_install
def require(eggsdir, requirement):
    ws = pkg_resources.working_set
    if not eggsdir in ws.entries:
        ws.add_entry(eggsdir)
    try:
        ws.require(requirement)
    except pkg_resources.DistributionNotFound:
        try:
            setuptools.command.easy_install.main(['-mxd', eggsdir, requirement])
        except SystemError:
            warnings.warn('сделать по людски')
        else:
            ws.require(requirement)
    return ws.find(pkg_resources.Requirement.parse(requirement))
require('.python-eggs', 'zc.buildout')

..bw



Офлайн

#8 Окт. 15, 2012 04:07:36

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Проверка доступности модулей не запуская скрипт

А зачем два раза ws.require? Оно с инета модули может ставить (как pip)?
Что будет, если не проверяя вызвать easy_install?

Есть разница, ставить модули через easy_install или через pip?

А setuptools в тройке искаропки нет, что там делать?

Отредактировано odnochlen (Окт. 15, 2012 04:14:28)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version