Site Tools


python

python.lxml
В python2* назначает кодировку

 # -*- coding: utf-8 -*-

[] - изменяемо - список - list
() - неизменяемо - кортэж - tuple
{} - хэшовый - словарь - dict

Словарь
d = {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
print d[1]    # = one
print d # = {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
for key, val in d.items():   # цикл по всему словарю
  print key, val
for key in d.keys():   # цикл по ключам словаря
  print key, d[key]
for val in d.values():   # цикл по значениям словаря
  print val
d.update()  # пополняется словарь
other

some in var - проверка наличия
some and some = если 1-ый и 2-ой true значит true, в ином случае false
some or some - если 1-ый some false, значит 2-ой some. Если и 2-ой false, возращает false
some[start:end:step] - срез (some[::-1] - в обратном порядке)

Сочетание
A = sets.Set([1, 2, 3]) 
B = sets.Set([2, 3, 4])
print A | B, A & B, A - B, A ^ B

Set([1, 2, 3, 4]) Set([2, 3]) Set([1]) Set([1, 4])

Структура
if boolean:
    some
elif boolean:
    some
else:
    some
while boolean:
    some
for tmp in interable:
    some
try:
    some
except some_exception as var:
    some
except some_exception_2 as var2:
def name(var, var, ...):
    some
    return some
Функции

var.append() - добавление в конец
sys.argv - врнета имена запуска
random.randint(int, int) - рандом число
random.choice([str1,str2,str3]) - рандом выбор
dir() - список антрибутов объекта
re.compile() - переменная
len() - возвращает размер
some.join() - объединяет полученные данные, с разделителем some
some.count(some2,[срез some]) - Возвращает колличество вхождений some2 в some
some.find(some2,[срез some]) - Возвращает позицию первого some2 в some или -1
some.lower() - Возвращает в нижнем регистре (some.upper() - наоборот)
some.partition(some2) - Разбить строку some по some2
some.replace(some1, some2, [int]) - В строке some, находит some1 и заменяет на some2
some.splitlines([bool]) - Разбивает some по символам перевода строки
some.strip([chars]) - Обрезает пробельные символы в начале и конце файла. еще есть [r|l]strip()
vars() - Возвращает список всех переменных в виде словаря.
open() - Открытие файла. Вторым параметром “r” чтение, “w” запись, “a” добавление или “w+”, “a+”, “r+” изменение.
random

  • choice(s) - Выбирает рандомное из s
  • shuffle(s) - Рандомно перемешивает значения в s
  • randrange([start,] stop[, step]) - Выдает рандомное значение из списка чисел

pdb - python debug. Модуль отладчик

  • l - list , просмотр текущего положения
  • n - next , следующий шаг
  • p переменная - вывод текущих значений в переменной
Пространства имен
#!/usr/bin/python
'''manyname.py -- from "Learning Python" by Mark Lutz
and David Ascher, published by O'Reilly.  Demonstrates
name-spaces associated with classes, functions, and
methods.'''

X = 11                # Module (global) name/attribute

class C:
    X = 22            # Class variable
    def m(self):
        X = 33        # Local variable in method
        self.X = 44   # instance variable

def f():
    X = 55        # Local variable in function
    print(X)

def g():
    print(X)       # Access module X (11)

if __name__ == '__main__':
    print(X)  # 11: module (a.k.a. manynames.X outside file)
    f()       # 55: Local
    g()       # 11: Global
    obj = C()
    print(obj.X) #22: From Class

    obj.m()
    print(obj.X) # 44: class instance
    print(C.X)   # 22: class (a.k.a. obj.X if no X in instance)

    #print(C.m.X)  # fails: only visible in method
    #print(f.x)    # fails: only visible in function

Не отсортировано

Ручная установка python3.2 и MySQLdb (Ubuntu)

(На самом деле, можно ставить через pip install mysql-python)

#Ставим Python
wget http://www.python.org/ftp/python/3.2.2/Python-3.2.2.tar.bz2
tar -xvf Python-3.2.2.tar.bz2 
cd Python-3.2.2
./configure 
make
make install

#Ставим setuptools и easy_install-3.2
wget http://python-distribute.org/distribute_setup.py
python3.2 distribute_setup.py 

#Ставим MySQLdb
wget https://github.com/davispuh/MySQL-for-Python-3/tarball/master
tar -xzvf master 
cd davispuh-MySQL-for-Python-3-3403794/
python3.2 setup.py build
python3.2 setup.py install

UDP: На дворе 2013, все к чертям обновилось. Вместо попыток устанавливать python3.2 + MySQLdb лучше просто установить 3.3 + pymysql3

Для начала установим пакет “python3-setuptools”:
sudo apt-get install python3-setuptools
Далее, с помощью “easy_install3” установим “pymysql3”:
easy_install3 pymysql3
Собственно, и всё, можно пользоваться. Для примера, стандартные команды для работы с базой, выложенный автором PyMySQL и слегка подправленный мной:
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', passwd='superpass', db='mysql', charset='utf8')
cur = conn.cursor()
cur.execute("SELECT Host,User FROM user")
# print cur.description
# r = cur.fetchall()
# print r
# ...or...
for r in cur:
   print (r)
cur.close()
conn.close()
Подключение к MySQL
import MySQLdb

conn = MySQLdb.connect (host = "localhost", user = "testuser", passwd = "testpass", db = "test")
cursor = conn.cursor ()
cursor.execute ("SELECT VERSION()")
row = cursor.fetchone ()
print "server version:", row[0]
cursor.close ()
conn.close ()
Смотрим подключенные модули в IDLE
help('modules')
Смотрим наследования в IDLE
SomeClass.Some.__bases__

Обработака ошибок

Пропускаем любую ошибку и выводим ее текст
import traceback
try:
    some_code
except:
    print "Some Error:"
    traceback.print_exc(file=sys.stdout)
    print "+++++++++++++++++++++++++++++++++++++++++++++++++++++++"
Или пишем ее в псевдо файл
import io
ErrorMassageBuf = io.StringIO()
...
      try:
          self.execution()
      except:
          print("Some Error:")
          traceback.print_exc(file=ErrorMassageBuf)
...
print(str(ErrorMassageBuf.getvalue()))

1

Выполнение команды и получение вывода в MyVar

import subprocess as sub 

p = sub.Popen(['ping', '-c4', '8.8.8.8'],stdout=sub.PIPE)
MyVar = p.communicate()
print MyVar[0]

Выход по таймауту

import sys
import signal
import time

class TimeoutException(Exception):
    pass

def timeout_handler(signum, frame):
    raise TimeoutException()

signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(3) # Даем 3 секунды на выполнение

while 1:
    try:
        timecode = 1
        while 1:
            print timecode
            timecode += 1
            time.sleep(1)
            signal.alarm(0) # Отключаем timeout
    except TimeoutException:
        continue

http://pguides.net/python/timeout-a-function

Обработка сигналов

import signal, threading, time

class TestTread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        # kill -SIGUSR1 $PID
        signal.signal(signal.SIGUSR1 , self.mystop)
        # kill -SIGUSR2 $PID
        signal.signal(signal.SIGUSR2 , self.mystop2)

    def run(self):
        while(1):
            print("live")
            time.sleep(1)

    def mystop(self, signum, frame):
        print("Signal USR1")

    def mystop2(self, signum, frame):
        print("Signal USR2")


TestTread().start()

Threading

import threading
import time

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        self.threadID = threadID
        self.name = name
        self.counter = counter
        threading.Thread.__init__(self)
    def run(self):
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name

def print_time(threadName, delay, counter):
    while counter:
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

print "File end"
Thread generator
class myThread (threading.Thread):
    def __init__(self, id):
        threading.Thread.__init__(self)
        self.id = id
    def run(self):
        pass

threads = []
for id in range(200):
    thread = myThread(id)
    thread.start()
    threads.append(thread)
  • class threading.Timer(interval, function, args=[], kwargs={}) #Действие по таймеру не прирывая поток. Метод cancel() отменяет.
Python + web
#!/usr/local/bin/python2.6
# -*- coding: utf-8 -*-

import MySQLdb
import os
import sys
import cgitb
import cgi
cgitb.enable()

b = "<br />"

print "Content-Type: text/html; charset=utf-8"
print ""
print """<html>
<body>
<form action="main.py" method="post">
    FIO:  <input type="text" name="fio" /><br />
    Email: <input type="text" name="email" /><br />
    <input type="submit" name="submit" value="Search" />
</form><br />
"""

form = cgi.FieldStorage()
SearchFIO = form.getfirst("fio", "")    # This way it's safe.
SearchEmail = form.getfirst("email", "")    # This way it's safe.

db = MySQLdb.connect(host="localhost", user="user", passwd="PASS", db="MYDB", charset='utf8')
cursor = db.cursor()

if SearchEmail:
	cursor.execute("SELECT * FROM `emails` WHERE `email` LIKE '%" + SearchEmail + "%' LIMIT 0, 10000")
        rows = cursor.fetchall()
        print "<TABLE>"
	print "<TR><TD> Id </TD><TD> Email </TD><TD> Resume </TD><TD> Send </TD><TD> FIO </TD><TD> Date Send </TD></TR>"
        for row in rows:
                print "<TR>"
                for words in row:
                        print "<TD>"
                        try:
				print words
                        except:
				print words.encode('utf-8')
                        print "</TD>"
                print "</TR>"
        print "</TABLE>"
        print """

        </body>
        </html>
        """
        sys.exit()

if SearchFIO:
	cursor.execute("SELECT * FROM `emails` WHERE `fio` LIKE '%" + SearchFIO + "%' LIMIT 0, 10000")
	rows = cursor.fetchall()
	print "<TABLE>"
	print "<TR><TD> Id </TD><TD> Email </TD><TD> Resume </TD><TD> Send </TD><TD> FIO </TD><TD> Date Send </TD></TR>"
	for row in rows:
		print "<TR>"
		for words in row:
			print "<TD>"
			try:
				print words
			except:
				print words.encode('utf-8')
			print "</TD>"
		print "</TR>"
	print "</TABLE>"
	print """

	</body>
	</html>
	"""
	sys.exit()
Python + email + кодировка
from smtplib import SMTP
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import quopri

def QuoHead(String):
    s = quopri.encodestring(String.encode('UTF-8'), 1, 0)
    return "=?utf-8?Q?" + s.decode('UTF-8') + "?="

FIOin = "Андрей Петрович"
emailout = "some@test.ru"
emailin = "some2@test.ru"

msg = MIMEMultipart()
msg["Subject"] = QuoHead("Добрый день " + FIOin).replace('=\n', '')
msg["From"] = (QuoHead("Ирина Федоровна") + "  <" + emailout + ">").replace('=\n', '') 
msg["To"] = (QuoHead(FIOin) + "  <" + emailin + ">").replace('=\n', '')

m = """Добрый день.
  Это тестовое письмо.
Пожалуйста, не отвечайте на него."""

text = MIMEText(m.encode('utf-8'), 'plain', 'UTF-8')
msg.attach(text)

connect = SMTP('11.22.33.44:25')
connect.set_debuglevel(1)
#connect.starttls()
connect.login('some@test.ru', 'password')
connect.sendmail(emailout, emailin, msg.as_string())
connect.quit()

Вывод print :

Content-Type: multipart/mixed; boundary="===============2112037152=="
MIME-Version: 1.0
Subject: =?utf-8?Q?=D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B9=20=D0=B4=D0=B5=D0=BD=D1=8C=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=B2=D0=B8=D1=87?=
From: =?utf-8?Q?=D0=98=D1=80=D0=B8=D0=BD=D0=B0=20=D0=A4=D0=B5=D0=B4=D0=BE=D1=80=D0=BE=D0=B2=D0=BD=D0=B0?=  <some@test.ru>
To: =?utf-8?Q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=B2=D0=B8=D1=87?=  <some2@test.ru>

--===============2112037152==
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

0JTQvtCx0YDRi9C5INC00LXQvdGMLgogINCt0YLQviDRgtC10YHRgtC+0LLQvtC1INC/0LjRgdGM
0LzQvi4K0J/QvtC20LDQu9GD0LnRgdGC0LAsINC90LUg0L7RgtCy0LXRh9Cw0LnRgtC1INC90LAg
0L3QtdCz0L4u

--===============2112037152==--
Сравнение списков
#К примеру, при получение списков из SQL запоса
MySQLWords = list(MyCursor.fetchall())
LiteWords = LiteCursor.fetchall()

TestList = list(set(LiteWords).difference(MySQLWords))
for i in TestList :
    print("have LiteWords > " + str(i))

TestList = list(set(MySQLWords).difference(LiteWords))
for i in TestList:
    print("have MySQLwords < " + str(i))
Python3 to exe

http://cx-freeze.sourceforge.net/

cd .
del dist\*.* /Q
call cxfreeze "С:\script.py" --base-name=Win32GUI --target-dir dist
pause
Вопрос: Существует ли портативный Python?
Организовать работы программы с использованием .exe для запуска .py с использованием портативного python?
Инсталяция библиотек в портативном питоне? 

Python и кодировка

python3

16ти ричные значения windows-1251
16ти ричные значения utf8 для кирилицы
еще не прочитал
Значения могут быть в 16ти ричном значение или ввиде символов.

>>> var = "Привет"
>>> var   # Строка хранится в виде символов utf-8
'Привет'
>>> type(var)
<class 'str'>
>>> var.encode() #по умолчанию utf-8 # Перекодируем строку из символьнного вида в 16ти ричные значения. (Буква 'П' имеет 16 ричное значение d0 9f)
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
>>> var.encode('windows-1251') # Конвертируем символьные значения utf-8 в 16ти ричные значения windows-1251 (Буква 'П' имеет 16 ричное значение cf)
b'\xcf\xf0\xe8\xe2\xe5\xf2'

Из байткода, в символы.
>>> BiteUTFVAR = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
>>> BiteCP1251VAR = b'\xcf\xf0\xe8\xe2\xe5\xf2'
>>> type(BiteUTFVAR)
<class 'bytes'>
>>> BiteUTFVAR.decode() #по умолчанию utf-8
'Привет'
>>> BiteCP1251VAR.decode('cp1251')
'Привет'
>>> BiteUTFVAR.decode('cp1251') #Попытка декодировать 16ричный байткод UTF-8 в windows-1251 выдаст стандартные "краказябры"
'Привет'

>>> BiteCP1251VAR.decode('utf-8') #Попытка декодировать 16ричный байткод windows-1251 в UTF-8 символы, вернет ошибку:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xcf in position 0: invalid continuation byte

>>> BiteCP1251VAR.decode('cp1251').encode('utf-8')# Конвертируем 16ричный байткод windows-1251 в 16ричный байткод windows-1251
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

>>> BiteUTFVAR.decode('utf-8').encode('cp1251') # Конвертируем 16ричный байткод UTF-8 в 16ричный байткод windows-1251
b'\xcf\xf0\xe8\xe2\xe5\xf2'
  1. Конвертировать символы из одной кодировки в другую: Помещаем строку в символьные значение(преобразуем из 16ричного значения в символы) и кодируем в необхадимую кодировку с использование .encode('cp1251')
#добавить, символьное utf8 в символьное cp1251 и наоборот
#Узнать байкод символьной переменной
Ошибка: UnicodeEncodeError: 'ascii' codec can't encode character

sys.stdout.encoding
http://www.macfreek.nl/memory/Encoding_of_Python_stdout

/usr/local/bin/python3.2
>>> import sys
>>> sys.stdout.encoding
'US-ASCII'

/usr/bin/env LANG=ru_RU.UTF-8 /usr/local/bin/python3.2
>>> import sys
>>> sys.stdout.encoding
'UTF-8'

Python2

Конвертируем UTF-8 в CP1251
>>> utf8 = 'Привет'
>>> utf8
'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
>>> uni = utf8.decode('utf8')
>>> utf8.decode('utf8')
u'\u041f\u0440\u0438\u0432\u0435\u0442'
>>> uni.encode('cp1251')
'\xcf\xf0\xe8\xe2\xe5\xf2'

http://boodebr.org/main/python/all-about-python-and-unicode

Как CGI

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys
import cgitb
import cgi
cgitb.enable()

b = "<br />"

print "Content-Type: text/html; charset=utf-8"
print ""
print """<html>
<body>
<form method="post">
    FIO:  <input type="text" name="fio" /><br />
    <input type="submit" name="submit" value="Search" />
</form><br />
"""

form = cgi.FieldStorage()
SearchFIO = form.getfirst("fio", "")    # This way it's safe.

if SearchFIO:
	print "<h1>Your name:"
	print SearchFIO
	print "</h1>"
	sys.exit()

Отношение 2ух чисел

#!/usr/bin/python2.7
from pprint import pprint

cpplan = 100
cp = 400

bad_cp_plan = 0
bad_cp = 0

def ratio_num(big, small):
	res = 0
	if big > 1 and small > 1:
		res = float(big) / float(small) * 100
	return int(res)

pprint(ratio_num(cpplan, cp))
pprint(ratio_num(cp, cpplan))
pprint(ratio_num(bad_cp_plan, cp))
pprint(ratio_num(bad_cp_plan, bad_cp))
pprint(ratio_num(cp, bad_cp_plan))
pprint(ratio_num(bad_cp, bad_cp_plan))

Рекурсивная string to unicode

def recursive_str_to_unicode(target):
    """
    recursive function for convert all string in dict, tuple and list to unicode
    """
    pack_result = []

    if isinstance(target, dict):
        level = {}
        for key, val in target.iteritems():
            ukey = recursive_str_to_unicode(key)
            uval = recursive_str_to_unicode(val)
            level[ukey] = uval
        pack_result.append(level)
    elif isinstance(target, list):
        level = []
        for leaf in target:
            uleaf = recursive_str_to_unicode(leaf)
            level.append(uleaf)
        pack_result.append(level)
    elif isinstance(target, tuple):
        level = []
        for leaf in target:
            uleaf = recursive_str_to_unicode(leaf)
            level.append(uleaf)
        pack_result.append(tuple(level))
    elif isinstance(target, str):
        return as_unicode(target)
    else:
        return target

    result = pack_result.pop()
    return result


def as_unicode(string):
    return same_string_type_as(u"", string)


def same_string_type_as(type_source, content_source):
    if isinstance(type_source, str) and isinstance(content_source, unicode):
        return content_source.encode("utf-8")
    elif isinstance(type_source, unicode) and isinstance(content_source, str):
        return content_source.decode("utf-8")
    else:
        return content_source

        
if __name__ == '__main__':
    test_obj = {str('a'): [str('test'), str('some')], str('b_key'): 'b_val'}
    print repr(test_obj)
    print repr(recursive_str_to_unicode(test_obj))

Удаление из массива

worker1 = dict(message_id='1', worker_id='1')
worker2 = dict(message_id='2', worker_id='2')
worker3 = dict(message_id='3', worker_id='3')
worker4 = dict(message_id='4', worker_id='4')
worker5 = dict(message_id='1', worker_id='1')
worker6 = dict(message_id='1', worker_id='1')
worker7 = dict(message_id='1', worker_id='1')
worker8 = dict(message_id='1', worker_id='1')

s = [worker1, worker2, worker3, worker4, worker5, worker6, worker7, worker8]

for val in s[:]:
    print 'value: %s' % val
    if '1' == val.get('message_id'):
        s.remove(val)

Модули в одну строку

pydoc modules  | tr ' ' '\n' | grep -v '^$'

Factory

# -*- coding: utf-8 -*-

from __future__ import unicode_literals


class RequestFactory(object):

    _instance = None

    def __init__(self, name):
        print '__init__'
        # print 'Before name: %s' % repr(self.name)
        if hasattr(self, 'name'):
            print 'Before name: %s' % repr(self.name)
        self.name = name
        print 'After name: %s' % repr(self.name)


    def __new__(cls, *args, **kwargs):
        print '__new__'
        if not cls._instance:
            cls._instance = super(RequestFactory, cls).__new__(cls, *args, **kwargs)
        return cls._instance


if __name__ == '__main__':
    s1 = RequestFactory('Alice')
    s2 = RequestFactory('Patric')

    if id(s1) == id(s2):
        print "Same"
    else:
        print "Different"
from pprint import pprint
def request(*args, **kwargs):
    pprint(args)  # tuple
    pprint(kwargs) # dict
    for count, thing in enumerate(args):
        print '---args'
        print '{0}. {1}'.format(count, thing)
    for name, value in kwargs.items():
        print '---kwargs'
        print '{0} = {1}'.format(name, value)

debug func

def dd(*args, **kwargs):
    for count, thing in enumerate(args):
        print '============= %s =============' % repr(thing)

    for name, value in kwargs.items():
        print '%s: %s' % (name, repr(value))

urls

http://www.scotttorborg.com/python-packaging/ - организация кода по методу пакетов

Discussion

Constantin Conovaloff, 2014/09/23 12:51

Exception reraise:

class MyException(Exception):
    def __init__(self, message, code):
        Exception.__init__(self, message, code)
        self.message = message
        self.code = code
    def voice(self):
        print 'myException with message:', self.message

def testEx():
    raise MyException('myText', 42)

def sub_code():
    try:
        testEx()
    except MyException as e:
        print '--- sub code exception:'
        print repr(e)
        raise MyException
    except Exception as e:
        print 'Have native Exception'

def main_code():
    try:
        sub_code()
    except Exception as e:
        print '--- main code exception:'
        print repr(e)
        print e.message
        print e.code
        e.voice()

main_code()

Вывод:

--- sub code exception:
MyException('myText', 42)
--- main code exception:
TypeError('__init__() takes exactly 3 arguments (1 given)',)
__init__() takes exactly 3 arguments (1 given)
Traceback (most recent call last):
  File "myfile.py", line 33, in <module>
    main_code()
  File "myfile.py", line 30, in main_code
    print e.code
AttributeError: 'exceptions.TypeError' object has no attribute 'code'
Constantin Conovaloff, 2014/10/01 21:45

http://farmdev.com/talks/unicode/ - unicod и проблемы с кодировками

Constantin Conovaloff, 2014/10/19 18:48

http://docs.openstack.org/developer/hacking/ - openstack стиль кода

Constantin Conovaloff, 2014/11/28 12:55

variable to file

import subprocess, time, os
subprocess.Popen(['touch /tmp/var.log'], shell=True)
subprocess.Popen(['chmod 666 /tmp/var.log'], shell=True)
proc = subprocess.Popen(['id'], shell=True, stdout=subprocess.PIPE)
some = proc.stdout.read()
ff = open('/tmp/var.log', 'a')
ff.write('-------\nCONCON-Execute:\nid: %s\n %s' % (repr(nid), repr(some)))
ff.close()
Constantin Conovaloff, 2014/12/26 14:36

traceback to variable

        try:
            some_command()
        except Exception as e:
            import traceback
            ff = open('/tmp/some', 'a')
            ff.write('Exception: ' + repr(e.message) + '\ntraceback: ' + repr(traceback.format_exc()))
            ff.close()

            #Or:
            traceback.print_exc(file=open("/tmp/some","a"))
Constantin Conovaloff, 2015/01/30 17:00

mysqldb и escape

http://www.slideshare.net/openpbs/sql-injection-defense-in-python – используем cursor.execute('select some from some where some = %s', (var, ))

Constantin Conovaloff, 2015/02/13 22:34

multiline with variable

"This is an {example} with {vars}".format(vars="variables", example="example")
>>> d = { 'vars': "variables", 'example': "example" }
>>> s = "This is an {example} with {vars}"
>>> s.format(**d)



s = """
I'm will %s there
I will go %s
%s
""" % (string1, string2, string3)
message = """
          Hello, %(foo)s
          Sincerely, %(bar)s
          """ % {'foo': 'John', 'bar': "Doe"}
Constantin Conovaloff, 2015/03/25 19:43

echo server

#!/usr/bin/python

import threading
import time
import SocketServer

host = ''

port_list = [
    666, 667, 669
]

log_file = open('/tmp/log_server', 'a')


class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        data = self.request.recv(1024).strip()
        print "%s wrote: " % self.client_address[0]
        print data
        self.request.send(data.upper())


class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

if __name__ == "__main__":

    for port in port_list:
        server = ThreadedTCPServer((host, port), ThreadedTCPRequestHandler)
        server_thread = threading.Thread(target=server.serve_forever)
        server_thread.setDaemon(True)
        server_thread.start()

    while 1:
        time.sleep(1)
Constantin Conovaloff, 2015/04/06 13:03

DeadLock при форке

http://bugs.python.org/issue6721
http://bugs.python.org/issue874900

#!/usr/bin/python

import os, sys, threading, time

class ThreadStuff(threading.Thread):
  def __init(self):
    print "ThreadStuff: init"
    threading.Thread.__init__(self)

  def start_doing_stuff(self):
    self.start()

  def run(self):
    print "ThreadStuff: running (rlock = %s)" % global_rlock

    global_rlock.acquire()
    print "ThreadStuff: I OWN THE LOCK"
    time.sleep(5)
    global_rlock.release()
    print "ThreadStuff: dropped it.  Sleeping forever"
    time.sleep(86400)

# ---

global_rlock = threading.RLock(verbose=True)

ts = ThreadStuff()
ts.start()

time.sleep(1)
print "forking"
pid = os.fork()
if pid:
  print "parent: running (rlock = %s)" % global_rlock
else:
  print "child: running (rlock = %s) getting the lock..." % global_rlock
  global_rlock.acquire()
  print "child: got the lock"
  sys.exit(0)

time.sleep(10)

Вывод

# python /home/conovaloff/PycharmProjects/amqpPackage/test.py
ThreadStuff: running (rlock = <_RLock owner=None count=0>)
Thread-1: <_RLock owner='Thread-1' count=1>.acquire(1): initial success
ThreadStuff: I OWN THE LOCK
forking
parent: running (rlock = <_RLock owner='Thread-1' count=1>)
child: running (rlock = <_RLock owner=139868846089984 count=1>) getting the lock...


Thread-1: <_RLock owner=None count=0>.release(): final release
ThreadStuff: dropped it.  Sleeping forever

... бесконечно

Strace порожденного, зависшего процесса:

# strace -p 27428
Process 27428 attached
futex(0x100ae80, FUTEX_WAIT_PRIVATE, 0, NULL) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGWINCH {si_signo=SIGWINCH, si_code=SI_KERNEL} ---
futex(0x100ae80, FUTEX_WAIT_PRIVATE, 0, NULL 

через kill -15 выходит

Constantin Conovaloff, 2015/04/06 14:03

Включение логирования

import logging
logging.basicConfig(level=logging.DEBUG)

add path include

import os, sys
sys.path.insert(0, os.getcwd())
Constantin Conovaloff, 2015/04/06 17:31

Асинхронная RPC

Ребята с freenode#python подсказали посмотреть в сторону dbus(сомнительно) и AMP(который является частью twisted)

Constantin Conovaloff, 2015/04/07 04:33

Немного дебага объектов (вывод его полей)

import types

def dump_obj(obj, level=0):
    for a in dir(obj):
        try:
            if type(obj.__dict__[a]) == types.InstanceType:
                dump_obj(obj.__dict__[a], level + 2)
            else:
                try:
                    print " " * level + "%s -> %s" % (a, obj.__dict__[a])
                except:
                    pass
        except:
            pass
Constantin Conovaloff, 2015/04/08 17:15

socket server

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

sock = socket.socket()
sock.bind(('', 1234))
sock.listen(1)
conn, addr = sock.accept()

print 'connected:', addr

while True:
    data = conn.recv(4096)
    print 'DATA:' + repr(data)
    if not data:
        break

conn.close()
Constantin Conovaloff, 2015/04/10 22:45

http://pep8.ru/doc/tutorial-3.1/ – классный сайт, классные учебники.

Constantin Conovaloff, 2015/04/11 19:52
>>> 1 > 2 == False
False
>>> 1 > (2 == False)
True
>>> (1 > 2) == False
True

Есть предположение:

1 > 2 == False => (1 > 2) && (2 == False)
как
3 > 2 > 1 == (3 > 2) && (2 > 1) 
Constantin Conovaloff, 2015/04/17 16:25

property

class Event():
    def __init__(self, event_type):
        self.event_type = event_type

    @property
    def event_type(self):
        return self.event_type

    @event_type.setter
    def event_type(self, value):
        self.event_type = value
    
    @event_type.deleter
    def event_type(self):
        del self.event_type
Constantin Conovaloff, 2015/05/07 13:46

timeout working on yeild

import time


def my_timeout(seconds):
    print 'start yielding'

    time_end = time.time() + seconds

    while True:
        yield time.time() < time_end

timeout_obj = my_timeout(3)

while timeout_obj.next():
    print 'sleep'
    time.sleep(1)
Constantin Conovaloff, 2015/06/04 15:20

запуск программы с переходом в интерактивный режим

TODO: через написание программы с глобальными переменными и импорт и запуск его через интерактивный режим с возвратом управления в случае ожидаемого события.

import beget_amqp

some = '1'


def start_test():
    print 'start test'
    global some
    some = '2'
Constantin Conovaloff, 2015/06/04 17:59

template

>>> jinja2.Template("""Users on this page: {{ my_variable|default('my_variable is not defined') }}""").render()
u'Users on this page: my_variable is not defined'

>>> jinja2.Template("""Users on this page: {{ my_variable|default('my_variable is not defined') }}""").render({'my_variable': 'some'})
u'Users on this page: some'

>>> jinja2.Template("""Users on this page: {{ users|map('lower')|join(', ') }}""").render({'users': ('sOmE', 'SOME2')})
u'Users on this page: some, some2'
>>> def cfunc(name='None'):
...   return 'myNameIs:' + name
>>>
>>> jinja2.Template(""" Some {{ cfnc() }} """).render({'cfnc': cfunc})
u' Some myNameIs:None '

>>> jinja2.Template(""" Some {{ cfnc(myname) }} """).render({'cfnc': cfunc, 'myname': 'Petya'})
u' Some myNameIs:Petya '
>>> env = jinja2.Environment('whatever')
>>> env.filters['cfunc'] = cfunc
>>> env.from_string(""" Some {{ myname|cfunc }} """).render({'myname': 'SomerTime'})
u' Some myNameIs:SomerTime '
Constantin Conovaloff, 2015/06/15 16:35

правильная работа с файлами

Вместо:

      config_file_obj = open(config_full_path, 'w')
      config_file_obj.write(config_plain_result)
      config_file_obj.close()

используем:

      with open(config_full_path, 'w') as config_file_obj: 
          config_file_obj.write(config_plain_result)

потому что:

  1. даже если будет исключение, дескриптор все равно будет закрыт.
  2. close будет автоматически при выходе из блока (меньше строк, больше надежности)
Constantin Conovaloff, 2015/06/23 21:00

Re-raising Exceptions

Constantin Conovaloff, 2015/06/23 21:00

safe change file

      tempo_config_name = None
      try:
          # пишем tmp файл
          with tempfile.NamedTemporaryFile('w', dir=os.path.dirname(php_ini_local_path_absolute), delete=False) \
                  as tempo_config:
              tempo_config_name = tempo_config.name
              tempo_config.write(result)
          # переименовываем в новый файл
          os.rename(tempo_config_name, php_ini_local_path_absolute)
      except:
          # если возникли проблемы, проверяем что tmp файл удален
          if tempo_config_name is not None and os.path.isfile(tempo_config_name):
              os.remove(tempo_config_name)
          raise
Constantin Conovaloff, 2015/07/04 02:09

wrapper (decorator)

def wrapp(fn):
    def wrapped(self):
        print 'before execute'
        fn(self)
        print 'after execute'
    return wrapped


class Some():

    @wrapp
    def start(self):
        print 'do work on Some'

s = Some()
s.start()
before execute
do work on Some
after execute
Constantin Conovaloff, 2015/07/14 19:21

sqlite, mysql -- select to dict

Mysql
cursor = conn.cursor (MySQLdb.cursors.DictCursor)
Sqlite
import sqlite3

con = sqlite3.connect(":memory:")
con.row_factory = sqlite3.Row

cur = con.cursor()
cur.execute("select 'John' as name, 42 as age")
for row in cur:
    assert row[0] == row["name"]
    assert row["name"] == row["nAmE"]
    assert row[1] == row["age"]
    assert row[1] == row["AgE"]

sqlite, mysql -- escape

Mysql
Sqlite
sqlite_cursor.execute('SELECT * FROM some WHERE domain = :some_domain', {'some_domain': "some.ru"})
Constantin Conovaloff, 2015/07/15 18:21

Почему в python2 не следует использовать utf8

При использование sqlite:

    path_dir_log = row_path_log[u'log_path']
IndexError: Index must be int or string

При использование open: он открывает файл в str и если в нем есть кирилица и ты попробуешь добавить к нему text_plain += u'some', то получишь ошибку

Constantin Conovaloff, 2015/07/21 22:13

logging not safe for multiprocessing

import threading
import time
import logging
from multiprocessing import Process


def process():
        logging.info('I am process')
        time.sleep(10)


def worker():
        """thread worker function"""
        logging.info('Worker')
        p = Process(target=process)
        p.start()
        p.join()
        return

logging.basicConfig(level=logging.INFO)
logging.info("Starting")

threads = []
for i in range(5):
    t = threading.Thread(target=worker)
    threads.append(t)
    logging.info("Starting thread...")
    t.start()
Constantin Conovaloff, 2015/07/28 16:26

debug (trace running process) with pyringe

https://github.com/google/pyringe

Starting

python -m pyringe
Constantin Conovaloff, 2015/07/29 18:19

Прочитать

Constantin Conovaloff, 2016/07/04 22:32

самые популярные репозитории

You could leave a comment if you were logged in.
python.txt · Last modified: 2015/05/20 15:30 by conovaloff

Page Tools