LINUX.ORG.RU

python34 ImportError: No module named 'rpm'

 ,


0

2

Доброе...

Ситуация такая, решил попробовать написать не большой скрипт для поиска новой версии rpm пакета.

Вот такой код:

#!/usr/bin/env python3.4

import os
import sys
import rpm

def readRpmHeader(ts, filename):
    """ read an rpm header. """
    fd = os.open(filename, os.O_RDONLY)
    h = None
    try:
        h = ts.hdrFromFdno(fd)
    except rpm.error as e:
        if str(e) == "error reading package header":
            sys.stderr.write(str(e))
        h = None
    finally:
        os.close(fd)
    return h


def main(argv):
    if len(argv) < 2:
        sys.stderr.write("Usage: %s PACKAGE_NAME...\n" % (argv[0],))
        return 1

    ts = rpm.TransactionSet()
    ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES | rpm._RPMVSF_NODIGESTS)
    fresh_rpms = {}
    for f in argv[1:]:
        if not os.path.exist(f):
            sys.stderr.write("Error: file %r was not found!" % f)
            return 1
    h = readRpmHeader(ts, f)
    name = h[rpm.RPMTAG_NAME]
    if (name not in fresh_rpms
            or rpm.versionCompare(h, fresh_rpms[name]['header']) > 0):
        fresh_rpms[name] = {'header': h, 'filename': f}
    for n, v in fresh_rpms.iteritems():
        print (v['filename'])

    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv))

Выдает ошибку ImportError: No module named 'rpm'

Менял версии python на 2,7 и на 3,3 - не помогло...

Запустил ipython и проделал все операции в ручную, все работает, import rpm не ругался и дал выполнить команды

Вот что есть:

rpm -qa | grep rpm
rpm-build-4.11.1-25.el7.x86_64
python-deltarpm-3.6-3.el7.x86_64
atrpms-repo-7-7.el7.x86_64
redhat-rpm-config-9.1.0-68.el7.centos.noarch
rpm-python-4.11.1-25.el7.x86_64
rpm-4.11.1-25.el7.x86_64
rpm-sign-4.11.1-25.el7.x86_64
perl-srpm-macros-1-8.el7.noarch
rpm-libs-4.11.1-25.el7.x86_64
deltarpm-3.6-3.el7.x86_64
rpmforge-release-0.5.3-1.el7.rf.x86_64
rpm-build-libs-4.11.1-25.el7.x86_64 

Как можно решить проблему? или в чем, кроме прокладки между монитором и стулом, проблема?)

Спасибо.



Последнее исправление: firefedot (всего исправлений: 2)
Ответ на: комментарий от zolden

есть такое подозрение ... но если я пишу вместо #!/usr/bin/env python3.4 ставлю #!/usr/bin/env python2.7 - результат такой же...

но и даже если я поставил его для 2. то как мне его поставить или указать третьей... не могу найти.. )

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

поставил/обновил pip3 , но не нашел там пакетов rpm

pip3 search *rpm* - ничего не выдал...

или не правильно ставлю?

так же нашел пакет python3-rpm для fedora , у меня centos, но поставить не смог он требовал много зависимостей и в итоге пошло много конфликтов

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

Посмотрел в папке /usr/lib/python2.7/site-packages/ не нашел там папки rpm, так же ее нет в папке с 3,3 и 3,4 версией, но при этом пакет rpm-python стоит)

rpm -q rpm-python
rpm-python-4.11.1-25.el7.x86_64

firefedot
() автор топика
Ответ на: комментарий от Ja-Ja-Hey-Ho

блин)

# rpm -ql rpm-python
/usr/lib64/python2.7/site-packages/rpm
/usr/lib64/python2.7/site-packages/rpm/__init__.py
/usr/lib64/python2.7/site-packages/rpm/__init__.pyc
/usr/lib64/python2.7/site-packages/rpm/__init__.pyo
/usr/lib64/python2.7/site-packages/rpm/_rpmbmodule.so
/usr/lib64/python2.7/site-packages/rpm/_rpmmodule.so
/usr/lib64/python2.7/site-packages/rpm/_rpmsmodule.so
/usr/lib64/python2.7/site-packages/rpm/transaction.py
/usr/lib64/python2.7/site-packages/rpm/transaction.pyc
/usr/lib64/python2.7/site-packages/rpm/transaction.pyo

