Nacházíte se zde: Domů Ponořme se do Pythonu 3

Úroveň obtížnosti: ♦♦♦♦♢

Balení pythonovských knihoven

You’ll find the shame is like the pain; you only feel it once.
(Zjistíte, že stud je jako bolest; ale cítíte ho jen jednou.)
— Markýza de Merteuil, Dangerous Liaisons (Nebezpečné známosti)

 

Ponořme se

Opravdoví umělci prodávají. Alespoň takhle to říká Steve Jobs. Chcete vydat pythonovský skript, knihovnu, rámec (framework) nebo aplikaci? Výborně. Svět potřebuje více pythonovského kódu. Python 3 se dodává s rámcem pro vytváření balíčků zvaným Distutils. Distutils v sobě skrývá mnoho věcí: nástroj pro sestavení (build tool; pro vás), instalační nástroj (pro vaše uživatele), formát metadat balíčků (pro vyhledávače) a další. Tvoří celek s Python Package Index („PyPI“), což je centrální archiv pythonovských open-source knihoven.

Všechny uvedené stránky nástroje Distutils jsou soustředěny kolem instalačního skriptu, který se tradičně nazývá setup.py. Ve skutečnosti už jste v této knize několik instalačních skriptů vytvořených nástrojem Distutils viděli. Distutils jste použili k instalaci httplib2 v kapitole Webové služby nad HTTP a znovu k instalaci chardet v Případové studii: Přepis chardet pro Python 3.

V této kapitole si prostudujeme, jak instalační skripty pro chardet a pro httplib2 pracují, a projdeme si procesem vydání vašeho vlastního pythonovského softwaru.

# chardet's setup.py
from distutils.core import setup
setup(
    name = "chardet",
    packages = ["chardet"],
    version = "1.0.2",
    description = "Universal encoding detector",
    author = "Mark Pilgrim",
    author_email = "mark@diveintomark.org",
    url = "http://chardet.feedparser.org/",
    download_url = "http://chardet.feedparser.org/download/python3-chardet-1.0.1.tgz",
    keywords = ["encoding", "i18n", "xml"],
    classifiers = [
        "Programming Language :: Python",
        "Programming Language :: Python :: 3",
        "Development Status :: 4 - Beta",
        "Environment :: Other Environment",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
        "Operating System :: OS Independent",
        "Topic :: Software Development :: Libraries :: Python Modules",
        "Topic :: Text Processing :: Linguistic",
        ],
    long_description = """\
Universal character encoding detector
-------------------------------------

Detects
 - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
 - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
 - EUC-JP, SHIFT_JIS, ISO-2022-JP (Japanese)
 - EUC-KR, ISO-2022-KR (Korean)
 - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
 - ISO-8859-2, windows-1250 (Hungarian)
 - ISO-8859-5, windows-1251 (Bulgarian)
 - windows-1252 (English)
 - ISO-8859-7, windows-1253 (Greek)
 - ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
 - TIS-620 (Thai)

This version requires Python 3 or later; a Python 2 version is available separately.
"""
)

chardet a httplib2 jsou open source, ale neexistuje žádný požadavek na to, abyste své vlastní pythonovské knihovny vydávali pod nějakou konkrétní licencí. Proces popisovaný v této kapitole bude fungovat pro libovolný pythonovský software, nezávisle na licenci.

Věci, které za nás Distutils neudělají

Vypuštění vašeho prvního pythonovského balíčku je skličující proces. (Uvolnění vašeho druhého balíčku je o něco snazší.) Distutils se celý proces snaží zautomatizovat, jak jen to je možné. Ale některé věci prostě musíte udělat sami.

Struktura adresáře

Vytváření balíčku pro váš pythonovský software začíná tím, že si musíte udělat pořádek v souborech a v adresářích. Adresář httplib2 vypadá takto:

