Analitycs

Показаны сообщения с ярлыком код. Показать все сообщения
Показаны сообщения с ярлыком код. Показать все сообщения

четверг, 20 октября 2011 г.

Как демонизировать(daemon) проект на Twisted?

Есть три способа демонизировать проект на Twisted.

1) использование родного демона twistd. По идее - это более "методически грамотный" способ, но в свое время что-то не завелся у меня "в лоб", по этому до сих пор применяю второй.

2) скрестить старый работающий демон с реактором Twisted

#!/usr/bin/python                                                                                               
import sys
import src.daemon
import procname

class YourServer(twisted.web.server.Site):
    pass

class YourDaemon(Daemon):
    name   = 'yourserverd'
    site   = None
    server = None

    #--------------------------------------------------------------------------
    def __init__(self):
        self.server = YourServer()
        Daemon.__init__(self, pidfile='/var/run/%s.pid' % (self.name.lower()) )
        procname.setprocname(self.name)

    #--------------------------------------------------------------------------
    def run(self):
        self.server = YourServer()
        reactor.listenTCP(self.server.port, self.server)
        reactor.run()

if __name__ == '__main__':
      daemon = YourDaemon()
      daemon.processAction(sys.argv)

Да, procname служит для переименования процесса, о чем писал тут.


3) есть еще правда и python-daemon (PEP-3143), надо бы повнимательней изучить, но думаю что родной twistd оптимальней.

суббота, 15 октября 2011 г.

Python py2app: AttributeError: 'module' object has no attribute 'TickCount'

Симптомы

После запуска собранного с помощью py2app пакета для MacOS на другой машине получаем падение с ошибкой

AttributeError: 'module' object has no attribute 'TickCount'

Лечение

В файле setup.py отключить argv_emulation, то есть - поставить в False

APP = ['MyApp.py']
OPTIONS = { 
   'argv_emulation': False,
   ...
}

setup(
    app=APP,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)


Подробности тут

понедельник, 10 октября 2011 г.

Python - RuntimeError: maximum recursion depth exceeded while getting the str of an object

При активном использовании рекурсивных функций в Питоне начинает вываливаться ошибка RuntimeError: maximum recursion depth exceeded while getting the str of an object

Лечение быстрое, но не оптимальное

import sys
sys.setrecursionlimit(XXX)

Где XXX число, подбираемое экспериментально, основываясь на вашей программе. Но лучше, конечно, обходится без рекурсии. ;-)

пятница, 23 сентября 2011 г.

Python mktime/strptime - TypeError: expected string or buffer

Иногда апдейты повергают меня в транс - недавно ловил баг с PHP+cURL, теперь отличился Python ;-/

Traceback (most recent call last):
  File "test.py", line 22, in 
    s = strptime(row['change_time'], TIME_FORMAT)  File "/usr/lib/python2.6/_strptime.py", line 454, in _strptime_time
    return _strptime(data_string, format)[0]
  File "/usr/lib/python2.6/_strptime.py", line 322, in _strptime
    found = format_regex.match(data_string)
TypeError: expected string or buffer

Описание

Лезем в код - получаем какой-то набор данных из MySQL через питоновский fetchall, затем преобразуем поле со временем и начинаем с ним танцевать.

Перестала работать конструкция
 
    s = strptime(row['change_time'], TIME_FORMAT)
    last_change_time = mktime(s)

После курения манов по времени в Python выясняется, что нужно в mktime отдавать 9 численный tuple


    s = row['change_time'].timetuple()
    last_change_time = mktime(s)

Вот и верь после этого людям... обновляй после этого пакеты...

понедельник, 19 сентября 2011 г.

PHP: echo var_export($xx) ничего не выводит

Иногда с логики построения функций PHP хочется биться головой об стену.

Конструкция

logActivity(var_export($vars));

Не выводит в лог НИЧЕГО. Ломаю голову, пытаясь понять, куда делись переменные.
Подсказка проста - второй аргумент.

logActivity(var_export($vars, TRUE));

пятница, 16 сентября 2011 г.

Как исправить Fatal error: Cannot use object of type stdClass as array (PHP+JSON)

Всем хороша в пятом php функция json_decode, только по умолчанию декодирует JSON строку в объект класса stdClass, с которым нельзя работать как с массивом.

Ибо конструкция

$json = json_decode($string);
echo $json['result'];

приведет к ошибке
Fatal error: Cannot use object of type stdClass as array

Правится это добавлением второго параметра
$json = json_decode($string, true);
echo $json['result'];

четверг, 15 сентября 2011 г.

Как исправить ошибку Python datetime.datetime() is not JSON serializable?

Немного о сериализации через simplejson даты/времени, полученной из MySQL

При попытке сдампить результат из fetchall - чтобы отдать данные наружу во фронтендовский в Javascript в стиле

            sql  ='SELECT * FROM xxx WHERE id=%d'                                                          
            self._query(sql % id)
            data = self._cursor.fetchall()

получаем Exception

datetime.datetime(2011, 9, 14, 10, 18, 57) is not JSON serializable

Исправляется дополнительным форматом через лямбда-функцию

            dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime) else None
            response = json.dumps(data, ensure_ascii=False, default=dthandler)
Найдено, как водится - на StackOverflow

пятница, 9 сентября 2011 г.

Проблема в PHP+cURL+CURLOPT_POSTFIELDS - после обновления

Обновив PHP и cURL поймал забавность - старая конструкция, нормально работавшая несколько месяцев

 $data = array(
  'id' => $id,
 );
 
 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&', $data));

 $result = curl_exec($ch);

 curl_close($ch);
  
 return json_decode($result);

перестала отправлять в POST данные.

Покурив маны, нашел ошибку в коде - не нужно implode на массив

 $data = array(
  'id' => $id,
 );
 
 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

 $result = curl_exec($ch);

 curl_close($ch);
  
 return json_decode($result);

Нет, ну понятно - как бы косяк, но тогда вопрос - ПОЧЕМУ ЭТО РАБОТАЛО?

P.S. "Чем дальше в лес - тем толще партизаны" (с) Ненавижу...

среда, 7 сентября 2011 г.

Python+MySQL+Bit fields = Error: invalid literal for int() with base 10: '\x01'

Причина - не нужно сравнивать значения, полученные из битового поля MySQL сразу с  int значениями - 0 и 1.

Методически грамотно - преобразовывать:

if int(result) != ord(row['bit_filed']):
    bla-bla-bla

понедельник, 25 июля 2011 г.

Как создать template продукта в WHMCS?

При написания модуля продукта сервиса для биллинга WHMCS на PHP проблема - не работают кнопки.

Решение: в модуле ОБЯЗАТЕЛЬНО должен быть объявлен метод для конфига - даже если ничего в конфиге нет


 function test_ConfigOptions() {  
     $configarray = array();  
     return $configarray;  
 }  
 function test_AdminCustomButtonArray() {  
      $buttonarray = array(  
           "Reinstall OS" => 'reinstallos',  
      );  
      return $buttonarray;  
 }  
 function test_reinstallos($params) {    
      $error = 'Something strange here...';  
      $ok = TRUE;  
 #     logActivity('test_reinstallos');       
      return $error; #'success';   
 }