Найти - Пользователи
Полная версия: Asus Eee PC 1005HA
Начало » Python для новичков » Asus Eee PC 1005HA
1
saturn721
здравствуйте. с недавних пор разбираюсь, усиленно, с 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 но это видимо модуль ядра сообщает.
Андрей Светлов
Это хак, и довольно грязный. Дело в том, что Питон ищет все имена в таком порядке: namespaces globals, locals, builtins.
Причем если globals и locals у каждого свои - то builtin на всех один общий. Значит в него можно что-то положить - и потом это имя будет видно всем (если его не перекроют, конечно же).

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

В стандратном питоне, естественно, никакого log нет.
saturn721
значит в этот кусок кода не работает? Но само то приложение то пашет, оно не должно вылетать с ошибкой? Ведь запускается и сидит в top как раз eee-control-daemon
ZZZ
saturn721
значит в этот кусок кода не работает?
Отдельно нет.
Просто где-то сделано что-то вроде __builtins__.log = log и поэтому оно работает.

И, кстати, само наличие твоего вопроса, подразумевает то, что так делать не стоит.
saturn721
А если подобный код присутствует в определении класса. Т.е. уже в 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 не используются.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB