Python giriş noktalarını açıklamak?


181

Pilonlardaki ve Peak sayfalarındaki yumurta giriş noktaları hakkındaki belgeleri okudum ve hala gerçekten anlamıyorum. Birisi bana açıklayabilir mi?

Yanıtlar:


168

"Giriş noktası" tipik olarak Python paketinizin bir geliştiricisinin veya kullanıcısının kullanmak isteyebileceği bir işlevdir (veya çağrılabilir işlev benzeri başka bir nesnedir), ancak çağrılamaz bir nesne de giriş noktası olarak sağlanabilir (doğru yorumlarda dikkat çekti!).

En popüler giriş noktası, paketinizi her kim yüklerse, komut satırı aracı olarak kullanılabilir olmasını istediğiniz bir işleve işaret eden console_scripts giriş noktasıdır. Bu, setup.py'nize gider:

entry_points={
    'console_scripts': [
        'cursive = cursive.tools.cmd:cursive_command',
    ],
},

Ben sadece "cursive.tools" adlı dağıttığım bir paket var ve birisinin komut satırından çalıştırabileceği bir "cursive" komutu kullanılabilir olmasını istedim:

$ cursive --help
usage: cursive ...

Bunu yapmanın yolu, cursive / tools / cmd.py dosyasında "cursive_command" işlevi gibi bir işlevi tanımlamaktır:

def cursive_command():
    args = sys.argv[1:]
    if len(args) < 1:
        print "usage: ..."

ve benzerleri; komut satırından çağrıldığını, kullanıcının sağladığı bağımsız değişkenleri ayrıştırdığını ve ... komutun yapmak için tasarlandığı her şeyi yapmasını sağlamalıdır.

Giriş noktası kullanımının harika bir örneği için docutils paketini yükleyin : Python belgelerini diğer formatlara dönüştürmek için yarım düzine yararlı komut gibi bir şey yükleyecektir.


3
mevcut docutils setup.pyhiç içermiyor entry_points.
matt wilkie

2
Bu, "console_scripts" olan tek bir input_point grup adını paylaşan birden fazla projenin gücünü gösterdiği için mükemmel bir cevaptır. Bu cevabı Petri'nin daha genel cevabı ile karşılaştırın. Console_scripts'i almak ve sonra bunların etrafında bir kabuk sarmalayıcısı oluşturmak için kurulum araçlarının bu pkg_resources mekanizmasını kullanması gerektiğini göreceksiniz. İlham verici? Bunları kullan. Onlar sadece console_scripts için daha iyidir.
Bruno Bronosky

188

EntryPoints , kalıcı, dosya sistemi tabanlı bir nesne adı kaydı ve ad tabanlı doğrudan nesne içe aktarma mekanizması sağlar ( setuptools paketi tarafından uygulanır ).

Python nesnelerinin adlarını serbest biçimli tanımlayıcılarla ilişkilendirir. Böylece aynı Python kurulumunu kullanan ve tanımlayıcıyı bilen diğer kodlar, nesnenin nerede tanımlandığına bakılmaksızın ilişkili ada sahip bir nesneye erişebilir. İlişkili isimler Python modülünde mevcut herhangi isimler olabilir ; örneğin bir sınıf, işlev veya değişkenin adı. Giriş noktası mekanizması, isabet edilebilir olduğu sürece adın ne anlama geldiğini umursamaz.

Örnek olarak, bir işlev (adı) ve tam nitelikli bir ad olan 'myns.mypkg.mymodule' ile hayali bir python modülü kullanalım:

def the_function():
   "function whose name is 'the_function', in 'mymodule' module"
   print "hello from the_function"

Giriş noktaları, setup.py dosyasında bir giriş noktası bildirimi ile kaydedilir. 'İşlevimi' my_ep_func 'adı verilen giriş noktası altında kaydetmek için:

    entry_points = {
        'my_ep_group_id': [
            'my_ep_func = myns.mypkg.mymodule:the_function'
        ]
    },

Örnekte gösterildiği gibi, giriş noktaları gruplandırılmıştır; bir gruba ait tüm giriş noktalarını aramak için karşılık gelen API vardır (aşağıdaki örnek).

