نقاط دخول بايثون

يعتقد الكثير من الأشخاص أن نقاط الإدخال هي إرشادات في setup.py تتيح تشغيل الحزمة من سطر الأوامر. هذا صحيح بشكل عام ، لكن قدرات نقاط الدخول لا تقتصر على ذلك.

فيما يلي سأوضح كيف يمكنك تنفيذ نظام مكون إضافي لحزمة حتى يتمكن الآخرون من التفاعل معها أو ، على سبيل المثال ، توسيع وظائفها ديناميكيًا.



الحذر : الفكاهة محددة فيما بعد.

جمعية ذات مسؤولية محدودة "الأفعى"


تهانينا! لقد تم تعيينك للتو رئيس Snake LLC. هذا موقف مسؤول جدًا ، لا يمكنك مواجهة الأوساخ ، مما يعني أنك بحاجة إلى توجيه تعليمات إلى قسم التطوير في أقرب وقت ممكن لبدء إنشاء نموذج أولي للمنتج. وهكذا ، فإن أفضل عقول الشركة تبدأ العمل على snek.py:

ascii_snek = """\ --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` """ def main(): print(ascii_snek) if __name__ == '__main__': main() 

بعد ذلك بقليل ، في اجتماع للمساهمين ، أنت تُظهر بفخر النتائج الأولى!

 $ python snek.py --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` 

ثعبان كخدمة


لسوء الحظ ، لم يتقن المستهلك العادي Python ويريد تشغيل البرنامج من وحدة التحكم دون التفكير في المترجم أو الموقع snek.py. حسنًا ، أفضل المتخصصين لدينا هم الأفضل الذين تمكنوا من حزم البرنامج النصي بحيث يقوم تلقائيًا بإنشاء أمر وحدة تحكم أثناء التثبيت.

لإنشاء حزمة قابلة لإعادة التوزيع ، نحتاج إلى ملف setup.py الذي يحتوي على معلومات حول التبعيات والتراخيص وما إلى ذلك. بالإضافة إلى ذلك ، يمكنك تحديد نقاط الدخول فيه:

 from setuptools import setup setup( name='snek', entry_points={ 'console_scripts': [ 'snek = snek:main', ], } ) 

console_scripts ، كما أوضح الخبراء ، هي نقطة دخول خاصة. تقرأ setuptools عناصرها كـ "<console console> = <path to the Python object>" ، تنشئ أداة مساعدة لوحدة التحكم لكل عنصر عند تثبيت الحزمة.

الآن ، لنقم بتثبيت البرنامج النصي من المصادر:

 $ 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 

في المؤتمر المخصص لنتائج العام ، أنت تتحدث ، موضحة أحدث التطورات:

 $ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` 

ثعبان في كل بيت


الأفعى تغزو العالم. أجرت الشركة الاكتتاب العام وقيمته 60 مليار دولار. يطلب محبو موسيقى الجاز ثعبان جديد وأنيق وعصري وشبابي. وإذا كان هناك طلب ، سيكون هناك عرض:

 """ 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() 

محبو موسيقى الجاز متحمسون:

 $ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` $ snek --type fancy _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' 

الأفعى العابرة للحدود


لا يستطيع ملايين الناس تخيل يومهم دون ثعبان. حتى بعد استحواذ Google ، لا تكفي موارد Zmeika لتلبية احتياجات المستخدمين في جميع أنحاء العالم. يبدو أن الوقت قد حان لإعطاء الناس الفرصة لإنشاء الثعابين الخاصة بهم على أساس بنيتنا التحتية.

 """ 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() 

الآن ، في كل مرة يتم فيها تشغيل snek ، يبحث عن الثعابين الأخرى المسجلة في النظام باستخدام نقطة إدخال snek_types . يتم تسجيل كل ثعبان تحت اسم من نوعه ، والذي يسمح لك لتحديد الثعبان المطلوب اعتمادا على المعلمات وحدة التحكم.