httplib2/                 
|
+--README.txt             
|
+--setup.py               
|
+--httplib2/              
   |
   +--__init__.py
   |
   +--iri2uri.py
  1. Vytvořte kořenový adresář, ve kterém bude všechno. Dejte mu stejné jméno, jaké má váš pythonovský modul.
  2. Abyste se přizpůsobili uživatelům Windows, měl by váš soubor „read me“ použít příponu .txt a měl by používat windowsovské konce řádků. To, že vy používáte nějaký fantastický editor, který se dá spouštět z příkazového řádku a má i svůj makro jazyk, neznamená, že byste měli ztěžovat život svým uživatelům. (Vaši uživatelé používají „Notepad“, česky „Poznámkový blok“. Je to smutné, ale je to tak.) Váš oblíbený editor má nepochybně volbu pro ukládání souborů s windowsovskými konci řádků — i když pracujete v Linuxu nebo s Mac OS X.
  3. Váš instalační skript využívající Distutils by měl být pojmenován setup.py — pokud nemáte dobrý důvod pro to, aby se jmenoval jinak. A vy nemáte dobrý důvod, aby se jmenoval jinak.
  4. Pokud se váš pythonovský software skládá z jediného souboru s příponou .py, měli byste jej umístit do kořenového adresáře spolu se svým souborem „read me“ a se svým instalačním skriptem. Ale httplib2 se neskládá z jediného .py souboru. Je to vícesouborový modul. Ale to je v pořádku! Adresář httplib2 umístěte do kořenového adresáře, takže budete mít soubor __init__.py umístěn v adresáři httplib2/ v kořenovém adresáři httplib2/. Nehledejte v tom problém. Ve skutečnosti to zjednoduší proces vytváření balíčku.

Adresář chardet vypadá trochu jinak. Stejně jako u httplib2 jde o vícesouborový modul, takže tu máme adresář chardet/ uvnitř kořenového adresáře chardet/. K souboru README.txtchardet navíc HTML dokumentaci, umístěnou v adresáři docs/. Adresář docs/ obsahuje několik souborů s příponami .html a .css a podadresář images/, který obsahuje několik souborů s příponami .png a .gif. (To bude důležité později.) V souladu s konvencemi pro software s licencí (L)GPL obsahuje také samostatný soubor zvaný COPYING.txt, který obsahuje kompletní text LGPL.


chardet/
|
+--COPYING.txt
|
+--setup.py
|
+--README.txt
|
+--docs/
|  |
|  +--index.html
|  |
|  +--usage.html
|  |
|  +--images/ ...
|
+--chardet/
   |
   +--__init__.py
   |
   +--big5freq.py
   |
   +--...

Píšeme svůj instalační skript

Instalační skript pro Distutils je pythonovský skript. Teoreticky by mohl dělat vše, co lze dělat v pythonovských skriptech. Prakticky by toho měl dělat co nejméně a co nejstandardnějším způsobem. Instalační skript by měl být nudný. Čím exotičtější bude váš instalační proces, tím exotičtější budou hlášení o chybách.

První řádek každého instalačního skriptu pro Distutils je vždycky stejný:

from distutils.core import setup

Importujeme funkci setup(), která je hlavním vstupním bodem rámce Distutils. 95 % všech distutilsovských skriptů se skládá z jediného volání funkce setup() a z ničeho jiného. (Tuhle statistiku jsem si právě vymyslel, ale pokud váš distutilsovský skript dělá něco víc než volání funkce setup() z Distutils, měli byste pro to mít dobrý důvod. A máte pro to dobrý důvod? Myslím, že ne.)

Funkce setup() přebírá celou řadu parametrů. V zájmu zachování duševního zdraví všech zúčastněných musíte pro každý parametr používat pojmenované argumenty. Není to jen nějaká konvence. Je to tvrdý požadavek. Pokud se pokusíte o volání funkce setup() s nepojmenovanými argumenty, váš instalační skript zhavaruje.

Následující pojmenované argumety jsou povinné:

Ačkoliv to není povinné, doporučuji, abyste ve svém instalačním skriptu uvedli také následující:

Metadata instalačního skriptu jsou definována v PEP 314.

