пятница, 14 сентября 2012 г.

Python Qt

Python Qt - данное руководство нацелено на получение представления о том, как писать маленькие приложения на Python, использующие библотеку Qt.

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

Для того, чтобы проверить это, откройте оболочку Python, просто набрав "python" в консоли в введите:

import qt

Если не появилось сообщения об ошибке, вы уже готовы начать. Начнём с простого. Программа открывает окно и показывает что-нибудь. Приведённый дальше код показывает окно, в котором написано "Hello, world!".

    # !/usr/bin/python
    import sys
    from qt import *
    # создадим приложение и передадим аргументы
    a = QApplication(sys.argv)
    # создание виджета
    # Первый аргумент – текст, который мы хотим увидеть.
    # Воторой аргумент – родительский виджет,
    # т.к. Hello – единственный виджет, то у него нет родителя
    hello = QLabel("Hello world!",None)
    # делаем виджет главным
    a.setMainWidget(hello)
    # показать виджет
    hello.show()
    # запустить приложение
    a.exec_loop()

Около 7 строк кода, и это настолько просто как только можно.
А вот так это выглядит:



Добавим немного итерактивности. Мы заменим надпись "Hello, World!" кнопкой и назначим ей действие. Такое назначение называется "присоединением сигнала" - событие, которое посылается слоту когда кнопка нажата. Эта функция запускается, когда возникает событие.

    # !/usr/bin/python
    # coding=utf-8
    import sys
    from qt import *
    a = QApplication(sys.argv)
    # Наша функция, которая будет вызвана пр нажатии на кнопку
    def sayHello():
        print "Hello, World!"
    # создание кнопки
    hellobutton = QPushButton("Say 'Hello world!'",None)
    # назначить обработчик клика кнопке
    a.connect(hellobutton, SIGNAL("clicked()"), sayHello)
    #назначить кнопку главным виджетом
    a.setMainWidget(hellobutton)
    # показать виждет
    hellobutton.show()
    # запустить приложение
    a.exec_loop()



Это уже больше похоже на нормальное приложение.

Давайте сделаем структуру, использовав объектно-ориентированный подход. Мы создадим наш собственный класс, наследованный от QApplication и поместим необходимые нам вещи в его методы: один метод для того, чтобы создать виджеты и слот, который содержит код, запускаемый при приходе сигнала.

    #!/usr/bin/python
    # coding=UTF-8
    import sys
    from qt import *
    #класс наследуем от QApplication
    class HelloApplication(QApplication):
        def __init__(self, args):
            """
                В конструкторе мы делаем всё, что необходимо для запуска нашего приложения, которое
                создаёт QApplication в __init__ методе, затем добваляет наши виджеты и, наконец,
                запускает exec_loop
            """
            QApplication.__init__(self, args)
            self.addWidgets()
            self.exec_loop()       
        def addWidgets(self):
            """ В этом методе мы добавляем виджеты и присоединяем обработчики сигналов.
                Обработчик сигнала для виджета так же называется "слотом"
            """
            self.hellobutton = QPushButton("Say 'Hello, World!'",None)
            self.connect(self.hellobutton, SIGNAL("clicked()"), self.slotSayHello)
            self.setMainWidget(self.hellobutton)
            self.hellobutton.show()
        def slotSayHello(self):
            """
                Это пример слота - метода, который вызывается, когда приходит сигнал.
            """
            print "Hello, World!"
    # Этот скрипт должен выполняться только отдельно, так что мы должны проверить это,
    # но мы также должны иметь возможность подключать эту программу без запуска какого-либо кода
    if __name__ == "__main__":
        app = HelloApplication(sys.argv)


















На картинке вы можете видеть простой интерфейс. Зелёным цветом написаны имена виджетов. Всё что нам надо сделать это:
1. Скомпилировать .ui файл из Qt designer'а в класс на Python.
2. Написать подкласс и использовать его как mainWidget.

Таким образом, мы сможем изменять нтерфейс в Qt designer'е, не копаясь в коде

Команда

pyuic testapp_ui.ui -o testapp_ui.py

сделает класс на Python, с которым мы сможем работать.

Работу нашей программы можно описать следующим образом:
1. Мы заполняем lineedit.
2. К нажатию на кнопку добавления мы присоединим метод, который читает текст из lineedit и добавляет его в listview.
3. Нажатие на кнопку удаления удалит выбранный элемент из listview.

Вот код с комментариями:

    #!/usr/bin/python
    # coding=utf-8
    from testapp_ui import TestAppUI
    from qt import *
    import sys
    class HelloApplication(QApplication):
        def __init__(self, args):
            """
                В конструкторе мы делаем всё, что необходимо для запска нашего приложения, которое
                создаёт QApplication в __init__ методе, затем добваляет наши виджеты и, наконец,
                запускает exec_loop
            """
            QApplication.__init__(self,args)
            # Мы передаём None т.к. этот виджет верхнего уровня
            self.maindialog = TestApp(None)
            self.setMainWidget(self.maindialog)
            self.maindialog.show()
            self.exec_loop()
    class TestApp(TestAppUI):
        def __init__(self,parent):
            # Запускаем родительский конструктор и присоединяем слоты к методам
            TestAppUI.__init__(self,parent)
            self._connectSlots()
            # Изначально список пуст, так что кнопка удаления не должна работать
            # Сделаем её неактивной
            self.deletebutton.setEnabled(False)
        def _connectSlots(self):
            # Устанавливаем обработчики сингналов на кнопки
    self.connect(self.addbutton,SIGNAL("clicked()"),self._slotAddClicked)
    self.connect(self.lineedit,SIGNAL("returnPressed()"),self._slotAddClicked)
    self.connect(self.deletebutton,SIGNAL("clicked()"),self._slotDeleteClicked)
        def _slotAddClicked(self):
            # Читаем тескт из lineedit,
            text = self.lineedit.text()
            # если lineedit не пуст,
            if len(text):
                # вставим новый элемент в список ...
                lvi = QListViewItem(self.listview)
                # с текстом из lineedit ...
                lvi.setText(0,text)
                # и очистим lineedit.
                self.lineedit.clear()
                # Кнопка удаления м.б. выключена, так что включим её.
                self.deletebutton.setEnabled(True)
        def _slotDeleteClicked(self):
            # Удаляем выбранный элемент из списка
            self.listview.takeItem(self.listview.currentItem())
            # Check if the list is empty - if yes, disable the deletebutton.
            # Если список после этого оказался пустым, то сделаем кнопку удаления неактивной
            if self.listview.childCount() == 0:
                self.deletebutton.setEnabled(False)
    if __name__ == "__main__":
        app = HelloApplication(sys.argv)

