Bug 26297

Summary: Gets wrong Requires from renamed imports
Product: Sisyphus Reporter: Vitaly Kuznetsov <vitty>
Component: rpm-build-pythonAssignee: Nobody's working on this, feel free to take it <nobody>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: darktemplar, george, gns, imz, ldv, mike, real.altlinux.org
Version: unstable   
Hardware: all   
OS: Linux   

Description Vitaly Kuznetsov 2011-09-14 16:33:37 MSK
$ cat /tmp/1.py 
import sys
import imp

sys.modules['builtins'] = imp.load_module('__builtin__', *imp.find_module('__builtin__'))

import builtins

$ python /tmp/1.py
$
$ /usr/lib/rpm/python.req /tmp/1.py
python2.6(builtins)

This leads to unresolved python2.6(builtins) requirement which does not exist.
Comment 1 real@altlinux.org 2011-09-15 06:35:49 MSK
А в чём ошибка? Вполне логично, что появляется зависимость. Другое дело, что мейнтейнер должен позаботиться, чтобы python2.6(builtins) появился в репозитории. Или я что-то не так понял?
Comment 2 Vitaly Kuznetsov 2011-09-15 08:22:12 MSK
Ошибка в том, что модуль builtins не нужен, механизмом переименования вместо него в приведённом мной куске кода грузится __builtin__ , никакой зависимости появляться не должно.

Попробуйте выполнить мой код, никакого сообщения о несуществующем модуле builtins вы не получите.

Данный приём штатно используется для написания кода, совместимого с python3, у нас же получаются нерезолвящиеся зависимости.
Comment 3 real@altlinux.org 2011-09-15 09:32:03 MSK
Я думаю, что зависимость появляется из-за "import builtins". Чтобы компьютеру объяснить, что зависимость такая не нужна, надо либо снабдить rpm-build-python искуственным интеллектом (тут я пас), либо в пакете, где используется такой код, сделать соответствующий Provides:

%py_provides builtins
Comment 4 Vitaly Kuznetsov 2011-09-15 10:27:28 MSK
Искусственный интеллект не нужен, нужно смотреть те модули, которые реально импортируются, а не просто "import xyz". Раз уж в питоне есть механизм переопределения импортируемых модулей.
Comment 5 Nick S. Grechukh 2011-09-15 13:24:07 MSK
(In reply to comment #3)
> искуственным интеллектом (тут я пас), либо в пакете, где используется такой
> код, сделать соответствующий Provides:
> 
> %py_provides builtins

ололо
Comment 6 Nick S. Grechukh 2011-09-15 13:26:51 MSK
(In reply to comment #1)
> Другое дело, что
> мейнтейнер должен позаботиться, чтобы python2.6(builtins) появился в
> репозитории. Или я что-то не так понял?

ололошеньки
Comment 7 Fr. Br. George 2011-09-15 16:02:28 MSK
(В ответ на комментарий №4)
> Искусственный интеллект не нужен, нужно смотреть те модули, которые реально
> импортируются, а не просто "import xyz". Раз уж в питоне есть механизм
> переопределения импортируемых модулей.

На синтаксическом уровне модификацию sys.modules отследить совсем непросто, мало ли, какое значение туда положат. А вот создать список таких переименований, необходимых для python3, и засунуть их в provides (в данном случае -- самому python), думаю, имеет смысл.