Paket kurulumundan sonra (yani, 'python setup.py install' çalıştırıldığında), yukarıdaki bildirim setuptools tarafından ayrıştırılır. Daha sonra ayrıştırılan bilgileri özel dosyaya yazar. Bundan sonra, pkg_resources API'si (setuptools'un bir parçası) giriş noktasını aramak ve ilişkili ad (lar) ı içeren nesnelere erişmek için kullanılabilir:

import pkg_resources

named_objects = {}
for ep in pkg_resources.iter_entry_points(group='my_ep_group_id'):
   named_objects.update({ep.name: ep.load()})

Burada, setuptools, özel dosyalara yazılan giriş noktası bilgilerini okur. Giriş noktasını buldu, modülü (myns.mypkg.mymodule) içeri aktardı ve pkg_resources.load () çağrıldığında burada tanımlanan işlevi aldı.

Aynı grup kimliği için başka giriş noktası kaydı olmadığı varsayılarak, the_function işlevinin çağrılması basit olacaktır:

>>> named_objects['my_ep_func']()
hello from the_function

Bu nedenle, başlangıçta belki biraz kavramak zor olsa da, giriş noktası mekanizmasının kullanımı oldukça basittir. Takılabilir Python yazılım geliştirme için kullanışlı bir araç sağlar.


4
Tüm bu işlemlerde 'my_ep_func' adı nerede kullanılır? Pkg_resources yineleyicisi tarafından hiçbir şey için kullanılmıyor gibi görünüyor.
Kamil Kisiel

2
@KamilKisiel: burada gösterim amacıyla kullanılan örnekte, giriş noktasının adı gerçekten hiçbir şey için kullanılmamıştır, ne de olması gerekir; giriş noktasının adının herhangi bir şey için kullanılıp kullanılmadığı uygulamaya bağlıdır. Ad, giriş noktası örneğinin ad niteliği olarak kullanılabilir .
Petri

3
Ben ep.name atarak ve named_objects bir sözlük yerine bir liste yapmak kafa karıştırıcı olduğunu düşünüyorum, bu yüzden cevap düzenledi. Bu, hem adın nereden alınacağını hem de 'the_function' ya da 'my_ep_func' olmasını bekleyip beklemeyeceğini gösterir. Aksi takdirde okuyucu başka yerlerde ek belgeler bulmak zorundaydı. Bu MÜKEMMEL bir cevaptır ve gördüğüm giriş_puanlarının en kısa, en açık açıklamasıdır!
Bruno Bronosky

3
Github üzerine bu konsepti gösteren bir proje hazırladım. github.com/RichardBronosky/entrypoint_demo
Bruno Bronosky

1
Bu, ayrıntılı bir açıklama için giriş noktalarının çok net bir açıklamasıdır. EntryPointsAçıklama çok açıktır olsa bağlantı, eski.
Rahul Nair

18

Soyut bakış açısından, giriş noktaları, belirli arayüzleri uygulayan sistem çapında bir Python callables kayıt defteri oluşturmak için kullanılır. Belirli bir paket tarafından hangi giriş noktalarının reklamı yapıldığını görmek için pkg_resources API'ları ve belirli bir giriş noktasının hangi paketlerin reklamını yapacağını belirlemek için API'ler vardır.

Giriş noktaları, bir paketin başka bir paketin içindeki eklentileri kullanmasına izin vermek için kullanışlıdır. Örneğin, Ian Bicking'ın Yapıştır projesi giriş noktalarını kapsamlı bir şekilde kullanır. Bu durumda, giriş noktasını kullanarak WSGI uygulama fabrikasını tanıtan bir paket yazabilirsiniz paste.app_factory.

Giriş noktaları için başka bir kullanım, bazı eklenti işlevselliği sağlayan sistemdeki tüm paketleri numaralandırmaktır. TurboGears web çerçeve kullanır python.templating.enginesyüklü ve kullanılabilir olan şablon kütüphaneleri bakmak için giriş noktası.

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.