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

четверг, 4 декабря 2008 г.

Python 3.0 (a.k.a. "Python 3000" or "Py3k")

Релиз Python 3.0 доступен для скачивания с оф. сайта.

Не совместим с веткой 2.x

Python 3.0 (a.k.a. "Python 3000" or "Py3k") is a new
version of the language that is incompatible with the 2.x line of
releases. The language is mostly the same, but many details,
especially how built-in objects like dictionaries and strings work,
have changed considerably, and a lot of deprecated features have
finally been removed. Also, the standard library has been reorganized
in a few prominent places.
Из новых возможностей Python 3.0 можно отметить:
  • Нарушение обратной совместимости со скриптами, разработанными для более ранних версий Python;
  • Удаление дублирующих конструкторов и модулей;
  • Вместо оператора форматирования строк "%" использована глобальная функция и метод format(), например "The story of {0}, {1}, and {c}".format(a, b, c=d) или print(format(10.0, "7.3g")).
  • Удалены методы dict.iterkeys(), dict.itervalues() и dict.iteritems(). Методы dict.keys(), dict.values() и dict.items() будут возвращать контейнер объектов (итератор);
  • Возможность аннотирования параметров функций и возвращаемых значений, например def compile(source: "something compilable").
  • Замена оператора print, который широко используется для вывода, на функцию print();
  • Использование Unicode в качестве основной кодировки представления строк (единый тип str, вместо раздельных str и unicode);
  • Для хранения бинарных данных представлен тип bytes;
  • Тип long переименован в int, деление int переменных возвращает float, для получения целого результата нужно использовать //;
  • Для обозначения неравенств, вместо "<>" нужно будет использовать "!=";
  • Признаны устаревшими модули: cPickle, imageop, audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing, xmllib, new;
  • Удалены функции os.tmpnam(), os.tempnam() и os.tmpfile(), вместо них нужно использовать модуль tempfile;
  • Все исключения теперь должны порождаться от класса BaseException;
  • Новый синтаксис для создания мета-классов (Metaclass), реализация абстрактных базовых классов (Abstract Base Class), возможность использования декораторов для классов;
  • Новая реализация библиотеки ввода/вывода, имеющая обратно совместимый API ;
Источник...

среда, 24 сентября 2008 г.

Python + ODBC

Вот даже и не ожидал, что в стандартной поставке Python в (K)ubuntu 8.04 нет модуля для работы с ODBC. Немного погуглив обнаружил, что библиотек поддержки ODBC, по большому счету, всего две: mxODBC (платная) и pyodbc.
Выбрал pyodbc. Исходники можно скачать с сайта http://sourceforge.net/project/showfiles.php?group_id=162557, последняя версия pyodbc-2.0.58. Документация находится на сайте проекта http://pyodbc.sourceforge.net/docs.html. Библиотека поддерживает python DB API.
Скачанный архив распаковываем во временный каталог, переходим в него и собираем командой:

python setup.py build

И в подкаталоге build/lib.linux-i686-2.5 находим файл библиотеки - pyodbc.so.
Этот файл кладем в каталог проекта и можем работать с ODBC.

Пример:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyodbc
con=pyodbc.connect("DSN=ContactOnLine;UID=user;PWD=passwd")
rows=cur.execute("select * from DOCS")
for row in rows:
print row.PP_CODE, row.PAYER.decode('cp1251'), row.GROUND.decode('cp1251')
con.close()

четверг, 14 февраля 2008 г.

Программирование на Python+Qt для начинающих

Нашел на хабре статью, дающую начальные знания программирования GUI приложений на Python в связке с Qt.
Это руководство нацелено на получение представления о том как писать маленькие приложения на python, использующие библотеку Qt.

Для успешного выполнения всех заданий необходимо иметь базовые знания python, однако, Qt знать не обязательно. Я использую linux в этих примерах и я предполагаю, что вы уже имеете работающий Python и PyQt.
Читать дальше...

