LINUX.ORG.RU

Python - AttributeError: 'module' object has no attribute 'SymbolInventory'


0

0

Запускаю чужую программу (по обработке речи), получаю ошибку

AttributeError: 'module' object has no attribute 'SymbolInventory'

Объясните, плиз, что это означает? И может ли это быть связано с недоустановкой Питона?

Фрагмент выдачи:

Output dictionary AudioBook/interim_files/dict opened
Source dictionary AudioBook/interim_files/pronDict opened
Dictionary AudioBook/interim_files/dict created - 10 words processed, 1 missing
/usr/bin/g2p.py:37: DeprecationWarning: the sets module is deprecated
  import math, sets, sys
Traceback (most recent call last):
  File "/usr/bin/g2p.py", line 263, in <module>
    tool.run(main, options, args)
  File "/usr/lib/python2.6/site-packages/tool.py", line 62, in run
    status = runMain(main, options, args)
  File "/usr/lib/python2.6/site-packages/tool.py", line 98, in runMain
    status = main(options, args)
  File "/usr/bin/g2p.py", line 200, in main
    model = SequiturTool.procureModel(options, loadSample, log=stdout)
  File "/usr/lib/python2.6/site-packages/SequiturTool.py", line 207, in procureModel
    return tool.procureModel()
  File "/usr/lib/python2.6/site-packages/SequiturTool.py", line 160, in procureModel
    model = pickle.load(open(self.options.modelFile))
AttributeError: 'module' object has no attribute 'SymbolInventory'
g2p.py mv AudioBook/interim_files/dlog AudioBook/interim_files/logs/dlog1 failed: 256 at AudioBook/Dictionary.pm line 139
        AudioBook::Dictionary::getG2PPronunciations('AudioBook::Dictionary=HASH(0x8d3fa8c)', 'AudioBook/interim_files/MissingWords_out') called at AudioBook/MissingWords.pm line 85
        AudioBook::MissingWords::getText('AudioBook::MissingWords=HASH(0x8d3f9dc)') called at AudioBook/Chapter.pm line 69
        AudioBook::Chapter::processText('AudioBook::Chapter=HASH(0x8b23b34)') called at ./AudioCrop.pm line 115
        AudioCrop::crop('AudioCrop=HASH(0x8b078c4)') called at ./AudioCrop.pm line 51

Нет такого класса в импортируемом модуле.
Приведите код импорта этого модуля и фрагмент использования класса из него.

jreznot
()

VoxForge Acoustic Models?

tool.py, SequiturTool.py что ли вручную в /usr/lib/python2.6/site-packages/ копировали? А symbol.py куда делся?

Если почитаете README, то там написано как устанавливать, лучше не пихать в системные директории и установить вот так:

cd $HOME/AudioBook/input_files/g2p/source  # или где оно у вас
mkdir -p $HOME/g2p
python setup.py install --prefix $HOME/g2p

потом сделать export PYTHONPATH=$HOME/g2p/lib/python2.6/site-packages/

> И может ли это быть связано с недоустановкой Питона?

Что вы имеете в виду? Менеджер пакетов всегда устанавливает то, что надо полностью.

ntp
()
Ответ на: комментарий от ntp

> VoxForge Acoustic Models?

Оно самое.

что ли вручную в /usr/lib/python2.6/site-packages/ копировали?

Нет, конечно, не вручную. С помощью инсталлятора.

А symbol.py куда делся?

А как Вы узнали, что именно этого файла не хватает? Мне бы хотелось понять, как расшифровать то питоновское сообщение об ошибке. Я понимаю так, что у объекта module нет члена SymbolInventory, но почему-то в строчках, на которые идёт ссылка, эти имена не упоминаются.

Dims2000
() автор топика
Ответ на: комментарий от ntp

> потом сделать export PYTHONPATH=$HOME/g2p/lib/python2.6/site-packages/

А почему не надо подцеплять старое значение PYTHONPATH?

Dims2000
() автор топика
Ответ на: комментарий от Dims2000

> но почему-то в строчках, на которые идёт ссылка, эти имена не упоминаются.

