Python modülü / paketi nasıl yazılır?


375

İşteki basit görevler için Python komut dosyaları hazırladım ve başkalarının kullanması için onları paketlemekten hiç rahatsız olmadım. Şimdi bir REST API için bir Python sarıcı yapmak için atandım. Nasıl başlayacağım konusunda hiçbir fikrim yok ve yardıma ihtiyacım var.

Neyim var:

(Sadece mümkün olduğunca spesifik olmak istiyorum) Virtualenv hazır var, aynı zamanda github , python için .gitignore dosyası da var, artı, REST API ile etkileşim için istek kütüphanesi . Bu kadar.

İşte mevcut dizin ağacı

.
├── bin
   └── /the usual stuff/
├── include
   └── /the usual stuff/
├── lib
   └── python2.7
       └── /the usual stuff/
├── local
   └── /the usual stuff/
└── README.md

27 directories, 280 files

.Py dosyalarını nereye koyacağımı bile bilmiyorum.

Ne yapmak istedim:

Python modülünü "pip install ..." ile kurabilir hale getirin

Mümkünse, Python modüllerini yazma konusunda genel bir adım adım işlem istiyorum.


15
Ben öğretici (2.7) bölüm 6 ile başlayacağım , ya da burada 3.x için Python modülü öğretici için internette arama ve diğer birçok bol bulacaksınız.
Roland Smith

6
Kimse pip bölüme cevap verdi
whackamadoodle3000

github.com/MacHu-GWU/pygitrepo-project bu kütüphane sıfırdan proje iskeleti oluşturmanıza yardımcı olur ve ihtiyacınız olan özellik kullanıma hazırdır .
MacSanhe

Yanıtlar:


424

Modül, Python tanımlarını ve ifadelerini içeren bir dosyadır. Dosya adı, sonek içeren modül adıdır.py

Oluşturun hello.pyve içeriği olarak aşağıdaki işlevi yazın:

def helloworld():
   print "hello"

Ardından şunları içe aktarabilirsiniz hello:

>>> import hello
>>> hello.helloworld()
'hello'
>>>

Birçok .pydosyayı gruplamak için bir klasöre koyun. İle herhangi bir klasör __init__.pypython tarafından bir modül olarak kabul edilir ve onlara bir paket diyebilirsiniz

|-HelloModule
  |_ __init__.py
  |_ hellomodule.py

Modülünüzdeki import deyimi ile her zamanki gibi devam edebilirsiniz.

Daha fazla bilgi için 6.4'e bakınız . Paketler .


7
sonuncusu şu olurdu: HellowModule ithal hellomodule? Bu modül klasöründe merhaba olabilir, bu yüzden HelloModule import hello'dan olurdu
nycynik

Şu anda Python ile oynamak ve bu cevap karşılaştığım en yararlı biri olmak zorunda. Bunu çok iyi açıklıyor, teşekkürler.
Darren Wainwright

"pip install" komutu çalışmaz, ayrıca kullanmak için aynı dizinde olmanız gerekir
Math Coder 101

234

Python 3 - 18 Kasım 2015 GÜNCELLEME

Kabul edilen cevabı faydalı buldum, ancak kendi deneyimlerime dayanarak başkalarının yararına birkaç noktaya genişletmek istedim.

Modül: Modül, Python tanımlarını ve ifadelerini içeren bir dosyadır. Dosya adı, .py sonekinin eklendiği modül adıdır.

Modül Örnek : Geçerli dizinde tek bir python betiğimiz olduğunu varsayalım , burada buna mymodule.py diyorum

Mymodule.py dosyası aşağıdaki kodu içerir:

def myfunc():
    print("Hello!")

Biz geçerli dizinden python3 tercüman bitmesi durumunda ithalat ve fonksiyon çalıştırabilirsiniz MyFunc (genellikle sadece aşağıdakilerden birini seçsin) aşağıdaki farklı şekillerde:

>>> import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mymodule import myfunc
>>> myfunc()
Hello!
>>> from mymodule import *
>>> myfunc()
Hello!

Tamam, bu yüzden yeterince kolaydı.

Şimdi, modülün geçerli çalışma dizininden geçici olarak çalıştırmak yerine, modül ad alanı sağlamak için bu modülü kendi özel klasörüne koymanız gerektiğini varsayalım. Bu, bir paket kavramını açıklamaya değer .

Paket : Paketler, “noktalı modül adları” kullanarak Python'un modül ad alanını yapılandırmanın bir yoludur. Örneğin, AB modül adı, A adlı bir pakette B adlı bir alt modülü belirtir. Modüllerin kullanımı, farklı modüllerin yazarlarını, birbirlerinin küresel değişken adları hakkında endişelenmek zorunda kalmadan kurtarır gibi, noktalı modül adlarının kullanımı yazarları kurtarır. Numune veya Python Görüntüleme Kütüphanesi gibi çok modüllü paketlerin birbirlerinin modül adları hakkında endişelenmelerine gerek yoktur.