суббота, 9 февраля 2008 г.

PHP XML-RPC server, Python XML-RPC client

Стоит задача, поднять web-сервис на защищенном (HTTPS) канале.

Технологий web-сервисов в принципе две: SOAP и XML-RPC. SOAP - тяжелая и замороченная, предназначена для крупных проектов, пока еще не окончательно стандартизована. XML-RPC легкая и полностью стандартизована, построена на использовании XML формата передачи данных между клиентом и сервером по HTTP протоколу. PHP5 поддерживает обе технологии. В дерево исходников PHP5 входит одна из реализаций библиотеки XML-RPC, написанной на С. Правда документация крайне скудная, но разобраться можно.

XML-RPC server:

1. Определяем функции, которые будут доступны клиенту. Для примера напишем функцию сложения двух чисел:
function srvAdd($MethodName, $Params, $AppData)
{
return $Params[0]+$Params[1];
}
Любая функция, регистрируемая на xml-rpc сервере, должна принимать 3 параметра:

$MethodName - внешнее имя функции;
$Params - массив параметров, передаваемых клиентом;
$AppData - дополнительные параметры, передаваемые при вызове функции xmlrpc_server_call_method().

2. Создаем XML-RPC сервер вызовом функции

srv=xmlrpc_server_create();

3. Регистрируем на сервере, определенные ранее функции

xmlrpc_server_register_method($srv, "Add", "srvAdd");

Здесь:
Add - внешнее имя функции srvAdd,
srv - handler сервера.

4. Получаем "сырой" запрос от клиента

$xmlRequest = $HTTP_RAW_POST_DATA;

5. Передаем запрос в диспетчер функций, который автоматически определит какую функцию вызвать.

$response = xmlrpc_server_call_method($srv, $xmlRequest, Null);

Здесь:
$srv - handler xml-rpc сервера;
$xmlRequest - данные от клиента в xml-формате;
Третий параметр, в данном случае пустой, передает дополнительные данные для определенных ранее функций (параметр $AppData).

6. Отдаем клиенту результаты работы функции

print $response;

7. Закрываем сервер.

xmlrpc_server_destroy($srv);

Приведу весь код xml-rpc сервера в котором клиенту доступны несколько функций:


function About($MethodName, $Params, $AppData)
{
$sAbout="ekXMLRPCServer Class v0.9.5\n (c) 2008 Klek\n Author: Eugene Klepikov\n Email: ";
return $sAbout;;
}
//-----------------------------------------------------------------------------
class ekXMLRPCServer
{
private $srvh=null;
private $xmlRequest="";
private $response="";
private $about="";
private $help="";
private $userData=null;
private $arOutOptions=array(
"output_type" => "xml",
"verbosity" => "pretty",
"escaping" => array("markup", "non-ascii", "non-print"),
"version" => "xmlrpc",
"encoding" => "iso-8859-1"
//"encoding" => "utf-8"
);
//-----------------------------------------------------------------------------

function __construct()
{
$this->srvh=xmlrpc_server_create();
$this->registerMethod("system.about", "About");
$this->registerMethod("help", "help");
}
//-----------------------------------------------------------------------------

function __destruct()
{
xmlrpc_server_destroy($this->srvh);
}
//-----------------------------------------------------------------------------

function registerMethod($methodName, $functionName)
{
xmlrpc_server_register_method($this->srvh, $methodName, $functionName);
}
//-----------------------------------------------------------------------------

function request($Request)
{
$this->xmlRequest=$Request;
}
//-----------------------------------------------------------------------------

function run()
{
$this->response=xmlrpc_server_call_method($this->srvh, $this->xmlRequest, $this->userData, $this->arOutOptions);
print $this->response;
}
//-----------------------------------------------------------------------------
}

Поместим файл с кодом xml-rpc сервера в защищенный каталог apache, чтобы к нему можно было коннесктится через SSL https://www.mydomain.ru/xmlrpcserver.php

XML-RPC Client