И вот результат трудов:

 

Создание интерфейса в Qt designer не только делает проще создание GUI, но это также хороший инструмент для изучения Qt. Вы можете протестировать как виджет выглядит, увидеть что доступно в Python Qt и посмотреть свойства, которые вы можете захотеть использовать.

Python UTF-8

Python UTF-8 используется для записи строк в формате UTF.

Приведем пример простой строки:

byteString = "hello world! (in my default locale)"

А теперь запишем строку Python в формате UTF-8:

unicodeString = u"hello Unicode world!"

Конвертируем битовую строку в формат UTF-8 и обратно:

s = "hello byte string"
u = unicode( s )
backToBytes = u.encode()

В большинстве случаев лучше будет явно указать кодировку строки:

s = "hello normal string"
u = unicode( s, "utf-8" )
backToBytes = u.encode( "utf-8" )

Теперь битовая строка Python будет обработана, как строка в формате UTF-8.

Чтение фалов в формате UTF-8.

Вы можете вручную конвертировать строки, считываемые из файлов, следующим образом:

import codecs
fileObj = codecs.open( "someFile", "r", "utf-8" )
u = fileObj.read() # Возвращает строку в формате UTF-8.

Если текст вашего кода содержит символы в формате UTF-8, то в самом верху вашего Python файла разместите следующую строку:

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

Python int

Python int ([x[, base]]) предназначен для конвертации строки в число. Если в качестве аргумента передается текстовая строка, то она должна содержать в своем составе хотя бы одно отделенное пробелом от других элементов строки.

Например, int ('Число 10').

Python float

Python float (x) предназначен для конвертации числа в число с плавающей точкой. Если в качестве аргумента передается текстовая строка, то она должна содержать в своем составе хотя бы одно число с плавающей точкой отделенное пробелом от других элементов строки. Например, float ('Число 10.155').

Python join

Python join (words[, separator]) позволяет объединять список строк с парами ключ-значение вида key=value в одну строку.

Объединение join производится следующим образом:

string.join (words[, separator])

По умолчанию значение separator равняется одному пробелу.

Метод Python join объединяет элементы списка в одну строку, в которой элементы оказываются разделены пробелом.

Совсем не обязательно, чтобы в качестве разделителя выступала пробел. Разделителем может быть любая произвольная последовательсность символов.

Важно то, что метод Python join может работать только со списками строк, поскольку он не делает никаких преобразований. Если список содержит один или более не строчных элементов, то будет вызвано исключение.

Python logging

Python logging - библиотека для удобного ведения логов в Python.

Для начала подключим библиотеку и попробуем вывести в консоль сообщения разного типа:

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

import logging

# Сообщение отладочное
logging.debug( u'This is a debug message' )

# Сообщение информационное
logging.info( u'This is an info message' )

# Сообщение предупреждение
logging.warning( u'This is a warning' )

# Сообщение ошибки
logging.error( u'This is an error message' )

# Сообщение критическое
logging.critical( u'FATAL!!!' )

При выводе мы получаем:

WARNING:root:This is a warning
ERROR:root:This is an error message
CRITICAL:root:FATAL!!!

Как видно, при выводе мы получаем все, кроме сообщений отладки и информационных сообщений. Для того, чтобы мы могли их увидеть, нужно в настройки логера передать уровень выводимых ошибок:

logging.basicConfig(level = logging.DEBUG)

Сразу хочу оговориться что конфигурационые параметры должны передаваться до первого вызова вывода ошибки. Вот код:

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

import logging

logging.basicConfig(level = logging.DEBUG)

# Сообщение отладочное
logging.debug( u'This is a debug message' )

# Сообщение информационное
logging.info( u'This is an info message' )

# Сообщение предупреждение
logging.warning( u'This is a warning' )

# Сообщение ошибки
logging.error( u'This is an error message' )

# Сообщение критическое
logging.critical( u'FATAL!!!' )

Теперь после вывода мы получим все сообщения:

DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning
ERROR:root:This is an error message
CRITICAL:root:FATAL!!!

Но все равно вывод выглядит как-то скудно. Поэтому в конфиге логера можно задать формат выводимого сообщения :

logging.basicConfig(format = u'%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s]  %(message)s', level = logging.DEBUG)

Теперь после вывода мы получаем вот такие сообщения:

log.py[LINE:33]# DEBUG    [2012-05-25 00:11:58,466]  This is a debug message
log.py[LINE:34]# INFO     [2012-05-25 00:11:58,466]  This is an info message
log.py[LINE:35]# WARNING  [2012-05-25 00:11:58,466]  This is a warning
log.py[LINE:36]# ERROR    [2012-05-25 00:11:58,467]  This is an error message
log.py[LINE:37]# CRITICAL [2012-05-25 00:11:58,467]  FATAL!!!

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

Теперь давайте запишем логи в файл. Для этого в конфигурации предусмотрен параметр, в котором указывается куда будем писать лог:

logging.basicConfig(format = u'%(levelname)-8s [%(asctime)s] %(message)s', level = logging.DEBUG, filename = u'mylog.log')

С этого момента логи будут писаться в файл, указанный в параметре filename.

PyQT Python

PyQT Python - это тулкит для разработки GUI приложений. Он представляет из себя смесь языка программирование Python и библиотеки Qt.

PyQt представляет из себя набор модулей Python. Она содержит более 300 классов и почти 6000 функций и методов. Это мультиплатформенный тулкит. Он работает на всех основных операционных системах, включая Unix, Windows и MacOS.

Начиная с версии PyQt 4 GPL доступна для всех поддерживаемых платформ.

Так как тулкит содержит большое количество классов, они распределены в несколько модулей.

Модули Python PyQt

Модули PyQt4

Модуль QtCore содержит ядро не-gui функциональности. Этот модуль используется для работы со временем, файлами и папками, различными типами даных, потоками, адресами URL, mime-типами, потоками процессов.

Модуль QtGui содержит графические компоненты и связанные классы. Сюда включены, например, кнопки, окна, строки состояния, панели инструментов, полосы прокрутки, изображения (bitmap), цвета, шрифты и др.

Модуль QtNetwork содержит классы для сетевого программирования. Эти классы позволяют писать TCP/IP и UDP клиенты и серверы. Они делают сетевое программирование легче и более доступным.

Модуль QtXml содержит классы для работы с xml файлами. Он предоставляет реализации API SAX и DOM.

Модуль QtSvg предоставляет классы для отображения содержимого SVG файлов. Масштабируемая векторная графика (SVG) – это язык описания двумерной графики и графических приложений на языке XML.

Модуль QtOpenGL используется для построения 3D и 2D графики с помощью библиотеки OpenGL.

Модуль дает возможность бесшовной интеграции библиотек QtGui и OpenGL.

Модуль QtSql содержит классы для работы с базами данных.

Простой пример Python PyQT

Код данного отображает небольшое окно. Однако вы сможете сделать с ним многое. Вы сможете изменить его размеры, распахнуть на весь экран, минимизировать.

#!/usr/bin/python
# simple.py

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget.resize(250, 150)
widget.setWindowTitle('simple')
widget.show()

sys.exit(app.exec_())

import sys
from PyQt4 import QtGui

Подключаем необходимые модули. Основные GUI виджеты находятся в библиотеке QtGui.

app = QtGui.QApplication(sys.argv)

Каждое приложение PyQt4 должно создать объект Qapplication. Этот объект находится в модуле QtGui. Параметр sys.argv это список аргументов командной строки. Скрипты Python могут быть запущены из консоли, и с помощью аргументов мы можем контролировать запуск приложения.

widget = QtGui.QWidget()

Qwidget это базовый класс для всех объектов интерфейса пользователя для PyQt4. Мы используем стандартный конструктор для Qwidget, который не имеет родителя. Виджет у которого нет родительского является окном.

widget.resize(250, 150)

Метод resize() изменяет размеры виджета. В данном случае 250 пикселей по ширине и 150 по высоте.

widget.setWindowTitle('simple')

Здесь мы устанавлиаем заголовок окна на simple.

widget.show()

Метод show() отображает окно на экране.

sys.exit(app.exec())

В конце мы запускаем основной цикл приложения. Отсюда начинается обработка событий. Приложение получает события от оконной системы и распределяет их по виджетам. Когда цикл заканчивается, или, если мы вызовем метод exit(), то наше окно (главный виджет) будет уничтожено. Метод sys.exit() гарантирует чистый выход. Окружение будет проинформировано о том, как приложение завершилось.

Вы удивлены почему метод exec_() записан с подчеркиваение? Это сделано потому, что exec - это ключевое слово в Python.

Простое окно

Иконка приложения Python PyQT.

Иконка программы - это просто маленькое изображение, которое обычно отображается в левом верхнем углу заголовка. В следующем примере мы покажем как сделать это на PyQt. Мы также представим некоторые новые методы.

#!/usr/bin/python
# icon.py

import sys
from PyQt4 import QtGui

class Icon(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QtGui.QIcon('icons/web.png'))

app = QtGui.QApplication(sys.argv)
icon = Icon()
icon.show()
sys.exit(app.exec_())

В предыдущем примере код был процедурным. Python поддерживает как процедурный, так и объектно-ориентированный стиль программирования. Программирование на PyQt предполагает ООП программирование.

class Icon(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

Три наиболее важные вещи в объектно-ориентированном программировании - это классы, данные и методы. Здесь мы создаем новый класс Icon. Класс Icon наследован от класса QtGui.QWidget. Это значит, что мы должны вызвать два конструктора: во-первых, для класса Icon и, во-вторых, для наследованного класса.

self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Icon')
self.setWindowIcon(QtGui.QIcon('icons/web.png'))

Все три класса наследованы от класса QtGui.QWidget. Метод setGeometry() делает две вещи: он определяет положение окна и его размеры. Первые два параметра это координаты по оси X и Y соответственно. Третий задает ширину окна, а четвёртый высоту. Последний метод setWindowIcon() устанавливает иконку программы. Чтобы сделать это, мы создаём объект QIcon. В качестве параметра передаётся путь до файла иконки.

 Иконка

Всплывающая подсказка Python PyQT.

Мы можем создать всплывающую подсказку для любого виджета.

#!/usr/bin/python
# tooltip.py

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

class Tooltip(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Tooltip')

        self.setToolTip('This is a QWidget widget')
        QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))

app = QtGui.QApplication(sys.argv)
tooltip = Tooltip()
tooltip.show()
app.exec_()

В этом примере, мы показываем подсказку для виджета Qwidget.

self.setToolTip('This is a QWidget widget')

Для создания подсказки вызываем метод setToolTip(). Можно использовать HTML-тэги для форматирования.

QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))

Потому как обычный QtoolTip выглядит не лучшим образом, мы изменили его.

Всплывающая подсказка


Закрытие окна Python PyQT.

Самый очевидный путь закрытия окна, это щелкнуть на кнопке закрытия в заголовке окна. В следующем примере мы покажем как можно программно закрыть окно. Для этого мы кратко коснёмся сигналов и слотов.

QPushButton(string text, QWidget parent = None)

Это конструктор QPushButton, который мы будем использовать в нашем примере. Параметр text - это текст, который будет отображаться на кнопке, parent - тот виджет, на который мы поместим кнопку. В нашем случае это Qwidget.

#!/usr/bin/python
# quitbutton.py

import sys
from PyQt4 import QtGui, QtCore

class QuitButton(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Icon')

        quit = QtGui.QPushButton('Close', self)
        quit.setGeometry(10, 10, 60, 35)
        self.connect(quit, QtCore.SIGNAL('clicked()'),
            QtGui.qApp, QtCore.SLOT('quit()'))

app = QtGui.QApplication(sys.argv)
qb = QuitButton()
qb.show()
sys.exit(app.exec_())

quit = QtGui.QPushButton('Close', self)
quit.setGeometry(10, 10, 60, 35)

Мы создаём кнопку и располагаем её на виджете также, как мы размещали виджет на экране.

self.connect(quit, QtCore.SIGNAL('clicked()'),
QtGui.qApp, QtCore.SLOT('quit()'))

Система обработки событий в PyQt построена на механизме сигналов и слотов. Если мы щёлкнем на кнопке, то будет послан сигнал clicked(). Слот может быть как слотом PyQt так и любым возможным для языка Python. Метод QtCore.QObject.connect() соединяет сигнал и слот. В нашем случае слот является предопределённым слотов PyQt.

Кнопка закрытия

Окно сообщений Python PyQT.

Обычно, при щелчке на кнопке закрытия в заголовке окна виджет закрывается. Иногда нам нужно изменить это действие. Например, если у нас открыт файл в редакторе с которым мы сделали какие-то изменения. В этом случае мы показываем пользователю сообщение для подтверждения выбранного действия.

#!/usr/bin/python
# messagebox.py

import sys
from PyQt4 import QtGui

class MessageBox(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('message box')

    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

app = QtGui.QApplication(sys.argv)
qb = MessageBox()
qb.show()
sys.exit(app.exec_())

Когда мы закрываем виджет, генерируется событие QCloseEvent. Для изменения поведения виджета нам нужно изменить обработчик события QCloseEvent.

reply = QtGui.QMessageBox.question(self, 'Message',
    "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

Мы выводим сообщение с двумя кнопками “Да” и “Нет”. Первая строка ('Message') выводится в заголовке окна, вторая - текст сообщения. Возвращаемое значение хранится в переменной reply.

if reply == QtGui.QMessageBox.Yes:
    event.accept()
else:
    event.ignore()

Здесь мы проверяем возвращаемое значение: если щелкнули по кнопке “yes”, то мы принимаем стандартный обработчик, иначе – игнорируем закрытие.

Сообщение

Python requests

Python requests позволяют отсылать HTTP/1.1 запросы. Вы можете добавлять заголовки headers, данные form data, файлы multipart.

Python requests пишутся следующим образом:

>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.text
...

Python Pyramid

Python Pyramid - это система управления контентом (CMS), написанная на языке Python. Она построена на основа фреймворка TurboGears 2 и использует SQLElixir в качестве прослойки для работы с СУБД.

Дя установки Pyramid требуется Python не ниже 2.5, несколько пакетов Python (включая TurboGears 2) и СУБД, например, MySQL или PostgreSQL.

Установка Python Pyramid в вируальном окружении

Создаем виртуальное окружение для Pyramid

virtualenv pyramid_env

(в документации к Pyramid рекомендуют по другому "virtualenv --no-site-packages env" - нопод Windows 7 64-бит такая команда вызвала кучу ошибок. Но под FreeBSD 8.1 64-бит - сработала именно такая команда, которая с Windows не получилась.)

Переходим в каталог витруального окружения:

cd "C:\Python27\pyramid_env\Scripts"

Устанавливаем в этом виртуальном окружении Pyramid:

easy_install.exe pyramid

В каталоге "C:\Python27\pyramid_env\Lib\site-packages\" видим, что Pyramid для работы нужно очень много чего:

chameleon-1.2.13-py2.7.egg
easy-install.pth
mako-0.3.6-py2.7.egg
markupsafe-0.11-py2.7.egg
paste-1.7.5.1-py2.7.egg
pastedeploy-1.3.4-py2.7.egg
pastescript-1.7.3-py2.7.egg
pip-0.8.1-py2.7.egg
pyramid-1.0b1-py2.7.egg
repoze.lru-0.3-py2.7.egg
setuptools-0.6c12dev_r88124-py2.7.egg
setuptools.pth
translationstring-0.3-py2.7.egg
venusian-0.6-py2.7.egg
webob-1.0.1-py2.7.egg
zope.component-3.10.0-py2.7.egg
zope.configuration-3.7.2-py2.7.egg
zope.deprecation-3.4.0-py2.7.egg
zope.event-3.5.0_1-py2.7.egg
zope.i18nmessageid-3.5.3-py2.7-win-amd64.egg
zope.interface-3.6.1-py2.7-win-amd64.egg
zope.schema-3.7.1-py2.7.egg

Проверка правильности работы Pyramid без базы данных

Создаем новый каталог, переходим в него, устанавливаем в этот каталог шаблон "pyramid_starter" из поставки Pyramid. Для этого запускаем утилиту "paster" из виртуального окружения:

C:\Python27\pyramid_env\Scripts\paster.exe create test -t pyramid_starter

Появляется каталог "test", содержащий готовый дистрибутив приложения. Само приложение находится в подкаталоге "test\test".

Заходим в каталог "test". Готовим приложение к развертыванию:

C:\Python27\pyramid_env\Scripts\python.exe setup.py develop

При этом скачиваются и устанавливаются недостающие пакеты Python.

Затем запускаем веб-сервер:

C:\Python27\pyramid_env\Scripts\paster.exe serve development.ini

Видим, что веб-сервер стартовал и ждет нас на порту 6543

В браузере набираем http://127.0.0.1:6543 и видим страницу с уведомлением: "Welcome to test, an application generated by the Pyramid web application development framework" и ссылками на документацию по Pyramid.

Проверка правильности работы Pyramid с базой данных SQLite

Заходим  в пустой каталог.

Создаем приложение, готовое к развертыванию командой:

C:\Python27\pyramid_env\Scripts\paster.exe create test2 -t pyramid_alchemy
Появляется каталог "test2"
Переходим в каталог "test2".

По умолчанию приложение созданное из шаблона "pyramid_alchemy" сконфигурировано для работы с базой данных "sqlite3".

Готовим приложение к работе:

C:\Python27\pyramid_env\Scripts\python.exe setup.py develop

Заметно, что при этом много пакетов скачивается, в частности, SQLAlchemy.
C:\Python27\pyramid_env\Scripts\paster.exe serve development.ini

Дожидаемся сообщения, что веб-сервер стартовал. Смотрим на каком порту и (на том же что и первое веб-приложение "test"). Запускае браузер и заходим на страницу.

Различие в том, что на странице есть ссылка "test" под полем ввода для поиска. Жмем на ссылку и получаем ответ, сгенерированный на основе данных, хранимых в базе данных.

Приложение "test2", созданное из шаблона "pyramid_alchemy", изначально сконфигурировано для работы с базой данных "SQLite". Меняем в конфигурации базу данных на PostgreSQL.

Сначала с помощью входящей в состав PostgreSQL утилиты pgAdmin III создаем базу данных "testdb" и пользователя "user" с паролем "password" и правом модернизировать структуру базы данных.

Прописываем базу данных "testdb" в файле "development.ini", исправив строчку, где указана база данных типа sqlite на такую:

sqlalchemy.url = postgresql+psycopg2://user:password@127.0.0.1:5432/testdb

Здесь написано, что база данных называется "testdb", которая обслуживается сервером PostgreSQL. SQLAlchemy будет получать доступ к базе данных через адаптер psycopg2.

Запускаем веб-сервер:

C:\Python27\pyramid_env\Scripts\paster.exe serve development.ini

Проверяем через браузер.

Python Pyramid работает.


Python комментарии

Python комментарии обозначаются с помощью символа #. Многострочных комментариев в Python нет. Для многострочных комментариев каждую строку необходимо начинать с символа #.

# Это однострочный комментарий.

# Это многострочный комментарий
# разбитый на
# несколько строк.

Однако неофициально многострочные комменатрии в Python можно задавать с помощью трех кавычек, выражение внутри которых будет воспринято как текстовая строка.

""" Так в Python можно записать
    многострочный комментарий
    разбитый на
    несколько строк. """

Python lambda

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

Функция в Python может быть определена с помощью оператора def или lambda выражением. Следующие операторы эквивалентны:

def func(x, y):
    return x**2 + y**2

func = lambda x, y: x**2 + y**2

Определив функцию с помощью lambda выражения, можно тут же ее использовать:

>>> (lambda x: x+2)(5)
7

lambda выражения в Python удобны для определения не очень сложных функций, которые передаются затем другим функциям.

Использование lambda функций - дело стиля. Везде, где вы можете использовать lambda функцию, вы также можете определить и использовать обычную функцию.

Python кортеж

Python кортеж (tuple) - аналог списка, но в отличие от списка является неизменяемым. Кортежи в Python используется для представления неизменяемой последовательности разнородных объектов. Они обычно записываются в круглых скобках, но если неоднозначности не возникает, то скобки можно опустить.

>>> t = (2, 2.05, "Hello")
>>> t
(2, 2.0499999999999998, 'Hello')
>>> (a, b, c) = t
>>> print a, b, c
2 2.05 Hello
>>> z, y, x = t
>>> print z, y, x
2 2.05 Hello
>>> a=1
>>> b=2
>>> a,b=b,a
>>> print a,b
2 1
>>> x = 12,
>>> x
(12,)

Как видно из примера, Python кортеж может быть использован и в левой части оператора присваивания. Значения из кортежа в левой части оператора присваивания связываются с аналогичными элементами правой части. Этот факт как раз и дает нам такие замечательные возможности как массовая инициализация переменных и возврат множества значений из функции одновременно. Последний пример демонстрирует создание кортежа из одного элемента (его часто называют синглтоном).

Примеры работы с кортежами в Python

Tuple =  ("hello", "world", 3) # создать кортеж

# при создании кортежа из одного элемента не забывайте ставить запятую после него

Tuple = ("Hello",)

Tuple.len() # количество элементов или длина кортежа

Tuple = (0, ) + (1,2,3,4) # объединение двух кортежей или конкатенация

Tuple[2] # извлечение элемента или срез

Python index

Python index (x) позволяет получить из массива порядковый индекс первого встречающегося элемента совпадающего со значением x. В случае, если элемент в массиве будет не найден, то index вернет ошибку.

Пример Python index (x)

list.index (x)

Python case

Python case switch последовательность можно реализовать с помощью if ... elif ... elif ... else инструкций. Конструкцию switch case Python не поддерживает. Но можно написать вариант switch case на основе лямбда-функций:

result = {
  'case 1': lambda x: x * 5,
  'case 2': lambda x: x + 7,
  'case 3': lambda x: x - 2
}[value](x)

Python hex

Python hex (x) конвертирует число типа Integer любого размера в шестнадцатиречную строку.

Пример.

hex (x)

Для получения шестнадцатиричной строки из числа типа Float воспользуйтесь методом:

float.hex()

Python открыть файл

Python открыть файл можно с помощью функции open:

open(name[, mode[, buffering]])

Функция возвращает файловый объект. Обязателен только первый аргумент. Если остальные параметры отсутствуют, файл будет доступен только для чтения.

Таблица режимов (mode) функции отрытия файла:

'r' – чтение.

'w' – запись.

'a' – добавление.

'b' – бинарный режим.

'+' – чтение/запись.

Режим '+' может быть добавлен к остальным режимам. По умолчанию Python открывает файлы в текстовом режиме. Для открытия файла в бинарном режиме на чтение можно добавить 'rb'. Третий параметр устанавливает размер буферизации при работе с файлом. По умолчанию он выключен, и чтение/запись идет напрямую с диска на диск. Для включения буфера третий параметр должен быть отличным от нуля.

Python file read

Python file read позволяется прочитать данные из файла. file.read([size]) может принимать аргумент, который указывает сколько байт нужно прочитать из файла. Если значение аргумента отрицательное, то метод read прочитает все данные до конца файла.

Пример чтения данных из файла.

Создайте текстовый файл с именем sample.txt и поместите его в папку с вашей программой my_programm.py.

В файл sample.txt вставьте следующий текст:

Этот текст находится во внешнем файле.
При запуске программы он отображается на экране.
Это очень здорово!

Далее откройте файл с вашей программой my_programm.py и введите в него следующий код:

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

from sys import argv

script, filename = argv

txt = open(filename)

print "Мы открываем файл %r и выводим из него следующий текст:" % filename
print txt.read()

txt.close()

Теперь откройте консоль и запустите вашу программу с параметром соотвествующим имени вашего файла с текстом (sample.txt):

my_programm.py sample.txt

В результате выполнения вашей программы содержимое файла sample.txt будет выведено на экран.

Python switch

Python switch можно реализовать, несмотря на то, что изначально Python switch не поддерживает.

Данный вараинт switch для Python создан на основе лямбда-функций.
В отличии от традиционных switch записывается он в обратном порядке.

{'case1': function1,
 'case2': function2,
 'case3': function3
}[value]()

Пример реальной работы кода switch для Python:

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}[value](x)

А вот для сравнения пример записи switch для PHP:

switch ($value) {
    case 'a':
        $result = $x * 5;
        break;
    case 'b':
        $result = $x + 7;
        break;
    case 'c':
        $result = $x - 2;
        break;
}

Если для работы switch необходим default-параметр, то в это случае код на Python записывается так:

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}.get('c', lambda x: x - 22)(23)

Python trim

Python trim или strip - часто используемое название для строковой функции, которая удаляет начальные и конечные пробелы.

Пример Python string.strip ()

print '  Это тест  '.strip()

# Выведет на экран строку 'Это тест'

Наиболее популярные варианты функции trim удаляют пробелы только в начале и в конце строк. В Python это lstrip и rstrip.

Многие функции trim имеют опциональный параметр для определения списка символов к удалению. Python позволяет задавать такой опциональный параметр.

result = string.strip(' \t\n')

Python перевод строки

Python перевод строки осуществляется с помощью специального символа \n

Строки – упорядоченные последовательности символов, используемые для хранения и представления текстовой информации.


Примеры работы со строками Python:


# Объявить строку

Str = 'text'

Str = "text "

Str = """многострочный текст"""


# При использовании кириллицы (Юникода)

Str = u'текст'


# Преобразование кодов символов

ord('W') # вернет 87 - код символа в ASCII

chr(87) # вернет W - символ для кода 87


# Оператор форматирования строк %, производит подстановку в строку значений из кортежа

'моя строка %s с числом %d' % ('№1', 1)


# оператор форматирования, словарь в виде аргумента

print "Hello %(name)s! How's %(value)s?" % {'name': 'Bill', 'value': 'life'} # Hello Bill! How's life?


# Не форматированные строки или сырые строки(игнорируются знаки типа перевода строки и подобные)


Str = r'    ext'


# Конкатенация (слияние двух строк)

Str = Str1 + Str2


# Повторение (повторить строку n-раз)

Str = 'hello' * 10


# Обратиться к символу по номеру

symbol = Str[i]


# Извлечение подстроки

Str = Str[i:j] # где i индекс начало среза, j - длина среза

Str = u'питону' # строка юникод

print Str[:-1]+u'ы' # срез строки, вся строка без последнего символа + буква Ы


# Расширенная операция извлечения подстроки

Str[1:10:2] # каждый второй элемент в последовательности от 1 до 9, то есть Str[начальная позиция:конечная позиция:длина]

Str[::2] # каждый второй элемент от начала и до конца стоки, в данном случае начальная позиция принимается как начало строки, конечная - как конец строки


# Длина строки

len(Str)


# Количество вхождений подстроки в строку, если нет совпадений - 0

Str.count('то что ищем')


# Поиск подстроки, возвращает позицию первого совпадения, иначе -1

Str.find('то что ищем')


# Поиск и замена, если строка не найдена - возвращает исходную строку

Str.replace('то что ищем', 'то на что заменяем')


# Разбить на список по символу, по умолчанию принимает символ пробела

Str.split('символ или строка')


# Собрать список в строку, между элементами списка добавляется разделитель

'разделитель'.join(Str)


# Регистр

Str.upper() # к верхнему

Str.lower() # к нижнему

Str.title() # первый символ каждого слова к верхнему

Str.capitalize() # первый символ строки к верхнему

Str.isupper() # проверить находиться ли строка в верхнем регистре

Str.islower() # проверить находиться ли строка в нижнем регистре


Str.startswith('строка') # определяет начинается ли строка с указанной подстроки

Str.endswith('строка') # определяет заканчивается ли строка с указанной подстрокой


# Удаляет пробельные символы

Str.strip() # в начале и конце

Str.lstrip() # в начале

Str.rstrip() # в конце


Экранированные последовательности

Последовательность Назначение
\newline Игнорируется (продолжение на новой строке)
\\ Сам символ обратного слеша (остается один символ \)
Апостроф (остается один ‘)
\" Кавычка (остается один символ ")
\a Звонок
\b Забой
\f Перевод формата
\n Новая строка (перевод строки)
\r Возврат каретки
\t Горизонтальная табуляция
\v Вертикальная табуляция
\N{id} Идентификатор ID базы данных Юникода
\uhhhh 16-битовый символ Юникода в 16-ричном представлении
\Uhhhh… 32-битовый символ Юникода в 32-ричном представлении
\xhh 16-ричное значение
\ooo 8-ричное значение
\0 Символ Null (не признак конца строки)
\другое Не является экранированной последовательностью (символ обратного слеша сохраняется)


Спецификаторы формата

Спецификатор Назначение
%s Строка (или любой объект)
%r s, но используется функция repr, а не str
%c Символ
%d Десятичное (целое) число
%i Целое число
%u Целое число без знака
%o 8-ричное целое число
%x 16-ричное целое число
%X x, но 16-ричные символы возвращаются в верхнем регистре
%e Число с плавающей точкой в экспоненциальной форме
%E e, но алфавитные символы возвращаются в верхнем регистре
%f Число с плавающей точкой в десятичном представлении
%g Число с плавающей точкой e или f
%G Число с плавающей точкой E или f
%% Символ %

 
Оператор форматирования строк подробнее.

# format % 2
%d     : '2'
%5d    : '    2'
%-5d   : '2    '
%05d   : '00002'
%.2e   : '2.00e+000'
%.2f   : '2.00'

%s     : string, applying str()
%-20s  : left-adjust

values = {'first_name' : 'Phoenix', 'last_name' : 'R' }
print "My name is %(first_name)s %(last_name)s." % values

Python getitem

Python getitem (value, index) позволяет получить значение value по индексу index.

Пример Python getitem (value, index).

operator.__getitem__(a, b)

# Возвращает значение a по инедксу b.

Python time sleep

Python time sleep (seconds) позволяет сделать паузу во время выполнения сценария Python. В результате выполнения time.sleep () на заданное число секунд приостанавливается работа всего сценария. Аргументом функции sleep может быть число с плавающей точкой для указания более точного времени простоя.

Фактическое время приостановки скрипта может быть меньше, чем вы установили, из-за того, что любой пойманный сигнал в Python может прервать выполнение команды time.sleep (). Кроме того, время приостановки может быть более длительным, чем требуется, из-за работы других сценариев в системе.

Пример Python time.sleep ()

import time
time.sleep(5)

# Получается пауза в 5 секунд, при работе скрипта.

Python len

Python len (s) позволяет подсчитать число символов в строке, а также число элементов в массиве.

Подсчет числа символов в строке 

Первый пример Python len ()


result = len ('I am John')
print result

# В результате выполнения кода на экране появится число символов в строке:  9

Второй пример Python len ()


something = 'Wikipedia'
result = len (something)
print result

# В результате выполнения кода на экране появится число символов в строке:  9

Третий пример Python len ()


s1 = u'Длина этого текста равна 27'
result = len (s1)
print result

# В результате выполнения кода на экране появится число символов в строке: 27

Четвертый пример Python len ()


text = 'Какой-то текст вперемешку с latin-ицей из PosgreSQL'
text = unicode (text, ‘utf-8’)
result = len (text)
print result

Подсчет числа элементов в массиве

p = ['Wikipedia', 'Wiktionary', 'Wikibooks']
result = len (p)
print result

# В результате выполнения кода на экране появится число элементов в массиве: 3

четверг, 13 сентября 2012 г.

Python для начинающих

Python для начинающих - обучающий курс, который позволит вам быстро и эффектино освоить программирование на языке Python.

Python очень легкий и мощный язык программирования. Вам не надо будет запоминать и вводить много лишних символов, которые Вы можете встретить в Си-подобных языках. 

Программный код на Python читается легче, чем в других языках программирования, в результате чего многократное использование и обслуживание кода выполняется гораздо проще, чем использование программного кода на других языках сценариев. Python содержит самые современные механизмы многократного использования программного кода, каким является ООП.

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

Большая часть программ на языке Python выполняется без изменений на всех основных платформах. Перенос программного кода из Linux в Windows заключается в простом копировании файлов программ с одной машины на другую.

По сравнению с компилирующим, или строго типизированными языками, такими как С, С++ или Java, Python во много раз повышает производительность труда разработчика. Объем программного кода на языке Python обычно составляет треть, или даже пятую часть эквивалентного программного кода на языке С++ или Java, что означает меньший объем ввода с клавиатуры, меньшее количество времени на откладку и меньший объем трудозатрат на сопровождение. Кроме того, программы на языке Python запускаются сразу же, минуя длительные этапы компиляции и связывания, необходимые в некоторых других языках программирования, что еще больше увеличивает производительность труда программиста.

Плюсы Python состоят еще в том, что по нему есть масса качественной литературы.

Вот источники, которые помогут Вам познакомиться ближе с Python.

Настоятельно рекомендую прочитать первым делом книгу - Марк Лутц. Изучаем Python, 4-е издание. Книга переведена на русский язык.

http://old.books.ru/img/816603.jpg

symbol.ru/date/816603.html

Для тех, кто знает английский, можно прочитать документацию на официальном сайте Python. Там всё довольно понятно описано.

docs.python.org

Неплохой ресурс - Основы программирования на Python. Учебник. Вводный курс.

younglinux.info/pdf 

Язык программирования Python. Объясняется всё довольно доступно и на русском.

python.ru/files/book-ods.pdf

Хорошая книга, тоже всё доступно и на русском — Python. Подробный справочник, 4-е издание.

http://old.books.ru/img/784182.jpg

symbol.ru/date/784182.html

А если же Вы более принимаете информацию по видео, то могу посоветовать уроки от компании Google, которые ведёт Ник Парланте - ученик из Стэнфорда. Шесть видеолекций на YouTube. Но в бочке мёда тут есть капля дёгтя Ведёт он на английском языке с английскими субтитрами. Но надеюсь, что остановит это немногих.

youtube.com/watch?v=tKTZoB2Vjuk







Что делать, если я прочитал книги, но не знаю как применять знания?

Без паники!
Советую почитать книгу Марк Лутц. Программирование на Python (4-е издание). Ранее было "изучаем", а тут "Программирование". В "Изучаем"  Вы получаете знания Python, в "Программирование" Марк Вас учит как их применять в Ваши будущие программы. Книга очень полезная. И думаю одной её Вам хватит.

http://old.books.ru/img/841171.jpg

symbol.ru/date/841171.html

Хочу практики!

Легко.
Выше я писал о видеолекциях от Ника Парланте на YouTube, но у них есть также некие задачки на сайте. Интересные задачки, советую каждому. На английском.

code.google.com/intl/uk/edu/languages/google-python-class/exercises/basic.html

Недавно школа программирования Codecademy открыла интерактивные Python-курсы. После прохождения каждого мини-курса, Вам будет позволено пройти некую "практику". Уроки ведутся на английском, но всё доступно и понятно. Начинается с переменных и типов данных.

codecademy.com/ru/courses/introduction-to-python-6WeG3/0?curriculum_id=4f89dab3d788890003000096

И на окончание - хорошие закрепляющие и начинающие курсы. Learn Python The Hard Way.

learnpythonthehardway.org/book

Python Парсинг сайта

В данной теме парсинга сайтов на Python будут освещены следующие возможности языка Python:
- парсинг страницы сайта с помощью простого регулярного выражения;
- скачивание файла с web-страницы;
- отправка скаченного файла через smtp-сервер;
- написание небольшого обобщающего скрипта.

Python Парсинг сайта.

Для работы с вебом используется модуль urllib2. Данный модуль позволяет получать содержимое страниц.

Воспользуемся следующим кодом для получения содержимого страницы:

def download_by_link(self, link):
        content = urllib2.urlopen(link).read() # считываем HTML-код страницы, расположенный по адресу link
        link_on_file, filename = self.get_filename(content) # получаем из HTML-кода ссылку для скачивания
        fullname = self.get_dir_name() + filename
        if self.is_new_version(fullname):
            with open(fullname, 'w') as fd:                               
                content = urllib2.urlopen(link_on_file).read() # скачиваем файл
                fd.write(content)                                                   
        return self.get_prepared_files(fullname)

with - гарантирует, что ресурсы, захваченные в данном блоке будут освобождены, как только мы выйдем за его пределы (в случае, обычного выхода или, например, исключения).

Для того, чтобы получить ссылку на архив со свежим выпуском газеты используем модуль re реализующий всю мощь регулярных выражений:

   def get_filename(self, text):
         pattern = r'(?P<link>http:\/\/archive\.sport\-express\.ru\/pdf\/(?P<filename>[0-9]+\.zip))'
         match = re.search(pattern, text)
         return match.group('link'), match.group('filename')

(?P ) - так задается именованная группа в регулярном выражении. Таким образом мы получает линк и имя файла.

class SportExpress():
    def get_from(self):
        return 'username@mail.ru'

    def get_title(self):
        return 'Sport Express subscribe'

    def get_text(self):
        return "Good morning! Don't be lazy - read newspaper!"

    def get_prepared_files(self, archive):                                     
        directory_to_extract = archive[:archive.rfind('.')]              
        zipfile.ZipFile(archive).extractall(directory_to_extract) # опасно использовать на произвольном содержимом
        res = glob.glob(directory_to_extract+'/*.*')
        return res

    def get_dir_name(self):
        dir_name = 'archive/sport-express/'
        if not os.path.exists(dir_name):
            os.mkdir(dir_name)
        return dir_name

    def is_new_version(self, filename):
        return os.path.exists(self.get_dir_name() + filename)

Создаем письмо.

Теперь, когда у нас есть содержимое, которое мы планируем высылать, неплохо было бы создать для него конверт.
Для работы с письмами в Python используется модуль email:

import email, email. encoders, email.mime.text, email.mime.base

class MessageBase:
    def __init__(self, subscriber):
        self.__to_addresses = subscriber.get_subscribers()
        self.__from_address = subscriber.get_from()
        self.__message = self.__create_message(subscriber.get_title(), subscriber.get_text())

Для начала создадим простое текстовое письмо.

 def __create_message(self, subject, text):
        email_msg = email.MIMEMultipart.MIMEMultipart('mixed')
        email_msg['Subject'] = subject
        email_msg['From'] = self.get_from()
        email_msg['To'] = ', '.join(self.get_to())
        email_msg.attach(email.mime.text.MIMEText(text,'text'))
        return email_msg

Пришла пора создать функцию для прикрепления файла. Если хотите, чтобы почтовый клиент мог открыть вложения необходимо указывать file_type.

    def attach_file(self, filename, file_link, file_type = 'unknown'):
        file_message = email.mime.base.MIMEBase('application', file_type)
        file_message.set_payload(file(file_link).read())
        email.encoders.encode_base64(file_message)
        file_message.add_header('Content-Disposition','attachment;filename='+filename)
        self.__message.attach(file_message)
        return True

Для того, чтобы получить из сообщения сообщение для отправки нужно вызвать метод as_string().

    def get_text(self):
        return self.__message.as_string()

Отправляем письмо.

Теперь когда есть письмо, нужно уметь его отправлять. За отправку писем в Python отвечает smtplib.

import smtplib

from message import MessageBase

class SmtpBase:
    def __init__(self, serverhost):
        self.__smtp_server = serverhost

    def open(self):
        self.__server = smtplib.SMTP(self.__smtp_server)
        self.__server.login('<enter your smtp login>', '<enter your smtp password>')

    def close(self):
        self.__server.quit()

Представим что у нас есть класс Message с методами get_from(), get_to(), get_text().

    def send_mail(self, message):
        for message_to in message.get_to():
            self.__server.sendmail(message.get_from(), message_to, message.get_text())

Чтобы поддерживать with необходимо добавить пару методов:

    def __enter__(self):
        self.open()
        return self

    def __exit__(self, type, value, traceback):
        if type:
            print '%s: %s %s' % (type, value, traceback)
        self.close()

Обобщаем сценарий.

Итоговый код выглядит так:

from subscriber_sex import SportExpress
from smtp import SmtpBase
from message import MessageBase

b = SportExpress()
filenames = b.download_by_link('http://www.sport-express.ru')

msg = MessageBase(b)
for file in filenames:
    msg.attach_file(file[file.rfind('/')+1:], file, 'pdf')

with SmtpBase('smtp.yandex.ru') as s:
    s.send_mail(msg)

После каждого запуска данного кода Python и парсинга сайта свежий выпуск "Спорт-Экспресс" посылается прямо в ваш почтовый ящик!

Python 3

Python 3 – новая версия мощного высокоуровневого языка программирования общего назначения, признанного разработчиками программного обеспечения. Одна из самых сильных сторон книги – многолетний опыт ее автора, Марка Саммерфилда, ведущего специалиста по этому языку. В руководство по программированию включены необходимые для освоения языка на практике методы разработки программ с использованием стандартной или сторонней библиотеки для языка программирования Python 3. Уровень сложности в книге постепенно повышается по мере ее чтения: начиная с описания ключевых элементов Python, автор переходит к более сложным темам, таким как распределение вычислительной нагрузки между несколькими процессами и потоками, использование сложных типов данных, управляющих структур и функций. Одним из последних этапов освоения языка Python 3 является в книге создание приложений для работы с базами данных SQL и с файлами DBI. Книга "Программирование на Python 3. Подробное руководство" обладает как справочным, так и учебным материалом, насыщена увлекательными примерами, доступными также и на специальном сайте издания. Код примеров был предварительно протестирован с окончательным релизом Python в операционных системах Windows, Linux и Mac OS X.

Django Windows

Установка Django Windows.

Перед началом установки Django на Windows необходимо скачать и установить Python (Windows binary) и TortoiseSVN (клиент для работы с SVN).

Скачиваем Django Windows.

После установки TortoiseSVN начинаем скачивать Django.
Создаем папку django. Заходим в папку django, в которую мы хотим скачать дистрибутив Django. Нажимаем правую кнопку мыши и в появившемся меню выбираем SVN Checkout.

установка django











В появившемся окне вводим URL: http://code.djangoproject.com/svn/django/trunk/ жмем ОК и дистрибутив начинает скачиваться.

установка django

После успешного завершения скачивания Django, в созданную вами папку django в операционной системе Windows, появится надпись
Updated X:\folder
Completed At revision 6710 (число будет другим)

установка django

Устанавливаем Django на Windows.

В Windows нажимаем на кнопку  Пуск > Выполнить (или на клавиатуре нажимаем одновременно значок Windows + R).
В окошке вводим:

cmd

и нажимаем Enter.


В результате выполения команды cmd откроется черное окно консоли командной строки.


В окне командной строки вводим:
cd \
cd \django
python setup.py install
нажимая кнопку Enter после ввода каждой строки.

Теперь необходимо поменять переменные окружения, чтобы можно было вводить django-admin.py, а не полный путь к нему (типа C:\python25\somefolder\django-admin.py).

Для этого заходим в свойства системы (жмем одновременно на клавиатуре значок Windows + Pause, или Правой кнопкой мыши на "Мой компьютер" > Свойства). Там находим переменные окружения, потом находим к нижней части окна Path, жмем "Правка" и в конце дописываем C:\Python25;C:\Python25\Scripts.
После этого перезагружаем Windows.

С этого момента Django Windows установлен.