Данное сообщение об ошибке говорит о том, что pickle.load() не смог импортировать SymbolInventory из какого-то модуля (к сожалению pickle имя модуля в ошибке не сообщил, да и вообще ImportError тут была бы более к месту). Но «grep -r SymbolInventory .» подсказал какого модуля не хватает.

А почему не надо подцеплять старое значение PYTHONPATH?

PYTHONPATH не установлено по-умолчанию, а /usr/lib/python2.6 подцепится в любом случае.

ntp
()
Ответ на: комментарий от ntp

> pickle.load() не смог импортировать SymbolInventory

А почему именно pickle.load, а не open? Это вызовы функций вообще?

PYTHONPATH не установлено по-умолчанию

А если я хочу поставить g2p в system-wide место, например, в /opt и хочу прописать пути в profile.d, то мне надо именно эту переменную там устанавливать или лучше какую-то другую? Я так делал вначале, но не разобрался, куда положено писать путь к питоновским библиотекам.

«grep -r SymbolInventory .» подсказал какого модуля не хватает.

Возможно, тут какое-то рассогласование версий, потому что у меня в одном месте sympol.py, а в другом symbols.py... Хм...

Dims2000
() автор топика
Ответ на: комментарий от Dims2000

> Это вызовы функций вообще?

Конечно. А что это может быть еще?

> А почему именно pickle.load, а не open?

Да, в данном случае (две сишных функции в одной строке) их несколько труднее различить чем обычно. Но в документации описано как они работают и какие эксепшены бросают. open не может выбросить AttributeError.

> А если я хочу поставить g2p в system-wide место, например, в /opt

http://docs.python.org/install/#modifying-python-s-search-path

Наверное, проще будет поместить в /usr/lib/python2.6/site-packages файл g2p.pth в котором написать путь к модулям. Так и поиск модулей будет работать и системные директории будут по минимуму «загрязнены».

> Возможно, тут какое-то рассогласование версий, потому что у меня в одном месте sympol.py, а в другом symbols.py

Не вижу в source symbols.py вообще.

ntp
()
Ответ на: комментарий от ntp

> Конечно. А что это может быть еще?

Х.з., я же не знаю язык. Мож создание экземпляров классов или параметрические макросы какие-нибудь...

Не вижу в source symbols.py вообще.

Я ставил g2p отсюда http://www-i6.informatik.rwth-aachen.de/web/Software/g2p.html

Там две версии, в новой symbols, в старой symbol.

Непонятно, если у меня стоит новая версия, то на каком этапе возникает потребность в symbol.py? Можно ли это как-то выяснить? Или лучше забить и просто проинсталить g2p из source?

Dims2000
() автор топика
Ответ на: комментарий от ntp