Клиента проще всего написать на Python, т.к. все нужные библиотеки уже есть в стандартной поставке.

>>> import xmlrpclib
>>> server = xmlrpclib.Server("https://www.mydomain.ru/xmlrpcserver.php")

Теперь можно вызывать функции сервера.

>>> server.Add('10', '15')
>>> 25
>>>

Функции Array() и Dict() различаются типом возвращаемого массива.

>>> server.Array("Peter")
>>>['Peter', 'Hello, Peter. How are you today?']

Array() возвращает список.

>>> server.Dict("Peter")
>>>{'name': 'Peter', 'greeting': 'Hello, Peter. How are you today?'}

Dict() возвращает словарь, т.к. в реализации функции мы использовали именованный массив.

XML-RPC сервер имеет и несколько встроенных функций, одна из которых
>>>server.system.listMethods()
>>>['system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.describeMethods', 'system.multiCall', 'system.getCapabilities', 'Uptime', 'Array', 'Dict', 'Add']

возвращает список всех доступных на сервере функций.

Замечания:

1. В питоновских библиотеках xmlrpclib, urllib, httplib не предусмотрена проверка сертификата сервера.

2. Для работы с библиотекой XML-RPC в PHP5 нужно поставить модуль php5-xmlrpc из репозитария дистрибутива или, при самостоятельной сборке, добавить к команде configure параметр --with-xmlrpc[=DIR].

вторник, 15 января 2008 г.

Удаляем старые файлы и каталоги

Наверно всем известно, что свободное дисковое пространство стремительно заполняется всякой ерундой. На одном из моих серверов, по просьбе трудящихся, был создан каталог, в который эти самые трудящиеся (в основном отдел маркетинга) клали свои файлы и давали на них ссылки своим контрагентам. Мою просьбу, периодически чистить каталог, все успешно игнорировали. Нужно было что-то делать с этой файловой помойкой. После недолгих размышлений я написал на Python программку, которая и занимается зачисткой.
Все заинтересованные были предупреждены, что файлы и директории, пролежавшие на сервере больше 30 дней будут удалены. Но есть и постоянные директории, которые не должны удалятся.
Программка вызывается по crontab ежедневно.


#!/usr/bin/env python
# -*- coding: utf8 -*-
#----------------------------------------------------------------------------
# Name: delexpfile.py
# Version: 1.0.4
# Purpose: Delete expired files in directory.
#
# Author: Eugene Klepikov
# E-Mail: klek07@gmail.com
#
# Created: 10.01.2008
# Updated: 14.01.2008
# Copyright: (c) 2008 KlekFox
# Licence: GPL
#----------------------------------------------------------------------------
##
'''
Delete expired files in directory.
Run from cron daily.
'''
import sys, os, datetime
from stat import *
iExpDays=30
dtToday=datetime.date.today()
sPath="/www/files"
arExcludeDirs=('balances', 'prcenter', 'const')
#---------------------------------------------------------------------------
def ekDelExpFiles(Path):
dtFile=0
sPathFile=""
for file in os.listdir(Path):
sPathFile=os.path.join(Path, file)
dtFile=datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
#print "Path: ", sPathFile, dtFile.strftime("%d.%m.%Y")
if(os.path.isdir(sPathFile)):
if file in arExcludeDirs: continue
#print "Path is dir: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
ekDelExpFiles(sPathFile)
dtDiff=dtToday-dtFile
if(dtDiff.days > iExpDays):
try:
if(os.path.isdir(sPathFile)):
print "Delete Directory: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
os.rmdir(sPathFile)
else:
print "Delete File: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
os.unlink(sPathFile)
except OSError, msgError:
print msgError
return 0
#---------------------------------------------------------------------------
def main():
print "-----",dtToday.strftime("%d.%m.%Y"),"-----"
ekDelExpFiles(sPath)
return 0

if __name__ == '__main__' :
sys.exit( main() )
#----------------------------------------------------------------------------
#