Но, это говорит, что rpm вроде и есть, но ... не понятно в общем)

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

удалил все новые питоны и старые на катил все по новой

запускаю скрипт, указываю папку и получаю

# ./rpm.py /home/firefedot/pts/files/*.rpm
Traceback (most recent call last):
  File "./rpm.py", line 46, in <module>
    sys.exit(main(sys.argv))
  File "./rpm.py", line 27, in main
    ts = rpm.TransactionSet()
AttributeError: 'module' object has no attribute 'TransactionSet'

как понимаю он якобы увидел rpm, но ... если тоже самое запускть из ide - ругается

File "/home/firefedot/NetBeansProjects/hello/src/hello.py", line 5, in <module>
    import rpm
ImportError: No module named 'rpm'

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

запусти интерпретатор в интерактивном режиме (т.е. python3) и там выполни

help('modules')

убедись что там есть этот модуль

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

Ввел Получил rpm

help('modules') - везде вывел rpm ( то есть он все таки есть , но его как бы нет , прям как суслик, только на оборот))

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

Сейчас зашел в 3 питон и ввел import rpm затем dir(rpm) и был удивлен, всего 13 модулей(методов), сделав тоже самое во 2 версии, получил просто огромное количество методов. в числе которых, была transaction...

а поставив на свою голову тестовую 3,5 питона, там вообще нет возможности импорта rpm и теперь ни одна версия 3 питона не импортирует rpm...

либо полностью убрали, либо как то хитро запрятали...

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

В общем видимо это проблема с 3 питоном

В общем решил проблему на Python 2.7.5 (default, Jun 24 2015, 00:41:19)

На удивление, пришлось немного повозиться... вот итоговый код, в котором убран except и весь блок try закоментировал строки для наглядности.

#!/usr/bin/env python2.7

import os
import sys
import rpm

def readRpmHeader(ts, filename):
    print("fnc-readRpmHeader")
    """ read an rpm header. """
    fd = os.open(filename, os.O_RDONLY)
    #h = None
    #try:
    h = ts.hdrFromFdno(fd)
    #except rpm.error, e:
     #   if str(e) == "error reading package header":
      #      sys.stderr.write(str(e))
       # h = None
    #finally:
    os.close(fd)
    return h


def main(argv):
    if len(argv) < 2:
        sys.stderr.write("Usage: %s PACKAGE_NAME...\n" % (argv[0],))
        return 1

    ts = rpm.TransactionSet()
#    ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES | rpm._RPMVSF_NODIGESTS)
    fresh_rpms = {}
    for f in argv[1:]:
        if not os.path.exists(f):
            sys.stderr.write("Error: file %r was not found!" % f)
            return 1
    h = readRpmHeader(ts, f)
    name = h[rpm.RPMTAG_NAME]
    if (name not in fresh_rpms
            or rpm.versionCompare(h, fresh_rpms[name]['header']) > 0):
    fresh_rpms[name] = {'header': h, 'filename': f}
    for n, v in fresh_rpms.iteritems():
        print (v['filename'])

    return 0


if __name__ == '__main__':
    sys.exit(main(sys.argv))

Самое не понятное, это то что этот код с небольшими правками в отключении тегов и except заверля на python2.7, который есть из коробки на CentOS7. А как только добавил на ту машину питон3, сразу перестал работать ... не понятно, в чем именно проблема и конфликт. И интересно, что код сработал один раз на ubuntu 15.04, после чего перестал видеть методы rpm.

Итогом скажу.. что на сырой машине с версией 2,7 код работает как надо.

Делаю вывод, может и ошибочный, но в 3 версии либо отказываются от rpm/yum и подобного, либо упрятали в какой-нибудь другой модуль.

Всем спасибо.

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