Python Modüllerini PyPi Üzerinde Paylaşmak

Python

Python

Merhaba bu yazıda Python ile yazdığımız paketlerin PyPi üzerinde nasıl paylaşılacağını anlatacağım. Aslında rivayet odur ki ben bu yazıyı yazmışım. Yaklaşık 4 yıl önce. Ama tekrar yazmanın zararı yok.

Kevser Sırça şöyle bir tweet atmıştı

https://twitter.com/kevsersrca/status/920716435852230656

PyPi Nedir?

İşin fransızlarına gem, npm, nuget, composer dersem anlaşılır olabilir sanırım. Kendi projeleri için python modülleri yazan abiler, bu modülleri başkaları da kullanmalı diyerek PyPi üzerine yüklemeler gerçekleştirirler. Bizler de sonraları bu modülleri kullanırız.

pip install django==1.11

Bash komutu django kurulumunu gerçekleştirecektir. Siz de benim atomu parçalayan modülümün herkesçe kullanılmasını isteyenlerdenim diyorsanız bu yazı tam size göre.

Başlamadan Önce

https://pypi.python.org/pypi adresinden (yeni sekmede açın) bir hesap oluşturalım. Burada kullanacağınız parola büyüklü küçüklü harf ve rakam içeren türden olmalı. PGP alanı için bir zorunluluk bulunmamakta.

Aynı kayıt işlemini Test sitesi için de gerçekleştirelim. Bu Python modülleri için test adresidir. https://testpypi.python.org/pypi. Aslında bu çok önemli değil ama buraya kayıt olun siz.

Kayıt olurken aynı kullanıcı adı ve parola ile kayıt olmanız neydi lan benim hesap bilgileri gibi sorular sormanıza da engel olacaktır.

Bu test üyeliğini biraz sonra göreceğimiz ayar dosyasında belirtebiliriz.

.pypirc

Python modüllerini yukarıya atarken yetkilendirme işlemlerini sağlayacağımız pypirc dosyasını nano yardımıyla oluşturalım.

nano ~/.pypirc

Örnek bir .pypirc dosyası şöyle olmalı

[distutils]
index-servers =
  pypi
  testpypi

[pypi]
repository=repository=https://upload.pypi.org/legacy/
username=KULLANICI_ADINIZ
password=ÇOKTA_GİZLİ_OLMAYAN_PAROLANIZ

[testpypi]
repository=https://test.pypi.org/legacy/
username=KULLANICI_ADINIZ
password=ÇOKTA_GİZLİ_OLMAYAN_PAROLANIZ

CTRL + x ve Y yaparak dosyayı kaydedin. Dikkat ettiyseniz eğer test ve gerçek depo adresi için kullanıcı adı ve parola bilgileri ayrı ayrı veriliyor.

Proje Yapısı

Proje adını say_hello olarak verdiğimizi varsayalım. Bu projenin yapısı şöyle olmalıdır:

say_hello/
        setup.py
        setup.cfg
        LICENSE.txt
        README.md
        paketimiz/
            __init__.py
            hello.py
            merhaba.py

Burada yer alan hello.py ve merhaba.py projenizde yer alan dosyalar olacaktır. Bu adımdan sonra setup.py dosyasını oluşturmalıyız. Bu dosya projenin temel bilgilerini saklıyor olacak. Kısacası metadata diyebiliriz.

setup.py Dosyası

Bu dosya için distutils modülünü import etmeliyiz.

from distutils.core import setup

Genel olarak kodları vereyim ve açıklamasını yapayım:

setup(
    name = 'paketimiz',
    packages = ['paketimiz'],
    version = '0.1',
    description = 'Sağa sola selam veren garip bir uygulama',
    author = 'Ali GÖREN',
    author_email = '[email protected]',
    url = 'https://github.com/aligoren/paketimiz',
    download_url = 'https://github.com/aligoren/paketimiz/archive/ilk.tar.gz',
    keywords = ['selam', 'naber', 'bilmemki'],
    classifiers = [],
)

Packages kısmında yer alan değer, name değeriyle aynı olmalı. Diğer kısımlar açıkcası çok zorlayıcı değil. Proje url’i için github vermek zorunlu değil. Ancak çoğu kişi bu adresi veriyor. İsterseniz download_url kısmına kendi sitenizin adresini de verebilirsiniz. Ayrıca paket için gerekli keywordleri mantıklı bir şekilde seçmeniz, erişilebilir olmasına imkan tanıyacaktır.

setup.cfg

Asıl metadata bilgisinin yani proje açıklama bilgisinin girileceği (markdown olabilir, rst olabilir) yer burası. Direkt bir açıklama girmek yerine oluşturduğumuz readme dosyasını kullanabiliriz:

[metadata]
description-file=README.md

Her şey tamam ise şu komutu çalıştırıp öncelikle dist klasörümüzü oluşturalım. python setup.py sdist Bu komut oluşturduğumuz projeyi arşiv dosyası halinde dist klasörü altına oluşturacaktır.

Örneğin paket adımız mehmet olsun. Bunun oluşan arşiv dosyası adı mehmet-VERSIYON.tar.gz şeklinde olacaktır.

twine Kurulumu

Her şey hazır, şimdi twine kurulumuna geçelim. Python dokümantasyonlarında da kullanılan twine ile paketlerimizi yukarıya atılabilir hale getiriyoruz. Bu paketleri hem PyPi live hem de PyPi test üzerine yollayabiliriz yani.

sudo pip install twine

Bu komutla twine kurulumunu yapalım ve sonraki adıma geçelim.

Test Sitesi Üzerinde Kontrol

Yazının başından da hatırlayacağınız gibi hem test hem de live için kayıt olduk. Bu paketi öncelikle test üzerinde kontrol edelim.

twine register dist/ARSIV_DOSYAMIZ.tar.gz  -r testpypi

Eğer HTTPError: 410 Client Error: Project pre-registration is no longer required or supported, so continue directly to uploading files. hatası alırsanız

twine upload dist/ARSIV_DOSYAMIZ.tar.gz  -r testpypi

komutunu kullanarak yukarıya direkt gönderebilirsiniz. TestPyPi sitesinde sağ tarafa bakarsak yayınladığımız paket oralarda boş boş durmakta.

Burada yer alan -r flag ise hangi repository üzerinde paketin gönderileceğini belirtiyor. Kısacası şu an hala test modülünde çalışıyoruz. Bunu live PyPi üzerine atalım.

Bunun için direkt olarak upload komutunu kullanalım ve dist altında yer alan tüm dosyaları belirtelim. Zorunlu değil. Eğer isterseniz tek bir dosyayı da seçebilirsiniz.

twine upload dist/paketimiz-0.1.tar.gz  

Uploading distributions to https://upload.pypi.org/legacy/
Uploading paketimiz-0.1.tar.gz

Dosyamız yüklendikten sonra gerçekten live üzerinde yer alıyor mu kontrol etmeliyiz. Basitçe paketimizi kuralum pip install paketimiz

Ardından ben Python3 ile deniyorum

>>> from paketimiz import hello
>>> hello.msg()
Hello world