Некоторые пояснения:
  • iExpDays - через сколько дней файл/директория считается устаревшим.
  • sPath - абсолютный путь к каталогу с файловой помойкой.
  • arExcludeDirs - список директорий, которые не должны обрабатываться.
  • dtToday - экземпляр класса date (пакет datetime), содержит текущую дату.
  • dtFile - экземпляр класса date (пакет datetime), содержит дату файла/директории.
dtDiff=dtToday-dtFile
dtDiff.days - содержит разницу в днях.

Была небольшая заморочка с датой файлов. В Linux, да и во всех *nix, файлы имеют несколько дат: дата создания, дата модификации, дата последнего доступа...
Модуль stat содержит предопределенные константы для работы с файлами:
  • ST_ATIME - дата последнего доступа к файлу.
  • ST_MTIME - дата последней модификации файла.
  • ST_CTIME - зависит от операционной системы: для юниксов содержит дату последнего изменения метаданных, а для виндов - дату создания файла.
Вопрос в том, какую дату использовать ST_CTIME или ST_MTIME?
Тестируя программу, я наткнулся на ситуацию, когда старые файлы не удалялись. Т.е. я создал тестовую директорию и в нее накидал файлов разной давности. Но они не удалялись... Вставил диагностические print-ы и увидел, что при использовании ST_CTIME все файлы датированы датой копирования в тестовую директорию?! При этом ls -l показывает правильную дату создания или модификации фалов. Таким образом для тестирования я использовал ST_MTIME. Но на боевом сервере было решено оставить ST_CTIME.

среда, 26 декабря 2007 г.

Вышел новый номер The Python Papers

Вышел новый номер бесплатного журнала The Python Papers

В номере:
  • Letter from the editor: Page 4
  • GrrlCamp: Page 6
  • News from the Python Software Foundation: Page 9
  • Interview with Michael Foord: Page 16
  • Screen Scraping Web Pages: Page 22
  • Interview with Resolver Systems: Page 24
  • Eight Tips for Starting with Python: Page 30
  • Python Events: Page 80
  • Acknowledgment of Reviewers: Page 34
  • pypk - A Python extension module to handle chemical kinetics in plasma physics modeling: Page 35
  • The Why and How for Design Patterns: Page 48
  • Python Switch Statement: Page 58
  • An Introduction to Test Driven Generation: Page 64.
Скачать...

суббота, 15 декабря 2007 г.

Основы работы с потоками в Python

Если вы желаете, чтобы ваше приложение выполняло несколько задач в одно и то же время, то можете воспользоваться потоками (threads). Python может работать с потоками, но много разработчиков находят программирование потоков очень сложным. Среди прочего Peyton McCullough объяснит как порождать и уничтожать потоки в этом популярном языке.

Читать...

четверг, 13 декабря 2007 г.

3D-программирование с Vpython

Vpython позволяет создавать 3D объекты и размещать их на 3D сцене. Vpython запускается в отдельном процессе (thread) и контролирует 3D сцену, программисту остается только писать логику программы. Пользователь, работая с такой программой, может перемещаться по сцене и масштабировать, поворачивать и перемещать объекты, используя мыша.
Модуль можно скачать с официального сайта http://vpython.org. В зависимостях у модуля: Numpy, gtkglarea и boost. Для пользователей Debian и Ubuntu в репозиториях уже есть пакет python-visual, который ставится стандартными средствами, например:

sudo aptitude install python-visual

Можно также поставить и модуль gamepy для музыкального оформления программы

sudo aptitude install gamepy

Теперь, по традиции, напишем программу, выводящую 3D "Hellow World"

from visual.text import *

# At present, VPython supports only numbers and uppercase characters. Other characters will be displayed as *
# Specifying the Title of the window
scene.title = "Hello World"
# Here goes the hello world text
text(pos=(0,3,0), string='HELLO WORLD', color=color.orange, depth=0.3, justify='center')

Вот как это должно выглядеть.