А, вот ещё вопрос. Ну теперь я засорил общие папки файлами от g2p. Как мне их оттуда убрать? Есть ли какое-нибудь setup.py uninstall? Я что-то не нахожу:


   [root@testbed g2p]# python setup.py --help-commands
      Standard commands:
       build build everything needed to install
       build_py «build» pure Python modules (copy to build directory)
       build_ext build C/C++ extensions (compile/link to build directory)
       build_clib build C/C++ libraries used by Python extensions
       build_scripts «build» scripts (copy and fixup #! line)
       clean clean up temporary files from 'build' command
       install install everything from build directory
       install_lib install all Python modules (extensions and pure Python)
       install_headers install C/C++ header files
       install_scripts install scripts (Python or otherwise)
       install_data install data files
       sdist create a source distribution (tarball, zip file, etc.)
       register register the distribution with the Python package index
       bdist create a built (binary) distribution
       bdist_dumb create a «dumb» built distribution
       bdist_rpm create an RPM distribution
       bdist_wininst create an executable installer for MS Windows
       upload upload binary package to PyPI
      
      usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
       or: setup.py --help [cmd1 cmd2 ...]
       or: setup.py --help-commands
       or: setup.py cmd --help

Dims2000
() автор топика
Ответ на: комментарий от Dims2000

> Мож создание экземпляров классов или параметрические макросы какие-нибудь

Создание экземпляров классов - тоже вызов функции (__call__() метакласса). Макросов нет. Так что это так или иначе вызов функций.

Я ставил g2p отсюда <...>

Вот! Этой ссылкой и надо было начинать топик.

Или лучше забить и просто проинсталить g2p из source?

У меня source на gcc 4.4.3 не смог скомпилироваться, а вот g2p-r103.tar.gz смог (в CHANGELOG как раз намекают на исправление ошибок с gcc4). И даже успешно прошел тесты test-g2p.sh

Есть подозрение, что у вас или перемешались файлы, или файл указанный в командной строке после --model устарел.

Есть ли какое-нибудь setup.py uninstall

Нет, к сожалению :-( Разве что поглядеть какие файлы она установит в другое место и удалить вручную. Поэтому через setup.py лучше не ставить в системные директории - для этого есть менеджер пакетов.

ntp
()
Ответ на: комментарий от ntp

> Вот! Этой ссылкой и надо было начинать топик!

А мы не ищем лёгких путей :)

Dims2000
() автор топика
Ответ на: комментарий от ntp

Всё-таки я вернулся с чего начал — к этой ошибки. Старая версия g2p не компиллируется, а новая, при работе со скриптом, вызывает эту ошибку.

Говорить, что проблема вызвана отсутствием файла symbol.py теперь нельзя, так как этот файл нигде не используется.

Греп даёт такую выдачу:

[root@testbed site-packages]# grep -r SymbolInventory . Binary file ./sequitur.pyc matches ./symbols.py:class SymbolInventory: Binary file ./symbols.pyc matches ./sequitur.py:from symbols import SymbolInventory ./sequitur.py: self.leftInventory = SymbolInventory() ./sequitur.py: self.rightInventory = SymbolInventory()

- никаких упоминаний sympol.py

Следовательно, по-прежнему, хотелось вы просто понять, на уровне языка Питон — что именно ему не нравится? У кого что отсутствует?

Dims2000
() автор топика
Ответ на: комментарий от ntp

Да, указываю model. Файл был вместе со скриптом и старой версией g2p:

sub getG2PPronunciations { # public
my ($self,$missing_words_out)= @_;
my $audioBook = $self->{'audiobookObject'};
my $debug = $audioBook->getDebug;
my $model = $audioBook->getG2p_model();
my $missing_words = $self->{'missing_words'};
my $log = $audioBook->getLog();

#my @missingwords = `export PYTHONPATH=/usr/local/lib64/python2.4/site-packages &&
#my @missingwords = `export PYTHONPATH=/usr/local/lib/python2.6/site-packages && g2p.py --model $model --apply $missing_words
#my @missingwords = `g2p.py --model $model --apply $missing_words`; # DIMS - no PYTHONPATH set is required since caller is re
my @missingwords = `python -m pdb /opt/g2p/bin/g2p.py --model $model --apply $missing_words`; # DIMS - no PYTHONPATH set is

Dims2000
() автор топика
Ответ на: комментарий от ntp

Процедурка:

sub getG2p_model { my $self = shift; return $self->{'g2p_model'}; }

А что означает «my» и «$self»?

Dims2000
() автор топика
Ответ на: комментарий от ntp

И раньше в скрипте:

$self->{'g2p_model'} = «AudioBook/input_files/g2p/models/model-5»;

Dims2000
() автор топика
Ответ на: комментарий от Dims2000

g2p записывает в файл модели сериализованные объекты питона (используя модуль pickle). pickle.dump() не сериализует исходный код, он только записывает откуда импортировать класс и аттрибуты экземпляра. pickle.load() импортирует этот класс, создает экземпляр и возвращает атрибутам нужные значения.

Указанный вами файл модели от старой версии g2p, которая еще имела модуль symbol.py (а не symbols). pickle.load не может импортировать этот модуль (в новой версии его переименовали) и бросает эксепшн из самого первого сообщения.

Вам нужно или найти новый файл модели, или использовать более старую версию g2p.

ntp
()
Ответ на: комментарий от ntp

Спасибо! Оказывается, у меня есть все данные, чтобы оттренировать модель на новой g2p, так что уже крутится..

А не могли бы Вы вкратце объяснить, как Вы «раскрутили» первопричину проблемы? :)

А вообще-то понятно — достаточно знать, что делает pickle.load, так?

Dims2000
() автор топика
Ответ на: комментарий от ntp

Понятно. Мне просто не пришло в голову, что это стандартная функция.

А бывают вьюверы сериализованных объектов для питона?

Dims2000
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.