Teď se podíváme na instalační skript pro chardet. Používá všechny zmíněné povinné a doporučené parametry a ještě jeden, o kterém jsem se zatím nezmínil: packages.

from distutils.core import setup
setup(
    name = 'chardet',
    packages = ['chardet'],
    version = '1.0.2',
    description = 'Universal encoding detector',
    author='Mark Pilgrim',
    ...
)

Parametr packages zvýrazňuje jedno nešťastné překrývání významů slov během distribučního procesu. O slově „balíček/balík“ (package) jsme se bavili jako o něčem, co vytváříme (a co se potenciálně vypisuje v seznamu PyPI). Jenže to není tím, na co se parametr packages odkazuje. Vztahuje se ke skutečnosti, že chardet je vícesouborovým modulem, kterému se také někdy říká… „package“ (balíček). Parametr packages nástroji Distutils říká, aby do procesu zahrnul adresář chardet/, jeho soubor __init__.py a všechny ostatní soubory s příponou .py, ze kterých se modul chardet skládá. To je docela důležité. Veškerá radostná rozprava o dokumentaci a metadatech je k ničemu, pokud zapomenete přibalit skutečný kód!

Přidáváme klasifikaci našeho balíčku

The Python Package Index („PyPI“) obsahuje tisíce pythonovských knihoven. Ostatní lidé najdou váš balíček snadněji, když použijete správná klasifikační metadata. PyPI vám umožní prohlížet balíčky uspořádané podle klasifikátorů. Pro zúžení nabídky při vyhledávání můžete vybrat dokonce více klasifikátorů. Klasifikátory prostě nejsou jen neviditelná metadata, která byste mohli ignorovat!

Klasifikaci svého softwaru provedete předáním parametru classifiers distutilovské funkci setup(). Parametr classifiers má podobu seznamu řetězců. Ale tyto řetězce nemají volný formát. Všechny klasifikační řetězce by měly pocházet z tohoto seznamu na PyPI.

Klasifikátory jsou nepovinné. Můžete napsat distutilovský instalační skript bez jakýchkoliv klasifikátorů. Nedělejte to. Měli byste vždy uvést alespoň následující klasifikátory:

Doporučuji, abyste uvedli i následující klasifikátory:

Příklady dobrých klasifikátorů balíčků

Jako příklad uveďme klasifikátory pro Django, což je multiplatformní aplikační rámec (framework), který můžete spouštět na svém webovém serveru. Dodává se pod licencí BSD a je využitelný pro ostrý provoz (production-ready). (Django zatím není kompatibilní s Pythonem 3, takže není uveden klasifikátor Programming Language :: Python :: 3.)

Programming Language :: Python
License :: OSI Approved :: BSD License
Operating System :: OS Independent
Development Status :: 5 - Production/Stable
Environment :: Web Environment
Framework :: Django
Intended Audience :: Developers
Topic :: Internet :: WWW/HTTP
Topic :: Internet :: WWW/HTTP :: Dynamic Content
Topic :: Internet :: WWW/HTTP :: WSGI
Topic :: Software Development :: Libraries :: Python Modules

Tady jsou klasifikátory pro chardet, což je knihovna pro detekci znakového kódování, kterou jsme se zabývali v Případové studii: Přepis chardet pro Python 3. chardet je ve stadiu beta, je multiplatformní, kompatibilní s Pythonem 3, pod licencí LGPL a je určena pro vývojáře, kteří ji mohou začlenit do svých vlastních produktů.

Programming Language :: Python
Programming Language :: Python :: 3
License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
Operating System :: OS Independent
Development Status :: 4 - Beta
Environment :: Other Environment
Intended Audience :: Developers
Topic :: Text Processing :: Linguistic
Topic :: Software Development :: Libraries :: Python Modules

A tady jsou klasifikátory pro httplib2, což je knihovna, o které jsme se bavili v kapitole Webové služby nad HTTP. httplib2 je ve stadiu beta, multiplatformní, pod licencí MIT a je učena pro pythonovské vývojáře.

