суббота, 19 марта 2011 г.

Segmentation fault при использовании pycurl в Linux.

Написал клиенту простейший скрипт с использованием pycurl (я его всегда, кстати, использую), который состоит буквально из одного get-запроса, а при использовании этого скрипта под Linux, начала периодически валиться ошибка Segmentation fault и обрывать работу скрипта. Как выяснилось надо было вставить следующий кусочек кода, чтобы этого не происходило:

import sys
import pycurl

try:
import signal
from signal import SIGPIPE, SIG_IGN
signal.signal(signal.SIGPIPE, signal.SIG_IGN)
except ImportError:
pass

Пока не пробовал, но чтобы не забыть решил записать.

воскресенье, 13 марта 2011 г.

Использование __setattr_.

Очень часто использую файл настроек для скрипта посредством модуля ConfigParser. И как-то немножко поднадоело писать в несколько строк каждый раз:

key = config.get("Basic","Key")
ns1 = config.get("Domains","NS1")
ns2 = config.get("Domains","NS2")


Короче, захотел я, чтобы доступ к настройкам выглядел примерно так: ns1 = config.Domains['ns1'], когда надо обратился к ней, вне зависимости от того, сколько настроек в файле. Самая хитрость - это сделать свойством класса секцию файла настроек. Именно для этого нужна функция __setattr__. Вот так у меня всё в итоге получилось:

class ConfigDict(object):
def __init__(self,path):
config = ConfigParser.RawConfigParser()
config.read(path)
for section in config.sections():
dct = {}
for option in config.options(section):
dct[option] = config.get(section,option)
self.__setattr__(section,dct)


Используется это вот так:


def main():
conf = ConfigDict("settings.cfg")
threads = conf.Basic['threads']
ns1 = conf.Domains['ns1']
if __name__ == '__main__':
main()

Ну и сам файл настроек settings.cfg:

[Basic]
THREADS = 1 ; потоки
[Domains]
NS1 = ns1.0adz.com