Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2010 08:35:48

saturn721
От:
Зарегистрирован: 2010-01-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Asus Eee PC 1005HA

здравствуйте. с недавних пор разбираюсь, усиленно, с python, ковыряясь в любом коде который попадется на глаза. Недавно устанавливал crunchbang linux на Asus Eee PC 1005HA, по этому мануалу
http://crunchbanglinux.org/forums/topic/3954/asus-eee-pc-1005ha-crunchbang-installation-guide/
и конечно заглянул в код eee-control_0.9.4. Он написан на смеси bash и python. В модуле eee-control-daemon (устанавливается в /usr/bin) обнаружил код:

# Initialize logger
def _log(text, level=3, module=None):
if __builtin__._loglevel >= level:
if module: print “%s: %s” %(module, text)
else: print text
__builtin__.log = _log
Но в модуле __builtin__ нет ничего подобного

Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
AttributeError: ‘module’ object has no attribute ‘log’
И дальше я немного завис, или это какой то другой __builtin__? И как оно работает, где у него лог я тоже не понимаю, в dmesg есть сообщения от eee-pc но это видимо модуль ядра сообщает.



Офлайн

#2 Янв. 20, 2010 10:14:35

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Asus Eee PC 1005HA

Это хак, и довольно грязный. Дело в том, что Питон ищет все имена в таком порядке: namespaces globals, locals, builtins.
Причем если globals и locals у каждого свои - то builtin на всех один общий. Значит в него можно что-то положить - и потом это имя будет видно всем (если его не перекроют, конечно же).

Автор вашего творения от большого ума, совмещенного с великой ленью (положить log в отдельный модуль было бы более логично - но модуль пришлось бы импортировать явно перед использованием) решил, что модификация этого buildin namespace - удачная идея. Что в корне не верно по целому ряду причин. Никогда в своем коде так не делайте.

В стандратном питоне, естественно, никакого log нет.



Офлайн

#3 Янв. 20, 2010 12:19:02

saturn721
От:
Зарегистрирован: 2010-01-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Asus Eee PC 1005HA

значит в этот кусок кода не работает? Но само то приложение то пашет, оно не должно вылетать с ошибкой? Ведь запускается и сидит в top как раз eee-control-daemon



Офлайн

#4 Янв. 20, 2010 13:37:12

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Asus Eee PC 1005HA

saturn721
значит в этот кусок кода не работает?
Отдельно нет.
Просто где-то сделано что-то вроде __builtins__.log = log и поэтому оно работает.

И, кстати, само наличие твоего вопроса, подразумевает то, что так делать не стоит.



Отредактировано (Янв. 20, 2010 13:47:20)

Офлайн

#5 Янв. 24, 2010 13:06:27

saturn721
От:
Зарегистрирован: 2010-01-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Asus Eee PC 1005HA

А если подобный код присутствует в определении класса. Т.е. уже в tray.py в class EeeControlTray: определяется некая функция

def toggle_touchpad(self):
# If we're using synaptics, switch it via synclient
if self.use_synaptics:
if self.synaptics_state == True:
os.system(“synclient TouchpadOff=1”)
self.synaptics_state = False
else:
os.system(“synclient TouchpadOff=0”)
self.synaptics_state = True
self.touchpad_notify(self.synaptics_state)
else:
if self.iface.get_touchpad(): self.iface.touchpad_off()
else: self.iface.touchpad_on()
и я тоже не пойму откуда взялось имя iface
файл этот в /usr/lib/python2.6/dist-package/Eeecontrol т.е. он импортируется. К слову сказать, включение тачпада работает нормально, но если ноутбук ушел в режим ожидания с выключенным тачпадом, то потом он не включается, хотя сообщения из трея работают. Не могут ли от сюда расти ноги. synaptic и synclient не используются.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version