Programming Language :: Python
Programming Language :: Python :: 3
License :: OSI Approved :: MIT License
Operating System :: OS Independent
Development Status :: 4 - Beta
Environment :: Web Environment
Intended Audience :: Developers
Topic :: Internet :: WWW/HTTP
Topic :: Software Development :: Libraries :: Python Modules

Určení dalších souborů prostřednictvím manifestu

Pokud neurčíme jinak, zahrnou Distutils do vašeho instalačního balíčku následující soubory:

Tímto způsobem lze pokrýt všechny soubory projektu httplib2. Ale u projektu chardet potřebujeme zařadit i licenční soubor COPYING.txt a celý adresář docs/, který obsahuje obrázky a HTML soubory. Pokud chceme Distutils říci, aby byly při tvorbě instalačního balíčku chardet zařazeny i tyto dodatečné soubory a adresáře, musíme použít soubor s manifestem (manifest file).

Soubor s manifestem je textový soubor s názvem MANIFEST.in. Umístíme jej do kořenového adresáře projektu, vedle souborů README.txt a setup.py. Soubory s manifestem nejsou pythonovské skripty. Jsou to textové soubory, které obsahují posloupnosti „příkazů“ ve formátu pro Distutils. Příkazy manifestu nám umožňují zahrnovat nebo vyřazovat konkrétní soubory a adresáře.

Následuje celý obsah souboru manifestu pro projekt chardet:

include COPYING.txt                                
recursive-include docs *.html *.css *.png *.gif    
  1. První řádek je samovysvětlující: vložit soubor COPYING.txt z kořenového adresáře projektu.
  2. Druhý řádek je trochu složitější. Příkaz recursive-include přebírá jméno adresáře a jedno nebo víc jmen souborů. Jména souborů nemusí být uvedena explicitně. Mohou být vyjádřena zástupnými znaky (wildcards). Tento řádek znamená: „Vidíš adresář docs/ v kořenovém adresáři projektu? Najdi v něm (rekurzivně) soubory s příponami .html, .css, .png a .gif. Chci, aby byly všechny zařazeny do instalačního balíčku.“

Všechny příkazy manifestu zachovávají strukturu adresářů, která je vytvořena v kořenovém adresáři projektu. Uvedený příkaz recursive-include nenacpe všechny .html a .png soubory do kořenového adresáře instalačního balíčku. Dodrží existující strukturu adresáře docs/, ale zařadí do ní jen ty soubory, které odpovídají zadaným maskám se zástupnými znaky. (Dříve jsem se o tom nezmiňoval, ale dokumentace chardet je ve skutečnosti napsaná v XML a do HTML je převedena samostatným skriptem. Do instalačního balíčku nechci zařazovat zdrojové XML soubory, ale jen výsledné HTML soubory a obrázky.)

Soubory s manifestem mají svůj specifický formát. Detaily hledejte v dokumentech Specifying the files to distribute a The manifest template commands.

Zopakujme si to: soubor s manifestem musíme vytvářet jen v případě, kdy chceme zahrnout i soubory, které nástroj Distutils nevkládá automaticky. Pokud potřebujeme použít soubor s manifestem, měl by obsahovat jen jména souborů, která by jinak nástroj Distutils nenašel sám.

Kontrola chyb v našem instalačním skriptu

Musíme myslet na spoustu věcí. Distutils mají zabudovaný validační příkaz, který kontroluje, že náš instalační skript obsahuje všechna povinná metadata. Pokud například zapomeneme uvést parametr version, Distutils nám to připomenou.

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py check
running check
warning: check: missing required meta-data: version

Jakmile parametr version uvedeme (a všechny ostatní povinné části metadat), příkaz check dopadne takto:

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py check
running check

Vytvoření distribuce obsahující zdrojové texty