Paket Örneği : Şimdi aşağıdaki klasör ve dosyalara sahip olduğumuzu varsayalım. Burada, mymodule.py öncekiyle aynıdır ve __init__.py boş bir dosyadır:

.
└── mypackage
    ├── __init__.py
    └── mymodule.py

__İnit__.py dosyaları, Python'un dizinleri paket olarak ele almasını sağlamak için gereklidir. Daha fazla bilgi için lütfen daha sonra verilen Modül belgelerine bakın.

Şu anki çalışma dizinimiz, mypackage adlı sıradan klasörün bir düzey üstünde

$ ls
mypackage

Şimdi python3 yorumlayıcısını çalıştırırsak , gerekli işlev myfunc'u içeren mymodule.py modülünü aşağıdaki farklı yollarla içe aktarabilir ve çalıştırabiliriz (genellikle aşağıdakilerden birini seçersiniz):

>>> import mypackage
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> import mypackage.mymodule
>>> mypackage.mymodule.myfunc()
Hello!
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mypackage.mymodule import myfunc
>>> myfunc()
Hello!
>>> from mypackage.mymodule import *
>>> myfunc()
Hello!

Python 3 varsayarsak, mükemmel belgeler var: Modüller

Paketler ve modüller için adlandırma kuralları açısından, genel yönergeler PEP-0008'de verilmiştir - lütfen Paket ve Modül Adlarına bakın

Modüllerin kısa, tamamen küçük harfli adları olmalıdır. Okunabilirliği geliştirirse, modül adında alt çizgiler kullanılabilir. Alt çizgi kullanımı önerilmez, ancak Python paketlerinin de kısa, tümü küçük harfli adları olmalıdır.


5
Güzel basit bir açıklama. Paketimin içinde başka bir klasör tutmak isterseniz ne olur?
Anuj Gupta

3
İçerme tamamen yazdıklarınıza bağlıdır. Modülünüzdeki bir işlevin dışına bir şey koyarsanız, benzer şekilde çağırdığınızda onu tetiklersiniz import mypackage. Bir modülden (hatta bir dosyadan) sadece bir fonksiyonu içe aktarmak istediğinizde kullanmak daha iyidir from module import function. Bir alt klasör olması durumunda, diğer kod parçalarını ateşlemeden from subfolder.module import functionarayabilirsiniz function(). Ayrıca, from module import *gerçekten ihtiyacınız yoksa kullanmayın .
m3nda

5
Geriye kalan tek soru, paketin her şeyi içe aktarmasını nasıl sağlayabilirim import mypackage? Ekleme import mymoduleiçin __init__.pyçalışma yapmaz ..
576i

Düzgün bir açıklama! Ancak, numpy bir paket olup olmadığı konusunda bir sorum var, yorumcumda numpy.cos (1) i nasıl yürütebilirim, çünkü aradaki modül adı gibi görünüyor. Hayır?
user1935724

3
Pip'e ne dersin?
whackamadoodle3000

199

Hiç kimse OP'nin bu sorusunu henüz ele almadığından:

Ne yapmak istedim:

Python modülünü "pip install ..." ile kurabilir hale getirin

İşte mutlak minimum örnek hazırlama ve kullanma PyPI için paketi yükledikten temel aşamalarını gösteren setuptoolsve twine.

Bu hiçbir şekilde en azından öğreticiyi okumak için bir alternatif değildir, bu çok temel örnekte kapsanmaktan çok daha fazlası vardır.

Paketin kendisinin oluşturulması zaten burada başka cevaplarla kaplıdır, bu yüzden bu adımı ele aldığımızı ve proje yapımızın şöyle olduğunu varsayalım:

.
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

setuptoolsPaketleme için kullanmak için bir dosya eklememiz gerekiyor setup.py, bu projemizin kök klasörüne gidiyor:

.
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

En azından, paketimiz için meta verileri belirtiyoruz, setup.pyşuna benzer:

from setuptools import setup

setup(
    name='hellostackoverflow',
    version='0.0.1',
    description='a pip-installable package example',
    license='MIT',
    packages=['hellostackoverflow'],
    author='Benjamin Gerfelder',
    author_email='benjamin.gerfelder@gmail.com',
    keywords=['example'],
    url='https://github.com/bgse/hellostackoverflow'
)

Ayarladığımızdan beri license='MIT', projemize bir kopya olarak LICENCE.txtreStructuredText'teki bir benioku dosyasının yanı sıra şunları ekliyoruz README.rst:

.
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

Bu noktada, ambalajı kullanmaya başlamaya hazırız setuptools, eğer zaten kurulu değilse, aşağıdakileri kurabiliriz pip:

pip install setuptools

Bunu yapmak ve a oluşturmak için source distribution, proje kök klasörümüzde setup.py, komut satırından istediğimizi belirterek şunu çağırıyoruz sdist:

python setup.py sdist

Bu, dağıtım paketimizi ve yumurta bilgilerimizi oluşturacak ve paketimizde şu şekilde bir klasör yapısına yol açacaktır dist:

.
├── dist/
├── hellostackoverflow.egg-info/
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

Bu noktada, kullanarak yükleyebileceğimiz bir paketimiz var pip, bu yüzden proje kökümüzden (bu örnekte olduğu gibi tüm adlandırmalara sahip olduğunuzu varsayarak):

pip install ./dist/hellostackoverflow-0.0.1.tar.gz

Her şey yolunda giderse, şimdi bir Python yorumlayıcısı açabiliriz, karışıklıklardan kaçınmak için proje dizinimizin dışında bir yerde söyleyebilirim ve yeni parlak paketimizi kullanmaya çalışacağım:

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'

Paketin kurulduğunu ve çalıştığını doğruladığımıza göre, PyPI'ye yükleyebiliriz.

Canlı veri havuzunu denemelerimizle kirletmek istemediğimizden, test veri havuzu için bir hesap oluşturuyoruz twineve yükleme işlemi için kurulum yapıyoruz :

pip install twine

Şimdi neredeyse oradayız, hesabımız oluşturulduktan sonra twinepaketimizi yüklememizi söylüyoruz , kimlik bilgilerimizi isteyecek ve paketimizi belirtilen depoya yükleyecek:

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

Şimdi PyPI test deposunda hesabımıza giriş yapabilir ve yeni yüklenen paketimize bir süre hayret edebilir ve ardından şunu kullanarak yakalayabiliriz pip:

pip install --index-url https://test.pypi.org/simple/ hellostackoverflow

Gördüğümüz gibi, temel süreç çok karmaşık değil. Daha önce söylediğim gibi, burada ele alınmasından çok daha fazlası var, bu yüzden devam edin ve daha derinlemesine açıklama için öğreticiyi okuyun .


Paketim hemen yayınlanacak setuptoolsmı?
U10-İleri

@ U9-Forward Hayır, yayınlama yapılır twine, ancak paketinizi oluşturduktan sonra yayınlamadan önce yerel olarak test edebilirsiniz setuptools.
bgse

9

Seçtiğiniz komutları tanımladıktan sonra, kaydedilen dosyayı python program dosyalarınızdaki Lib klasörüne sürükleyip bırakabilirsiniz.

>>> import mymodule 
>>> mymodule.myfunc()

2

"Hello.py" adlı bir dosya oluşturun

Python 2.x kullanıyorsanız

def func():
    print "Hello"

Python 3.x kullanıyorsanız

def func():
    print("Hello")

Dosyayı çalıştırın. Ardından aşağıdakileri deneyebilirsiniz:

>>> import hello
>>> hello.func()
Hello

Biraz zorlanmak istiyorsanız, aşağıdakileri kullanabilirsiniz:

Python 2.x kullanıyorsanız

def say(text):
    print text

Python 3.x kullanıyorsanız

def say(text):
    print(text)

Parantez içinde tanımla? Bu önemli. Tanım içinde kullanabileceğiniz kişidir.

Metin - Programın ne istediğinizi söylemesini istediğinizde kullanabilirsiniz. İsmine göre metindir. Umarım metnin ne anlama geldiğini bilirsiniz. "Kelimeler" veya "cümleler" anlamına gelir.

Dosyayı çalıştırın. Ardından, Python 3.x kullanıyorsanız aşağıdakileri deneyebilirsiniz:

>>> import hello
>>> hello.say("hi")
hi
>>> from hello import say
>>> say("test")
test

Python 2.x için - Python 3 ile aynı şeyi sanırım? Fikrim yok. Python 2.x'de bir hata yaptıysam düzelt (Python 2'yi biliyorum ama Python 3 ile kullanıyorum)


2

Bir proje iskeletini kolayca sıfırdan başlatmak için bir proje oluşturdum . https://github.com/MacHu-GWU/pygitrepo-project .

Ve bir test projesi oluşturabilirsiniz, diyelim ki learn_creating_py_package.

Farklı bir amaçla hangi bileşene sahip olmanız gerektiğini öğrenebilirsiniz :

  • virtualenv oluştur
  • kendini kur
  • birim testi çalıştır
  • kod kapsamını çalıştır
  • belge oluştur
  • belgeyi dağıt
  • farklı python sürümlerinde unittest çalıştır
  • PYPI'ye konuşlandırma

Kullanmanın avantajı pygitrepo, bu sıkıcı kendini otomatik olarak oluşturulur ve uyum senin olmasıdır package_name, project_name, github_account, document host service, windows or macos or linux.

Bir profesyonel gibi bir python projesi geliştirmeyi öğrenmek için iyi bir yerdir.

Umarım bu yardımcı olabilir.

Teşekkür ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.