Banyak orang berpikir bahwa titik masuk adalah instruksi di
setup.py yang membuat paket tersedia untuk dijalankan dari baris perintah. Ini umumnya benar, tetapi kemampuan titik masuk tidak terbatas pada ini.
Di bawah ini saya akan menunjukkan bagaimana mungkin menerapkan sistem plug-in untuk suatu paket sehingga orang lain dapat berinteraksi dengannya atau, misalnya, memperluas fungsionalitasnya secara dinamis.
Perhatian : humor spesifik selanjutnya.LLC "Ular"
Selamat! Anda baru saja ditunjuk sebagai kepala Snake LLC. Ini adalah posisi yang sangat bertanggung jawab, Anda tidak dapat menghadapi kotoran, yang berarti Anda perlu menginstruksikan departemen pengembangan sesegera mungkin untuk mulai membuat prototipe produk. Maka, para pemikir terbaik perusahaan mulai bekerja di snek.py:
ascii_snek = """\ --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` """ def main(): print(ascii_snek) if __name__ == '__main__': main()
Beberapa saat kemudian, pada rapat pemegang saham, Anda dengan bangga menunjukkan hasil pertama!
$ python snek.py --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'`
Ular sebagai Layanan
Sayangnya, konsumen rata-rata belum menguasai Python dan ingin menjalankan program dari konsol tanpa memikirkan interpreter atau lokasi
snek.py. Nah, spesialis terbaik kami adalah yang terbaik yang mampu mengemas skrip sehingga secara otomatis membuat perintah konsol selama instalasi.
Untuk membuat paket yang dapat didistribusikan kembali, kita memerlukan
file setup.py , yang berisi informasi tentang dependensi, lisensi, dll. Selain itu, Anda dapat menentukan titik masuk di dalamnya:
from setuptools import setup setup( name='snek', entry_points={ 'console_scripts': [ 'snek = snek:main', ], } )
console_scripts , seperti yang dijelaskan para ahli, adalah titik masuk khusus.
setuptools membaca elemen-elemennya sebagai
"<console script> = <path ke objek Python>" , membuat utilitas konsol untuk setiap elemen ketika menginstal paket.
Untuk saat ini, mari kita instal skrip dari sumber:
$ python setup.py develop running develop running egg_info writing snek.egg-info\PKG-INFO writing dependency_links to snek.egg-info\dependency_links.txt writing entry points to snek.egg-info\entry_points.txt writing top-level names to snek.egg-info\top_level.txt reading manifest file 'snek.egg-info\SOURCES.txt' writing manifest file 'snek.egg-info\SOURCES.txt' running build_ext Creating c:\program files (x86)\py36-32\lib\site-packages\snek.egg-link (link to .) snek 0.0.0 is already the active version in easy-install.pth Installing snek-script.py script to C:\Program Files (x86)\Py36-32\Scripts Installing snek.exe script to C:\Program Files (x86)\Py36-32\Scripts Installing snek.exe.manifest script to C:\Program Files (x86)\Py36-32\Scripts Installed c:\users\rachum\notebooks Processing dependencies for snek==0.0.0 Finished processing dependencies for snek==0.0.0
Pada konferensi yang didedikasikan untuk hasil tahun ini, Anda berbicara, menunjukkan perkembangan terbaru:
$ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'`
Seekor ular di setiap rumah
Ular menaklukkan dunia. Perusahaan melakukan IPO dan dihargai pada rekor $ 60 miliar. Hipsters menuntut ular baru, penuh gaya, modis dan awet muda. Dan jika ada permintaan, akan ada penawaran:
""" ASCII . : snek [--type=TYPE] """ import docopt normal_snek = """\ --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` """ fancy_snek = """\ _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' """ def get_sneks(): return { 'normal': normal_snek, 'fancy': fancy_snek, } def main(): args = docopt.docopt(__doc__) snek_type = args['--type'] or 'normal' print(get_sneks()[snek_type]) if __name__ == '__main__': main()
Hipsters sangat senang:
$ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` $ snek --type fancy _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:'
Ular Transnasional
Jutaan orang tidak dapat membayangkan hari mereka tanpa ular. Bahkan setelah pengambilalihan Google, sumber daya Zmeika tidak cukup untuk memuaskan kebutuhan pengguna di seluruh dunia. Tampaknya sudah tiba saatnya untuk memberi orang kesempatan membuat ular sendiri berdasarkan infrastruktur kami.
""" ASCII . : snek [--type=TYPE] """ import docopt import pkg_resources normal_snek = """\ --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` """ fancy_snek = """\ _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' """ def get_sneks(): sneks = { 'normal': normal_snek, 'fancy': fancy_snek, } for entry_point in pkg_resources.iter_entry_points('snek_types'): sneks[entry_point.name] = entry_point.load() return sneks def main(): args = docopt.docopt(__doc__) snek_type = args['--type'] or 'normal' print(get_sneks()[snek_type]) if __name__ == '__main__': main()
Sekarang, setiap kali
snek diluncurkan, ia mencari ular lain yang terdaftar dalam sistem menggunakan
titik masuk
snek_types . Setiap ular tersebut terdaftar atas nama jenisnya, yang memungkinkan Anda memilih ular yang diinginkan tergantung pada parameter konsol.
Semua hal terpenting terjadi di dalam
get_sneks . Memanggil
pkg_resources.iter_entry_points ('snek_types') memungkinkan Anda untuk menjelajahi semua titik masuk yang terdaftar dengan nama
"snek_types" di mana saja. Dengan demikian, paket pihak ketiga mana pun akan dapat membuat titik masuk
"snek_types" di
setup.py untuk dimuat dengan skrip kami.
Kami berbicara tentang
snek_types kepada kolega kami dari Snake Solutions LLC, dan mereka segera mulai membuat ular impian mereka. Inilah bagaimana paket
cute_snek.py mereka
muncul :
cute_snek = r""" /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~ """
Dan inilah cara mereka mengimplementasikan
setup.py mereka sehingga
snek kami dapat memuat ular mereka:
from setuptools import setup setup( name='cute_snek', entry_points={ 'snek_types': [ 'cute = cute_snek:cute_snek', ], } )
Mereka mendaftarkan variabel
cute_snek di modul
cute_snek dengan nama
cute . Selanjutnya, mereka menginstal
paket snek dan
cute_snek :
$ cd cute_snek && python setup.py develop running develop running egg_info writing cute_snek.egg-info\PKG-INFO writing dependency_links to cute_snek.egg-info\dependency_links.txt writing entry points to cute_snek.egg-info\entry_points.txt writing top-level names to cute_snek.egg-info\top_level.txt reading manifest file 'cute_snek.egg-info\SOURCES.txt' writing manifest file 'cute_snek.egg-info\SOURCES.txt' running build_ext Creating c:\program files (x86)\py36-32\lib\site-packages\cute-snek.egg-link (link to .) cute-snek 0.0.0 is already the active version in easy-install.pth Installed c:\users\rachum\cute_snek Processing dependencies for cute-snek==0.0.0 Finished processing dependencies for cute-snek==0.0.0
Sekarang, dengan menjalankan
snek , mereka bisa mengeluarkan ular dari paket
cute_snek dengan memuatnya secara dinamis di titik masuk:
$ snek --type cute /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~
Ular 2.0
Sementara semua perhatian manajemen puncak pergi ke pembongkaran dengan inspektorat pajak dan layanan antimonopoli, departemen pengembangan akhirnya dapat menemukan waktu untuk memperbaiki kode.
Arsitek kepala sistem menyadari bahwa jika ular pihak ketiga dapat diunduh sebagai plug-in, maka ular yang terpasang juga dapat diunduh.
Kami menghapus pemrosesan khusus ular bawaan:
Dan sebagai gantinya, kami akan mendaftarkan titik masuk universal untuk mereka:
Pasang kembali ular yang dimodifikasi:
$ python setup.py develop running develop running egg_info writing snek.egg-info\PKG-INFO writing dependency_links to snek.egg-info\dependency_links.txt writing entry points to snek.egg-info\entry_points.txt writing top-level names to snek.egg-info\top_level.txt reading manifest file 'snek.egg-info\SOURCES.txt' writing manifest file 'snek.egg-info\SOURCES.txt' running build_ext Creating c:\program files (x86)\py36-32\lib\site-packages\snek.egg-link (link to .) snek 0.0.0 is already the active version in easy-install.pth Installing snek-script.py script to C:\Program Files (x86)\Py36-32\Scripts Installing snek.exe script to C:\Program Files (x86)\Py36-32\Scripts Installing snek.exe.manifest script to C:\Program Files (x86)\Py36-32\Scripts Installed c:\users\rachum\notebooks Processing dependencies for snek==0.0.0 Finished processing dependencies for snek==0.0.0
Periksa hasilnya:
$ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` $ snek --type fancy _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' $ snek --type cute /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~
Itu saja. Sekarang Anda tahu cara menggunakan titik masuk dengan Python!