понедельник, 8 июня 2015 г.

python: замеряем время выполнения блока

time.time

Очень простой и вполне рабочий метод на базе time, работает даже во 2 питоне (в 3 есть ещё несколько функций в модуле, с бОльшей точностью)

вторник, 2 июня 2015 г.

python: многопоточность

Есть 2 модуля, схожие по названиям и функциям, но работающие чуть по разному, это
threading.Thread
и
multiprocessing.Process

Но threading создаёт нить внутри процесса (количество процессов не меняется), а mp - создаёт новый процесс.

https://docs.python.org/2/library/threading.html
https://docs.python.org/2/library/multiprocessing.html

В остальном использование довольно простое, делаем инстанс класса, start и при необходимости join

понедельник, 1 июня 2015 г.

Python: пишем в syslog

Хороший стартовый пример
https://gist.github.com/sweenzor/1782457

123456789101112131415161718192021
import logging
import logging.handlers
 
log = logging.getLogger(__name__)
 
log.setLevel(logging.DEBUG)
 
handler = logging.handlers.SysLogHandler(address = '/dev/log')
 
formatter = logging.Formatter('%(module)s.%(funcName)s: %(message)s')
handler.setFormatter(formatter)
 
log.addHandler(handler)
 
 
def hello():
log.debug('this is debug')
log.critical('this is critical')
 
if __name__ == '__main__':
hello()

123
matt@Jenkins:~$ tail -n 2 /var/log/syslog
Feb 9 11:56:19 Jenkins logtest.hello: this is debug
Feb 9 11:56:19 Jenkins logtest.hello: this is critical

Нюансы.
Для SysLogHandler обязателен адрес, у линукса /dev/log, у macos что-то вроде /var/run/syslog, надо уточнять.

Также можно сделать так
handler = logging.handlers.SysLogHandler(address = ('localhost',514), facility=19)
и тут localhost можно заменить на удаленный хост, хотя лучше поручить пересылку логов тому же rsyslog

Также есть менее удобный модуль syslog
import syslog
syslog.openlog( 'myTestLog', 0, syslog.LOG_LOCAL4 )
syslog.syslog( '%%TEST-6-LOG: Log msg: %s' % 'test msg' )

Ну и напоследок интересный линк
http://help.papertrailapp.com/kb/configuration/configuring-centralized-logging-from-python-apps/

понедельник, 25 мая 2015 г.

python: 7 способов получить hostname

Все работают в линуксе, но далеко не все - в винде. Плюс в ряде случаев hostname и hostname -f могут не совпадать, надо проверить, что лучше подойдёт.

1) import os; print os.uname()[1]
2) import platform; print platform.uname()[1] - как 1, но более универсален, работает и в винде
3) import platform; print platform.node()
4) import socket; print socket.gethostname() (подвид: socket.gethostbyaddr(socket.gethostname())
5) import socket; print socket.getfqdn() - 4 и 5 как раз могут дать разные результаты
6 и 7) - совсем костыльные решения, os.getenv('HOSTNAME') и os.environ['HOSTNAME']

До кучи - есть всякие os.system() и os.popen(), но это совсем костыли и даже не стоят упоминания.

линки
https://wiki.python.org/moin/Powerful%20Python%20One-Liners/Hostname
http://stackoverflow.com/questions/20792499/how-to-get-fully-qualified-host-name-in-python
http://stackoverflow.com/questions/4271740/how-can-i-use-python-to-get-the-system-hostname

вторник, 19 мая 2015 г.

python и рекурсивная работа с файлами

1) os.listdir
import os
for filename in os.listdir(os.getcwd()):
if filename.endswith(".txt"):
print(os.path.join(root, file))

2) os.walk
import os
for root, dirs, files in os.walk(yourpath, topdown=False):
    for name in files:
        print(os.path.join(root, name))
        stuff
    for name in dirs:
        print(os.path.join(root, name))
        stuff

3) glob
import glob
for filename in glob.glob('*.txt'):
...

http://stackoverflow.com/questions/18262293/python-open-every-file-in-a-folder
http://stackoverflow.com/questions/3964681/find-all-files-in-directory-with-extension-txt-with-python

среда, 28 января 2015 г.

lua: получить размер файла

=========== funcs.lua
function fsize (file)
        local current = file:seek()      -- get current position
        local size = file:seek("end")    -- get file size
        file:seek("set", current)        -- restore position
        return size
end
=========== checklibs.lua
dofile("funcs.lua")

libs_file = io.open("librt.so.0","r")
print(fsize(libs_file))
libs_file:close()
===========

http://lua-users.org/lists/lua-l/2011-04/msg00785.html

Вероятный оригинал
http://www.lua.org/pil/21.3.html

В таком виде и гуляет функция fsize, даже с nginx связали
https://gist.github.com/perusio/2133228
location ~* \.(?:gif|jpe?g|png)$ {
set_by_lua $img_file_size '
function fsize (file)
local current = file:seek() -- get current position
local size = file:seek("end") -- get file size
file:seek("set", current) -- restore position
return size
end
fsize(ngx.var.request_filename)';
}