كل شيء أهم يحدث داخل get_sneks . يتيح لك الاتصال بـ pkg_resources.iter_entry_points ('snek_types') الاطلاع على جميع نقاط الدخول المسجلة تحت اسم "snek_types" في أي مكان. وبالتالي ، ستكون أي حزمة تابعة لجهة خارجية قادرة على إنشاء نقطة دخول "snek_types" في برنامج الإعداد الخاص بها ليتم تحميلها باستخدام البرنامج النصي الخاص بنا.

تحدثنا عن snek_types إلى زملائنا من Snake Solutions LLC ، وبدأوا على الفور في إنشاء ثعبان من أحلامهم. هذه هي الطريقة التي جاءت بها حزمة cute_snek.py :

 cute_snek = r""" /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~ """ 

وإليك كيفية قيامهم بتطبيق setup.py الخاص بهم بحيث يمكن لحملنا تحميل ثعبانهم:

 from setuptools import setup setup( name='cute_snek', entry_points={ 'snek_types': [ 'cute = cute_snek:cute_snek', ], } ) 

قاموا بتسجيل المتغير cute_snek في الوحدة النمطية cute_snek تحت اسم cute . بعد ذلك ، يقومون بتثبيت حزم snek و 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 

الآن ، من خلال تشغيل snek ، يمكنهم الحصول على ثعبانهم من حزمة cute_snek عن طريق تحميله ديناميكيًا عند نقطة الدخول:

 $ snek --type cute /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~ 

الأفعى 2.0


بينما يذهب كل اهتمام الإدارة العليا إلى التفكيك مع مصلحة الضرائب وخدمة مكافحة الاحتكار ، يمكن لقسم التطوير أن يجد في النهاية بعض الوقت لإعادة تفعيل الرمز.

أدرك كبير مهندسي النظام أنه إذا كان من الممكن تنزيل الثعابين التابعة لجهات خارجية كمكونات إضافية ، فيمكن أيضًا تنزيل الثعابين المدمجة.

نزيل المعالجة الخاصة للثعابين المدمجة:

 --- a/snek.py +++ b/snek.py @@ -31,10 +31,7 @@ fancy_snek = """\ """ def get_sneks(): - sneks = { - 'normal': normal_snek, - 'fancy': fancy_snek, - } + sneks = {} for entry_point in pkg_resources.iter_entry_points('snek_types'): sneks[entry_point.name] = entry_point.load() return sneks 

وفي المقابل ، سنقوم بتسجيل نقاط دخول عالمية لهم:

 --- a/setup.py +++ b/setup.py @@ -6,5 +6,9 @@ setup( 'console_scripts': [ 'snek = snek:main', ], + 'snek_types': [ + 'normal = snek:normal_snek', + 'fancy = snek:fancy_snek', + ], }, ) 

أعد تثبيت الأفعى المعدلة:

 $ 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 

تحقق النتيجة:

 $ snek --..,_ _,.--. `'.'. .'`__ o `;__. '.'. .'.'` '---'` ` '.`'--....--'`.' `'--....--'` $ snek --type fancy _,..,,,_ '``````^~"-,_`"-,_ .-~c~-. `~:. ^-. `~~~-.c ; `:. `-, _.-~~^^~:. `. ; _,--~~~~-._ `:. ~. .~ `. .` ;' .:` `: `:. ` _.:-,. `. .' .: :' _.-~^~-. `. `..' .: `. ' : .' _:' .-' `. :. .: .'`. : ; : `-' .:' `. `^~~^` .:. `. ; ; `-.__,-~ ~-. ,' ': '.__.` :' ~--..--' ':. .:' ':..___.:' $ snek --type cute /^\/^\ _|__| O| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~ 



هذا كل شيء. الآن أنت تعرف كيفية استخدام نقاط الدخول في بيثون!

Source: https://habr.com/ru/post/ar479570/


All Articles