يعتقد الكثير من الأشخاص أن نقاط الإدخال هي إرشادات في
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
بينما يذهب كل اهتمام الإدارة العليا إلى التفكيك مع مصلحة الضرائب وخدمة مكافحة الاحتكار ، يمكن لقسم التطوير أن يجد في النهاية بعض الوقت لإعادة تفعيل الرمز.
أدرك كبير مهندسي النظام أنه إذا كان من الممكن تنزيل الثعابين التابعة لجهات خارجية كمكونات إضافية ، فيمكن أيضًا تنزيل الثعابين المدمجة.
نزيل المعالجة الخاصة للثعابين المدمجة:
وفي المقابل ، سنقوم بتسجيل نقاط دخول عالمية لهم:
أعد تثبيت الأفعى المعدلة:
$ 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| \/ /~ \_/ \ \____|__________/ \ \_______ \ `\ \ \ | | \ / / \ / / \ / / \ \ / / \ \ / / _----_ \ \ / / _-~ ~-_ | | ( ( _-~ _--_ ~-_ _/ | \ ~-____-~ _-~ ~-_ ~-_-~ / ~-_ _-~ ~-_ _-~ ~--______-~ ~-___-~
هذا كل شيء. الآن أنت تعرف كيفية استخدام نقاط الدخول في بيثون!