Найти - Пользователи
Полная версия: Проверка доступности модулей не запуская скрипт
Начало » Python для экспертов » Проверка доступности модулей не запуская скрипт
1
agryn
Написал кое какое приложение, возник вопрос доступности этого скрипта для конечного пользователя, самым часто встречающейся ошибкой отсутствие необходимого модуля. В принципе не проблема написать инструкцию типа
try:
    from selenium import webdriver
except:
    print u'не могу загрузить модуль selenium, возможно у вас не установлен данный модуль, для установки перейдите по ссылке http://pypi.python.org/pypi/selenium и действуйте согласно инструкции'
    os.sys.exit(1)
Но эти куски кода загромождают (да и не очень логино), поэтому хочу написать скрипт который перед началом работы будет проверять и тестировать.
Вопрос: как можно проверить присутствие всех необходимых модулей в скрипте не запуская его (то есть как то извлечь из скрипта список всех модулей которые он подгружает)?
doza_and
Обычно работа по установке нужных модулей выполняется при инсталляции разработанного вами модуля (см например distribute). Я за свою практику работы с питоном ни разу не встретился с вашей самой частой ошибкой.
agryn
перед началом работы будет проверять и тестировать.
А что вы будете тестировать? Код может содержать куски(и обычно содержит) которые в результате нетривиального анализа окружения подгружают те либо иные модули. Обычная ситуация когда перечень подгружаемых модулей зависит от входного потока данных или действий пользователя. Можно проверить перечень модулей которые могут быть потенциально подгружены. Но это тоже бесполезно, поскольку рядовой случай подгрузка разных модулей под разные ОС (тогда исправный модуль по вашему мнению будет неисправен).
Если вас интересует углубленное тестирование то посмотрите примеры http://docs.python.org/library/unittest.html
http://docs.python.org/library/doctest.html

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

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

..bw
odnochlen
Когда-то уже спрашивал - а как поставить модули, не оформляя свой код в виде модуля?
doza_and
:)
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 тесты.
odnochlen
doza_and, в виде пакета, т.е. чтобы он не ставился в систему, ставил только зависимости.
bw
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
odnochlen
А зачем два раза ws.require? Оно с инета модули может ставить (как pip)?
Что будет, если не проверяя вызвать easy_install?

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

А setuptools в тройке искаропки нет, что там делать?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB