Архив рубрики: Python

Python 101: pip –замена для easy_install (Перевод)

Pip Installs Python или pip — это инструмент для установки и управления пакетами Python, многие из которых расположены на Python Package Index (PyPI). Он является альтернативой easy_install. В этой статье мы потратим немного времени на то, чтобы посмотреть, как он работает и как он может помочь нам в нашей работе с Python.

Установка

Для работы Вам потребуется distribute или setuptools. Если Вы работаете с Python 3, тогда ваш единственный выбор — distribute, так как setuptools на данный момент ещё не портирован на эту версию. На сайте  pip есть установщик, так то вы можете использовать get-pip.py или просто перейти на PyPI и скачать исходники.
Как Вы уже знаете, для установки большинства модулей из исходников необходимо распаковать полученный архив, перейти в его папку и запустить в ней команду “python setup.py install”. Обратите внимание, что для установки могут понадобиться права администратора. На сайте pip рекомендуется использовать pip в virtualenv, поскольку в таком случае он устанавливается автоматически, “не требует прав администратора и не изменяет вашу установку Python”. Но это на ваш выбор.

использование pip

Чаще всего pip используют для установки, обновления или удаления пакетов. Все эти процедуры описаны на официальном сайте, но мы по ним всё равно пройдёмся. Так как мы упомянули про virtualenv, давайте и установим его при помощи pip:

pip install virtualenv
Если Вы запустите эту команду в терминале, Вы увидите что-то вроде этого:

Downloading/unpacking virtualenv
Downloading virtualenv-1.7.2.tar.gz (2.2Mb): 2.2Mb downloaded
Running setup.py egg_info for package virtualenv
warning: no previously-included files matching '*' found under directory 'do
cs_templates'
warning: no previously-included files matching '*' found under directory 'do
cs_build'
Installing collected packages: virtualenv
Running setup.py install for virtualenv
warning: no previously-included files matching '*' found under directory 'do
cs_templates'
warning: no previously-included files matching '*' found under directory 'do
cs_build'
Installing virtualenv-script.py script to C:Python26Scripts
Installing virtualenv.exe script to C:Python26Scripts
Installing virtualenv.exe.manifest script to C:Python26Scripts
Installing virtualenv-2.6-script.py script to C:Python26Scripts
Installing virtualenv-2.6.exe script to C:Python26Scripts
Installing virtualenv-2.6.exe.manifest script to C:Python26Scripts
Successfully installed virtualenv
Cleaning up...
Похоже, что работает. Обратите внимание, что pip загружает пакет ДО начала установки, чего не делает easy_install (за другими отличиями обраща

Python 201: Введение в distutils (Перевод)

В прошлый раз мы узнали как создавать модули и пакеты. Сегодня мы возьмём этот пакет и посмотрим, как при помощи distutils мы можем сделать этот пакет доступным для других людей. Мы научимся: 
  • создавать файл setup.py
  • создавать source distribution
  • создавать установщик для Windows

Начнём!

Пишем наш первый скрипт “setup.py”

Когда вы пишете ваш скрипт setup.py, Вы должны держать в голове его расположение. Если он будет находиться в папке с вашим пакетом, то это приведёт к ошибке при попытке им воспользоваться. Если он будет расположен где-то далеко, то скорее всего Вы при установке добавите ещё и те файлы, которые бы распространять не хотели. Поэтому для простоты мы создадим новую папку, куда и скопируем созданную вчера папку “mymath”. И тут же сохраним наш setup.py. Структура новой папки будет выглядеть так:
myNewFolder/
mymath/
setup.py
Внимание: Если у Вас нет кода, созданного в прошлой статье, его можно скачать тут

Теперь неплохо бы этот файл наполнить кодом:

from distutils.core import setup
 
setup(name = "mymath",
version = "0.1",
description = "A Simple Math Package",
author = "Mike Driscoll",
author_email = "mike@somedomain.com",
url = "http://www.blog.pythonlibrary.org/2012/07/08/python-201-creating-modules-and-packages/",
packages=["mymath"]
)
Что же, выглядит не плохо. Если мы хотим добавить в наш setup.py ещё какие-то пакеты, то мы просто перечисляем их в списке packages. Кроме того есть список py_modules, куда можно добавить отдельные модули. Если Вы будете рыться в документации, то Вы обнаружите, что Вы можете добавлять даже файлы, не являющиеся скриптами Python используя класс Extension библиотеки distutils. Например, это может понадобиться для добавления файлов С или чего-то в этом роде, что можно встретить в сторонних пакетах, вроде lxml.

Distutils: Как распространять исходники и установщики для Windows

После того, как мы сохранили наш файл со скриптом, мы можем создать архив с исходниками, который будет использован для распространения нашего замечательного пакета. Откройте терминал (или командную строку в Windows) и перейдите в созданную вами папку. Затем выполните следующую команду

python setup.py sdist

Вы увидите что-то вроде этого:

C:UsersmdriscollDocumentsmymath-setup>python setup.py sdist
running sdist
warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)
writing manifest file 'MANIFEST'
creating mymath-0.1
creating mymath-0.1mymath
copying files to mymath-0.1…
copying README.txt -> mymath-0.1
copying setup.py -> mymath-0.1
copying mymath__init__.py -> mymath-0.1mymath
copying mymathadd.py -> mymath-0.1mymath
copying myma
thdivide.py -> mymath-0.1mymath

copying mymathmultiply.py -> mymath-0.1mymath
copying mymathsubtract.py -> mymath-0.1mymath
creating dist
creating 'distmymath-0.1.zip' and adding 'mymath-0.1' to it
adding 'mymath-0.1PKG-INFO'
adding 'mymath-0.1README.txt'
adding 'mymath-0.1setup.py'
adding 'mymath-0.1mymathadd.py'
adding 'mymath-0.1mymathdivide.py'
adding 'mymath-0.1mymathmultiply.py'
adding 'mymath-0.1mymathsubtract.py'
adding 'mymath-0.1mymath__init__.py'
creating 'distmymath-0.1.zip' and adding 'mymath-0.1' to it
adding 'mymath-0.1PKG-INFO'
adding 'mymath-0.1README.txt'
adding 'mymath-0.1setup.py'
adding 'mymath-0.1mymathadd.py'
adding 'mymath-0.1mymathdivide.py'
adding 'mymath-0.1mymathmultiply.py'
adding 'mymath-0.1mymathsubtract.py'
adding 'mymath-0.1mymath__init__.py'
removing 'mymath-0.1' (and everything under it)

Что бы всё это могло значить? Только то, что distutils создал новую папку, названную dist, в которой теперь находится zip файл (mymath-0.1.zip) со всеми файлами вашего пакета. Если же Вы работаете на *nix — то получите tarball.
Далее, если Вы хотите создать установщик под Windows — это тоже будет легко сделать. Вам для этого понадобится такая команда:
python setup.py bdist_wininst

Эта  команда создаст папку build (на которую Вы можете не обращать внимание) и файл с названием mymath-0.1.win32.exe в вашей папке dist, который Вы можете запустить под Windows для установки вашего пакета. Так давайте попробуем!

Как установить ваш пакет?

В случае исходников, Вам надо их распаковать / разархивировать и затем выполнить следующую команду:
python setup.py install

Если всё было сделано верно и всё работает верно, то пакет будет установлен в вашей системе (для той версии python, которую Вы используете для запуска этой команды — прим. пер.). Если Вы запустите установщик Windows, то возникнет такой мастер установки:

Обратите внимание, что тут показаны все метаданные, которые мы указывали в нашем скрипте setup.py. Круто, правда? В любом случае, если Вы выполните все шаги мастера — Вы опять же установите пакет на свою систему.
Внимание: при такой установке пакет будет установлен в вашу основную версию Python. Если Вы не хотите этого — используйте virtualenv.

Итоги

Теперь Вы должны уметь создавать установщики и устанавливать свои пакеты при помощи distutils. Если Вы хотите загрузить ваш пакет в Python Packages Index (PyPI) — смотрите руководство. Удачи и кодируйте удовольствие!

Чтение на будущее

Источник

Автор: Ishayahu Lastov

Введение в pyfpdf – Простая библиотека для создания PDF на Python (Перевод)

Сегодня мы посмотрим на простую библиотеку для создания PDF, которая называется pyfpdf и является портом библиотеки FPDF для PHP. Она не может заменить Reportlab, но даёт Вам более чем простую возможность создавать PDF файлы. Давайте на неё посмотрим.

Установка pyfpdf

К сожалению, у этого пакета не setup.py или eggs, что облегчило бы нам его установку. Вместо этого Вам придётся скачать его, разархивировать и скопировать получившуюся папку в папку site-packages. Последняя версия создаёт папку pyfpdf-1.54b, так что Вам придётся переименовать её в pyfpdf, если Вы хотите использовать примеры из их руководства или из этой статьи. Кроме того, Вы можете просто скопировать его в virtualenv.

Тест-драйв pyfpdf

Как и при знакомстве с любой новой библиотекой, для того, чтобы понять, как она работает, Вам надо написать несколько примеров. Вот простейший код, с помощью которого Вы можете создать PDF:

import pyfpdf
 
pdf = pyfpdf.FPDF(format='letter')
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Welcome to Python!", align="C")
pdf.output("tutorial.pdf")
Обратите внимание, что когда Вы инициализируете ваш FPDF объект, Вы должны сообщить ему, что хотите, чтобы результат был с размером «letter». По умолчанию его значение «A4». Далее мы должны добавить страницу, задать шрифт и поместить туда какой-нибудь текст. Вызов pdf.cell немного не очевиден. Первые два аргумента — ширина и высота и определяет место, где будет располагаться ваш текст. Параметр align принимает в качестве значения один символ. В нашем случае мы центрируем текст, передавая символ «С». Последняя строка принимает два параметра — имя файла и путь. Если путь не задан, то файл будет располагаться в рабочей папке скрипта.
А что, если мы хотим добавить ещё одну строку? Это можно сделать, добавляя текст в конец файла, добавив ещё одну «ячейку». Если Вам нужен разрыв строки — можно использовать такой код:
import pyfpdf
 
pdf = pyfpdf.FPDF(format='letter')
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Welcome to Python!", ln=1, align="C")
pdf.cell(200,10,'Powered by FPDF',0,1,'C')
pdf.output("tutorial.pdf")

Добавляем Цацки: заголовки, нижние колонтитулы и разрывы страниц

В руководстве показано, как можно добавить заголовок, нижний колонтитул и разрыв страниц. Но этот способ не работает, так как надо изменить имя метода и код надо переписать, используя this вместо self (не знаю о чём он — прим. пер.). Вот что должно быть в идеале:

import pyfpdf
 
########################################################################
class MyPDF(pyfpdf.FPDF):
""""""
 
#----------------------------------------------------------------------
def header(self):
"""
Заголовок на каждой странице
"
""
# добавляем логотип
self.image("logo.png", x=10, y=8, w=23)
# располагаем логотип справа
self.cell(w=80)
 
# устанавливаем шрифт для заголовка, B=Bold
self.set_font("Arial", style="B", size=15)
# заголовок страницы
self.cell(40,10, "Python Rules!", border=1, ln=0, align="C")
# вставляем разрыв строки в 20 pixels
self.ln(20)
 
#----------------------------------------------------------------------
def footer(self):
"""
Нижний колонтитул на каждой странице
"
""
# располагаем footer в 15mm от конца страницы
self.set_y(-15)
 
# устанавливаем шрифт, I=italic
self.set_font("Arial", style="I", size=8)
 
# отображаем номер страницы по центру
pageNum =
"Page %s/{nb}" % self.page_no()
self.cell(0, 10, pageNum, align="C")
 
#----------------------------------------------------------------------
if __name__ == "__main__":
pdf = MyPDF
()
pdf.
alias_nb_pages()
pdf.
add_page()
pdf.
set_font("Times", size=12)
 
# добавляем несколько строк на страницу
for i in range(1, 50):
pdf.
cell(0, 10, "Line number %s" % i, border=0, ln=1)
pdf.
output("tutorial2.pdf")
Итак, мы создали подкласс FPDF, переопределили его методы header и footer, так как в оригинальном классе они всего лишь заглушки. В нашем заголовке мы создаём объект изображения и задаём его координаты х/у и его ширину w. Кроме того, вы можете передать и его высоту, если Вас беспокоит соотношение сторон. После этого мы его позиционируем и добавляем строку текста для заголовка. Наконец, мы добавляем разрыв строки.
Footer мы помещаем на 15 мм выше конца страницы. Его шрифт — 8pt Arial Italic. Ошибка в официальном руководстве была в том, что он вызывал self.PageNo(), который не существует. Зато есть метод page_no, который, видимо, его заменяет, так что я его и испо
льзовал. Наконец, в конце скрипта мы создаём наш PDF объект и записываем в него несколько строк. Если Вы запустите этот скрипт, Вы получите 3-х страничный документ.

Подведение итогов

В руководстве говорится так же об использовании цветов, но это я оставлю Вам в качестве домашнего задания. Ничего по поводу рисования, вставки таблиц или графиков, встраивания собственных шрифтов и многих других вещей, доступных в Reportlab, я не нашёл, но, опять же, это и предполагалось в качестве простой библиотеки для создания PDF. Если Вам нужны более продвинутые инструменты — смотрите в сторону Reportlab или проектов, созданных на его основе (rst2pds или xhtml2pdf).

Домашнее чтение

Автор: Ishayahu Lastov

Быстрое введение в pdfrw (Перевод)

Я всегда наблюдаю за библиотеками для Pytho для работы с  PDF и в один прекрасный день я столкнулся с pdfrw. Это похоже на аналог pyPDF, так как позволяет Вам читать и записывать PDFы, объединять их и использовать Reportlab для пометки их водяными знаками, кроме всего прочего. Проект немного мёртв, так как последнее обновление было в 2011 году, но с учётом того, что pyPDF обновлялся в 2010 — это не так уж и плохо. В этой  статье мы проведём небольшой тест-драйв pdfrw и посмотрим, на что он годен. Поехали!
Заметка об установке: К сожалению у этой библиотеки нет скрипта setup.py, так что Вам придётся получить исходники с Google Code а затем скопировать папку pdfrw в site-packages или в ваш virtualenv.

Соединяем PDFы при помощи pdfrw

Достаточно простая задача:
from pdfrw import PdfReader, PdfWriter
 
pages = PdfReader(r'C:UsersmdriscollDesktop1.pdf', decompress=False).pages
other_pages = PdfReader(r'C:UsersmdriscollDesktop2.pdf', decompress=False).pages
 
writer = PdfWriter()
writer.addpages(pages)
writer.addpages(other_pages)
writer.write(r'C:UsersmdriscollDesktopout.pdf')
Что мне показалось интересным — так это возможность добавить метаданные в файл перед тем, как Вы его сохраните:
writer.trailer.Info = IndirectPdfDict(
Title = 'My Awesome PDF',
Author = 'Mike',
Subject = 'Python Rules!',
Creator = 'myscript.py',
)
Вот пример того, как соединить PDFы при помощи pdfrw и reportlab:
# http://code.google.com/p/pdfrw/source/browse/trunk/examples/rl1/subset.py
import sys
import os
 
from reportlab.pdfgen.canvas import Canvas
 
import find_pdfrw
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
 
 
def go(inpfn, firstpage, lastpage):
firstpage, lastpage = int(firstpage), int(lastpage)
outfn = 'subset_%s_to_%s.%s' % (firstpage, lastpage, os.path.basename(inpfn))
 
pages = PdfReader(inpfn, decompress=False).pages
pages = [pagexobj(x) for x in pages[firstpage-1:lastpage]]
canvas = Canvas(outfn)
 
for page in pages:
canvas.setPageSize(tuple(page.BBox[2:]))
canvas.doForm(makerl(canvas, page))
canvas.showPage()
 
canvas.save()
 
if __name__ == '__main__':
inpfn, firstpage, lastpage = sys.argv[1:]
go(inpfn, firstpage, lastpage)
На мой взгляд — так это клёво. У Вас есть несколько альтернатив pyPDF’у. Кроме того, в пакете Вы найдёте ещё несколько интересных примеров, например:
  1. Как использовать pdf (одна страница) для фона для других страниц при помощи platypus.
  2. Как добавить водяной знак
Я думаю, у этого проекта большой потенциал. К счастью, мы можем проявить к нему достаточно интереса, чтобы снова запустит его, ну или найти что-то новенькое.

Автор: Ishayahu Lastov

Python Настройка Path в Windows

Для новичков сейчас не совсем понятно, что это такое. Сейчас разъясню.

Мы можем писать программу, но её нужно как то запускать. Не совсем понимаю, почему это не предусмотрено при установке питона… Разработчики наверное думают, что все в интернете профессиональные программисты.

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

pylibftdi v0.10 released (Перевод)

Я недавно выпустил версию 0.10 pylibftdi — «минимального питонного интерфейса для libftdi», предназначенного для наиболее лёгкого (из всех возможных?) способов работы с чипами и модулями FTDI имитирующими последовательный порт при подключении к usb. Версия 0.10 добавляет несколько новых возможностей и исправляет несколько ошибок.
Долгое время я был в плену заблуждения, что номера версий должны соответствовать правилам десятичной системы, и что после версии 0.9 должна идти версия 1.0. Но, поскольку, я хочу, чтобы версия 1.0 была стабильной (а нынешний статус я всё ещё рассматриваю как «бета»), я попал в тупик. В итоге я решил, что новая версия будет иметь номер 0.10. В любом случае, я всё ещё хочу улучшить документацию (и не только) перед выпуском 1.0.
Изменения в 0.10
  • Запуск юнит-тестов теперь проще благодаря некоторым реорганизациям — просто выполните python -m unittest discover в папке верхнего уровня
  • Поддержка устройств FT232H — это другой PID (USB product ID) для тех устройств, которые я раньше использовал — в основном FT245BM/RL, FT232R/RL. Все эти устройства имели PID 0x6001, тогда как новый FT232H имел PID 0x6014. Я экспериментировал с дополнительными параметрами для определения VID и PID целевого устройства, но это оказалось слишком сложно для конечного пользователя, а я бы хотел, чтобы pylibftdi можно было бы использовать с параметрами по умолчанию для большинства основных операций. В итоге я взял два списка (USB_VID_LIST,USB_PID_LIST) и код поиска устройства должен просто провести итерации по их декартову произведению (то есть вложенный цикл, реализованный через itertools.product). Так что добавление новых PID в будущем будет простым — надо лишь добавить его в  USB_VID_LIST, и тогда устройство может быть открыто без параметров конструктором Device() если на USB шине есть только FTDI устройство.
  • Устройство при открытии устанавливается в параллельный режим. В рассылке libftdi был спор о том, как эту логику реализовать, но в pylibftdi это сделать достаточно легко. Вообще это позволяет избежать неопределённого состояния, так как раньше, если предыдущее приложение, которое работало с устройством в режиме BitBang, то новое открытие устройства при помощи Device() отрывало его тоже в режиме BitBang, а не в ожидаемом  параллельном режиме (для устройств, которые поддерживают оба режима).
  • В конструктор Device() добавлен параметр 'buffer_size' (по умолчанию равен 0, что соответствует поведению раньше), который разбивает на куски операции чтения и записи. Это позволяет избежать проблемы, когда вызов (например) dev.write ('hello' * 100000) при передаче 9600 занимал невероятно много времени, а так как он протекал в контексте библиотеки (через вызов ctypes), его нельзя было прервать при помощи Ctrl-C
  • Убрана устаревшая возможность использовать Driver() как синоним Device()
  • Обновлено: Я уже сделал два дополнительных релиза в последние часы — текущая версия — 0.10.2. Одним из значимых изменений является то, что теперь субпакет exmaples включён в sdist, так что python -m pylibftdi.examples.led_flash будет работать, если у Вас диод подключён к D0 на устройстве.
Планы на будущее: причесать, добавить примеры, улучшить документацию…

Автор: Ishayahu Lastov