- PVSM.RU - https://www.pvsm.ru -
Доброго времени суток, %username%!
Хочу поведать историю о скрещивании python3 с библиотечкой PyBrain [1], описанной недавно на хабре [2].
Подробности под катом.
Поскольку я только недавно стал изучать python3, а также интересуюсь нейронными сетями [3], то был весьма заинтригован возможностями библиотеки.
Полез грузить и ставить, но вот незадача! Pybrain не поддерживает python3, да и не обновлялся уже месяца четыре.
Загрустил, подумал, открыл книгу «Python: Полный справочник» Девида Бизли и погрузился в чтение.
Оказывается существует утилита 2to3 [4] в комплекте поставки python3.
Сделал на github форк [5] проекта pybrain и стал пытать ее.
Сначала с помощью 2to3 надругался над папкой pybrain, а затем и над папкой с примерами examples.
Как ни странно все прошло почти безболезненно, да и команда проста до безобразия (см. подраздел «Краткая справка по опциям 2to3» в конце статьи):
2to3 -Wn -o pybrain3/ pybrain/
2to3 -Wn -o examples3/ examples/
В данном случае я не захотел править код прямо на месте, а создал 2 дополнительные папки (examples3 и pybrain3), куда утилита сохраняла уже портированные исходные тексты.
Для проверки работоспособности библиотеки решил в качестве тестов воспользоваться примерами, прилагающимися к ней.
При первых запусках мне вываливало ошибки типа такой:
Traceback (most recent call last):
File "test1.py", line 2, in <module>
from pybrain.tools.shortcuts import buildNetwork
File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/__init__.py", line 1, in <module>
from .structure.__init__ import *
File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/structure/__init__.py", line 1, in <module>
from .connections.__init__ import *
File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/structure/connections/__init__.py", line 1, in <module>
from .full import FullConnection
File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/structure/connections/full.py", line 5, in <module>
from .connection import Connection
File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/structure/connections/connection.py", line 3, in <module>
from pybrain.utilities import abstractMethod, Named
File "/usr/lib/python3.2/site-packages/PyBrain-0.3.1-py3.2.egg/pybrain/utilities.py", line 15, in <module>
from string import split
ImportError: cannot import name split
Пришлось поработать напильником.
На ряде примеров столкнулся с неработоспособностью из-за отсутствия модулей matplotlib [6] и pylab.
Поискал, нашел в AUR'e (у меня стоит ArchLinux) пакет python-matplotlib-git, поставил. Благо его уже портировали на python3, но в список поддерживаемых пакетов он не входит. В других системах видимо придется ставить модуль вручную. Брать здесь [7].
С pylab я особо не разбирался. Он входит в состав scipy. Поставил community/python-scipy версии 0.10 — еще часть примеров заработала.
Приведу пару картинок из примеров, которые выводят сии красивые графики через matplotlib.
Дампы работы других примеров, которые дают вывод в консоль, приводить не буду — куча цифр и ничего особо интересного.
[8]
[9]
Таким образом за буквально пару часов удалось с минимальными усилиями портировать библиотеку до достаточно рабочего состояния. Спасибо 2to3!
Вроде бы библиотека работоспособна, но:
В идеале надо бы написать набор тестов для полного покрытия библиотеки. Запустить тесты на python2 и на python3, а полученные результаты сравнить. Только тогда можно будет придти к выводу, что порт корректен.
Буду рад любым советам, пожеланиям и рекомендациям!
Если кто готов помочь — пишите, буду рад!
PS. Pull-request в основную ветвь pybrain на github пока не делал. Хочу еще покрутить её, поискать менее очевидные баги. А пока портированную библиотеку pybrain можно взять здесь [5].
Usage: 2to3 [options] file|dir ...
Опции:
-h, --help показать это сообщение и выйти
-d, --doctests_only Исправить только doctests
-f FIX, --fix=FIX Каждый FIX определяет преобразование; по умолчанию: all
-j PROCESSES, --processes=PROCESSES
Запустить 2to3 в PROCESSES потоков
-x NOFIX, --nofix=NOFIX
Не проводить преобразование NOFIX
-l, --list-fixes Вывести доступные преобразования
-p, --print-function Modify the grammar so that print() is a function
-v, --verbose Подробный вывод
--no-diffs Не показывать отличия при рефакторинге
-w, --write Сохранять модифицированные файлы
-n, --nobackups Не делать бекапы измененных файлов
-o OUTPUT_DIR, --output-dir=OUTPUT_DIR
Сохранять обработанные файлы в заданную директорию вместо
перезаписи оригинала. Требует наличие опции -n.
-W, --write-unchanged-files
Также сохранять файлы. не подвергшиеся изменениям
(полезно с --output-dir); включает -w.
--add-suffix=ADD_SUFFIX
Добавлять эту строку ко всем выходным файлам.
Требуется опция -n, если строка не пустая.
Например: --add-suffix='3' сгенерирует файлы .py3
Автор: icoz
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/12184
Ссылки в тексте:
[1] PyBrain: http://pybrain.org/
[2] хабре: http://habrahabr.ru/post/148407/
[3] нейронными сетями: http://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C
[4] 2to3: http://python3porting.com/2to3.html
[5] форк: https://github.com/icoz/pybrain
[6] matplotlib: http://matplotlib.sourceforge.net/
[7] здесь: http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.1.1/
[8] Image: http://tinypic.com?ref=mj0fgn
[9] Image: http://tinypic.com?ref=1iyeq0
Нажмите здесь для печати.