Теперь нарисуем синусоиду, естественно объемную

from visual import *

"""
This will print the sin curve
"""
scene.title = "Sin Curve"
scene.center = vector(0,0,0)

# using a suitable 'box' as x- axis
xaxis = box(length= 20, height=0.2, width= 0.5, color=color.blue)

#creating the sine curve object
sinecurve = curve( color = color.red, radius=0.2)
dt = 0.1

for t in arange(0,10,dt):
dydt = vector( t,sin(t), 0 );
sinecurve.append( pos=dydt, color=(1,0,0) )
rate( 500 )

Смотрим что получилось


Ее можно двигать мышкой.

Ну и более "живой" пример - 3D часы.

from visual.text import *
import time

scene.title = "3D Clock"
while 1:
rate(100)
cur_time = time.localtime()
time_string = str(cur_time[3]) +": "+ str(cur_time[4]) + ": "+ str(cur_time[5])
timer = text(pos=(-3,0,-2), string=time_string, color= color.red, depth=0.5 )
time.sleep(1)
timer.makeinvisible()




С помощью Vpython можно создавать RedBlue стерео-объекты, которые нужно смотреть в красно-синих очках (прямо как в "Дети шпионов 3"). Для включения стерео режима служит команда:

scene.stero='redblue'

Для примера, выведем анимированную стерео 3D-строку

from visual.text import *
import time

#importing pygame to play the background music :)
#import pygame
#Uncomment it if you have the redblue goggles
scene.stereo='redblue'

scene.title = "Renaissance"
#scene.fullscreen = 1
scene.fov = 0.001
scene.range = 0
rate(100)

# Uncomment this if you need to play the background music
#pygame.mixer.init()
#intromusic=pygame.mixer.Sound("/usr/share/sounds/KDE_Startup.wav")
#pygame.mixer.Sound.play(intromusic)

def intro():
Title= text(pos=(0,3,0), string='MCA PROUDLY PRESENTS', color=color.red, depth=0.3, justify='center')
for i in range(20):
rate(10)
scene.range = i
Title.makeinvisible()
scene.range = 0
Header= text(pos=(0,3,0), string='RENAISSANCE 2005', color=color.yellow, depth=0.3, justify='center')
for i in range(20):
rate(10)
scene.fov = 3
scene.range = i
# Now play with colors
Header.reshape(color= color.cyan)
time.sleep(1)
Header.reshape(color= color.blue)
time.sleep(1)
Header.reshape(color= color.green)
time.sleep(1)
Header.reshape(color=color.orange)
time.sleep(1)
Header.reshape(color= color.red)
# Now let's delete the Header
Header.makeinvisible()
scene.range = 10
scene.fov = 0.2
Body= text(pos=(0,3,0), string='A CELEBRATION OF LINUX ', color=color.red, depth=0.3, justify='center')
Body.reshape(color=color.orange)
#Here I am not adding the rest of the code as it just shows the schedule of that days programs
# Invoking intro()
if __name__ == '__main__':
intro()




Удачного программирования.
При написании данного поста использовалась статья в Linux Gazette #144

пятница, 30 ноября 2007 г.

Программирование метаклассов в Python

Большинство читателей уже знакомо с концепциями объектно-ориентированного программирования: наследованием, инкапсуляцией, полиморфизмом. Однако обычно при этом подразумевается создание объектов заданного класса с определенными родителями. С другой стороны, выясняется, что ряд новых программных конструкций оказывается легче или вообще возможно создавать, только если мы можем настраивать сам процесс создания объектов. Метаклассы открывают возможность определенных типов "аспект-ориентированного программирования", например, вы можете расширять классы новыми возможностями трассировки, сохранения объектов, протоколирования ошибок и т.д.
читать...

вторник, 30 октября 2007 г.

Python Magazine — October 2007

В начале Октября вышел очередной выпуск журнала для программистов на Python.
Этот выпуск интересен тем, что стал полностью бесплатным. Для закачки предлагается сам журнал в формате pdf и исходные коды примеров.