Distutils podporují tvorbu mnoha typů distribučních balíčků. Přinejmenším bychom měli vytvořit „distribuci zdrojů“ (source distribution), která obsahuje naše zdrojové texty s kódem, instalační skript pro Distutils, soubor „read me“ a jakékoliv další soubory, které chceme do distribuce zahrnout. Distribuci zdrojů vytvoříme tím, že instalačnímu skriptu Distutils zadáme příkaz sdist.

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py sdist
running sdist
running check
reading manifest template 'MANIFEST.in'
writing manifest file 'MANIFEST'
creating chardet-1.0.2
creating chardet-1.0.2\chardet
creating chardet-1.0.2\docs
creating chardet-1.0.2\docs\images
copying files to chardet-1.0.2...
copying COPYING -> chardet-1.0.2
copying README.txt -> chardet-1.0.2
copying setup.py -> chardet-1.0.2
copying chardet\__init__.py -> chardet-1.0.2\chardet
copying chardet\big5freq.py -> chardet-1.0.2\chardet
...
copying chardet\universaldetector.py -> chardet-1.0.2\chardet
copying chardet\utf8prober.py -> chardet-1.0.2\chardet
copying docs\faq.html -> chardet-1.0.2\docs
copying docs\history.html -> chardet-1.0.2\docs
copying docs\how-it-works.html -> chardet-1.0.2\docs
copying docs\index.html -> chardet-1.0.2\docs
copying docs\license.html -> chardet-1.0.2\docs
copying docs\supported-encodings.html -> chardet-1.0.2\docs
copying docs\usage.html -> chardet-1.0.2\docs
copying docs\images\caution.png -> chardet-1.0.2\docs\images
copying docs\images\important.png -> chardet-1.0.2\docs\images
copying docs\images\note.png -> chardet-1.0.2\docs\images
copying docs\images\permalink.gif -> chardet-1.0.2\docs\images
copying docs\images\tip.png -> chardet-1.0.2\docs\images
copying docs\images\warning.png -> chardet-1.0.2\docs\images
creating dist
creating 'dist\chardet-1.0.2.zip' and adding 'chardet-1.0.2' to it
adding 'chardet-1.0.2\COPYING'
adding 'chardet-1.0.2\PKG-INFO'
adding 'chardet-1.0.2\README.txt'
adding 'chardet-1.0.2\setup.py'
adding 'chardet-1.0.2\chardet\big5freq.py'
adding 'chardet-1.0.2\chardet\big5prober.py'
...
adding 'chardet-1.0.2\chardet\universaldetector.py'
adding 'chardet-1.0.2\chardet\utf8prober.py'
adding 'chardet-1.0.2\chardet\__init__.py'
adding 'chardet-1.0.2\docs\faq.html'
adding 'chardet-1.0.2\docs\history.html'
adding 'chardet-1.0.2\docs\how-it-works.html'
adding 'chardet-1.0.2\docs\index.html'
adding 'chardet-1.0.2\docs\license.html'
adding 'chardet-1.0.2\docs\supported-encodings.html'
adding 'chardet-1.0.2\docs\usage.html'
adding 'chardet-1.0.2\docs\images\caution.png'
adding 'chardet-1.0.2\docs\images\important.png'
adding 'chardet-1.0.2\docs\images\note.png'
adding 'chardet-1.0.2\docs\images\permalink.gif'
adding 'chardet-1.0.2\docs\images\tip.png'
adding 'chardet-1.0.2\docs\images\warning.png'
removing 'chardet-1.0.2' (and everything under it)

Tady bychom se měli zmínit o několika věcech:

c:\Users\pilgrim\chardet> dir dist
 Volume in drive C has no label.
 Volume Serial Number is DED5-B4F8

 Directory of c:\Users\pilgrim\chardet\dist

07/30/2009  06:29 PM    <DIR>          .
07/30/2009  06:29 PM    <DIR>          ..
07/30/2009  06:29 PM           206,440 chardet-1.0.2.zip
               1 File(s)        206,440 bytes
               2 Dir(s)  61,424,635,904 bytes free

Vytvoření grafického instalačního programu

Podle mého názoru si každá pythonovská knihovna zaslouží, aby byl pro uživatele Windows k dispozici grafický instalační program. Dá se udělat snadno (i když sami Windows nepoužíváte) a uživatelé Windows to ocení.