четверг, 29 марта 2007 г.

Тянем курсы валют с сайта ЦБ РФ

Сайт www.cbr.ru предоставляет несколько web-сервисов. Один из них - курс валют на определенную дату. Проверить можно так: http://www.cbr.ru/scripts/XML_daily.asp?date_req=29-03-2007.
Сервис возвращает XML-данные, которые и нужно парсить.
Собственно код на Python:


#!/bin/env python
# -*- coding: cp1251 -*-
#----------------------------------------------------------------------------
# Name: cbrroe.py
# Version: 1.0.8
#
# Get XML document from XML web-service www.cbr.ru,
# Parse it and insert into database.
#
# Purpose: CBR Rate of Exchange
#
# Author: Eugene Klepikov
# E-Mail: klek@comtv.ru
#
# Created: 14.04.2005
# Updated: 20.04.2005
# Copyright: (c) 2005 Klek
# Licence: GPL
#
# Set correct value sEncoding to your system encoding
#
#----------------------------------------------------------------------------
##
'''
Get XML document from XML web-service www.cbr.ru,
Parse it and insert into database.
'''
import sys
from time import localtime, strftime
import MySQLdb
import urllib
import xml.dom.minidom

sEncoding="cp1251"
dbServer="dbserver" # Name or IP MySQl server
dbName="DbName" # Data Base name
tblName="CBRExchange"
dbUser="user" # User name
dbPasswd="pass" # User password
#---------------------------------------------------------------------------
def ekGetInput(sDate):
sURL="http://www.cbr.ru/scripts/XML_daily.asp?date_req=%s" % (sDate)
prxy={"http":"http://proxy.server:port"} # Enter correct data or comment
u=urllib.urlopen(sURL)
return u.read()

#---------------------------------------------------------------------------
def ekParseXMLDoc(xmlDoc):
lstDicXMLNodes=[]
dicXMLNodes={}
xmldoc=xml.dom.minidom.parseString(xmlDoc)
root=xmldoc.documentElement
for valute in root.childNodes:
if valute.nodeName=='#text':
continue
for ch in valute.childNodes:
if ch.nodeName=='#text': # Drop TextNode, that is means "\n" in the xml document
continue
dicXMLNodes[ch.nodeName]=ch.childNodes[0].nodeValue
lstDicXMLNodes.append(dicXMLNodes)
dicXMLNodes={}
return lstDicXMLNodes

#---------------------------------------------------------------------------
def main():
sSql=""
lstDicXMLNodes=()
sDate=strftime("%d.%m.%Y", localtime())
sRevDate=strftime("%Y-%m-%d", localtime())
#sDate="03.04.2005"
#sRevDate="2005-04-03"
print "-----",sDate,"-----\n"
lstDicXMLNodes=ekParseXMLDoc(ekGetInput(sDate))
try:
for dicXMLNode in lstDicXMLNodes:
dbh=MySQLdb.Connect(host=dbServer,user=dbUser,passwd=dbPasswd,db=dbName)
cur=dbh.cursor(cursorclass=MySQLdb.cursors.DictCursor)
sSql="INSERT INTO %s (Date, NumCode, CharCode, Nominal, Name, Value) values('%s', '%d', '%s', '%d', '%s', '%9.4f')" % \
(tblName, sRevDate, int(dicXMLNode['NumCode']), dicXMLNode['CharCode'].encode(sEncoding), int(dicXMLNode['Nominal']), \
dicXMLNode['Name'].encode(sEncoding), float(dicXMLNode['Value'].replace(",",".")))
print "Строка запроса: '%s'" % sSql
cur.execute(sSql)
dbh.close()
except MySQLdb.DatabaseError, tplDetailError:
print "ERROR:", tplDetailError.args

else:
print "\n\nDone ;)"

#---------------------------------------------------------------------------
if __name__ == '__main__' :
sys.exit( main() )

#----------------------------------------------------------------------------
#