Distutils dovedou vytvořit grafický instalační program pro Windows za nás. Stačí, když instalačnímu skriptu pro Distutils zadáme příkaz bdist_wininst.

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py bdist_wininst
running bdist_wininst
running build
running build_py
creating build
creating build\lib
creating build\lib\chardet
copying chardet\big5freq.py -> build\lib\chardet
copying chardet\big5prober.py -> build\lib\chardet
...
copying chardet\universaldetector.py -> build\lib\chardet
copying chardet\utf8prober.py -> build\lib\chardet
copying chardet\__init__.py -> build\lib\chardet
installing to build\bdist.win32\wininst
running install_lib
creating build\bdist.win32
creating build\bdist.win32\wininst
creating build\bdist.win32\wininst\PURELIB
creating build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\big5freq.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\big5prober.py -> build\bdist.win32\wininst\PURELIB\chardet
...
copying build\lib\chardet\universaldetector.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\utf8prober.py -> build\bdist.win32\wininst\PURELIB\chardet
copying build\lib\chardet\__init__.py -> build\bdist.win32\wininst\PURELIB\chardet
running install_egg_info
Writing build\bdist.win32\wininst\PURELIB\chardet-1.0.2-py3.1.egg-info
creating 'c:\users\pilgrim\appdata\local\temp\tmp2f4h7e.zip' and adding '.' to it
adding 'PURELIB\chardet-1.0.2-py3.1.egg-info'
adding 'PURELIB\chardet\big5freq.py'
adding 'PURELIB\chardet\big5prober.py'
...
adding 'PURELIB\chardet\universaldetector.py'
adding 'PURELIB\chardet\utf8prober.py'
adding 'PURELIB\chardet\__init__.py'
removing 'build\bdist.win32\wininst' (and everything under it)
c:\Users\pilgrim\chardet> dir dist
c:\Users\pilgrim\chardet>dir dist
 Volume in drive C has no label.
 Volume Serial Number is AADE-E29F

 Directory of c:\Users\pilgrim\chardet\dist

07/30/2009  10:14 PM    <DIR>          .
07/30/2009  10:14 PM    <DIR>          ..
07/30/2009  10:14 PM           371,236 chardet-1.0.2.win32.exe
07/30/2009  06:29 PM           206,440 chardet-1.0.2.zip
               2 File(s)        577,676 bytes
               2 Dir(s)  61,424,070,656 bytes free

Tvorba instalačních balíčků pro jiné operační systémy

Distutils nám mohou pomoci vytvořit instalační balíčky pro uživatele Linuxu. Ale podle mého názoru to nestojí za tu námahu. Pokud chcete svůj software distribuovat v Linuxu, měli byste svůj čas raději věnovat spolupráci se skupinou lidí, kteří se specializují na vytváření softwarových balíčků pro hlavní distribuce Linuxu.

Například moji knihovnu chardet najdete v archivech pro Debian GNU/Linux (a tím pádem i v archivech pro Ubuntu). Nemusel jsem se o to vůbec starat. Balíčky se tam jednoho dne prostě objevily. Komunita kolem distribuce Debian má svá vlastní pravidla pro balení pythonovských knihoven a balíček python-chardet pro Debian je navržen tak, aby tyto konvence splňoval. A protože jsou balíčky umístěny v archivech Debianu, získávají uživatelé Debianu bezpečnostní aktualizace a/nebo nové verze podle toho, jaká systémová nastavení si pro údržbu svých počítačů zvolili.

Linuxovské balíčky vytvářené nástrojem Distutils žádnou z těchto výhod nenabízejí. Bude lepší, když svůj čas strávíte jiným způsobem.

Přidání našeho softwaru do Python Package Index

Nahrání našeho softwaru do Python Package Index představuje proces o třech krocích.

  1. Zaregistrujeme se.
  2. Zaregistrujeme svůj software.
  3. Uložíme (upload) balíčky, které jsme vytvořili příkazy setup.py sdist a setup.py bdist_*.

Registraci své osoby provedeme prostřednictvím registrační stránky pro uživatele PyPI. Vložíme své uživatelské jméno a heslo, poskytneme platnou e-mailovou adresu a klikneme na tlačítko Register. (Pokud máte klíč PGP nebo GPG, můžete jej uvést také. Pokud jej nemáte nebo nevíte, co to znamená, nedělejte si s tím starosti.) Zkontrolujeme svůj e-mail. Během několika minut bychom měli obdržet zprávu od PyPI s potvrzovacím odkazem. Registrační proces dokončíme tím, že na odkaz klikneme.

Teď zaregistrujeme u PyPI náš software a nahrajeme jej (upload). To vše můžeme provést v jediném kroku.

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py register sdist bdist_wininst upload  
running register
We need to know who you are, so please choose either:
 1. use your existing login,
 2. register as a new user,
 3. have the server generate a new password for you (and email it to you), or
 4. quit
Your selection [default 1]:  1                                                                 
Username: MarkPilgrim                                                                          
Password:
Registering chardet to http://pypi.python.org/pypi                                             
Server response (200): OK
running sdist                                                                                  
... output trimmed for brevity ...
running bdist_wininst                                                                          
... output trimmed for brevity ...
running upload                                                                                 
Submitting dist\chardet-1.0.2.zip to http://pypi.python.org/pypi
Server response (200): OK
Submitting dist\chardet-1.0.2.win32.exe to http://pypi.python.org/pypi
Server response (200): OK
I can store your PyPI login so future submissions will be faster.
(the login will be stored in c:\home\.pypirc)
Save your login (y/N)?n                                                                        
  1. Když svůj projekt zveřejníme poprvé, přidají Distutils náš software do Python Package Index a přidělí mu jeho vlastní URL. Při dalších přístupech jednoduše aktualizují metadata projektu podle změn, které uvedeme v parametrech našeho setup.py. Poté se vytvoří distribuce zdrojů (source distribution; sdist) a instalátor pro Windows (bdist_wininst) a nahrají se do PyPI (upload).
  2. Vybereme „use your existing login“ (použij svůj existující účet) napsáním 1, nebo prostě stiskneme ENTER.
  3. Napíšeme uživatelské jméno a heslo, která jsme si zvolili na registrační stránce PyPI. Distutils neopisují zadávané heslo. Místo zadávaných znaků nevypisují ani hvězdičky. Prostě napíšeme heslo a stiskneme ENTER.
  4. Distutils zaregistrují náš balíček v archivu Python Package Index…
  5. …vytvoří distribuci našich zdrojů (source distribution)…
  6. …vytvoří instalátor pro Windows…
  7. …a nahrají (upload) oba do Python Package Index.
  8. Pokud chceme proces zveřejňování nových verzí zautomatizovat, musíme uložit osobní údaje pro PyPI do lokálního souboru. Je to zcela proti zásadám bezpečnosti a zcela nepovinné.

Gratuluji. Teď už máte svoji vlastní stránku na Python Package Index! Její adresa je http://pypi.python.org/pypi/JMENO, kde JMENO je řetězec, který jste předali parametrem name ve svém souboru setup.py.

Pokud chceme zveřejnit novou verzi, upravíme ve svém souboru setup.py číslo verze a spustíme proces nahrávání (upload) znovu:

c:\Users\pilgrim\chardet> c:\python31\python.exe setup.py register sdist bdist_wininst upload

Více možných budoucností balení pythonovských produktů

Distutils nejsou jediným nástrojem pro vytváření pythonovských balíčků, ale v době psaní tohoto textu (srpen 2009) to byl jediný rámec pro vytváření instalačních balíčků, který fungoval v Pythonu 3. Pro Python 2 existuje řada dalších rámců. Některé se soustředí na instalaci, jiné na testování a distribuci (deployment). Některé z nich možná budou přepsány pro Python 3.

Následující rámce (frameworks) jsou zaměřeny na instalaci:

Následující se zaměřují na testování a distribuci:

Přečtěte si

O Distutils:

O ostatních rámcích pro vytváření balíčků:

© 2001–11 Mark Pilgrim