রানটাইমের সময় পাইথন মডিউল সংস্করণটি পরীক্ষা করা হচ্ছে


118

অনেক তৃতীয় পক্ষের পাইথন মডিউলগুলির একটি বৈশিষ্ট্য রয়েছে যা মডিউলটির সংস্করণ তথ্য রাখে (সাধারণত এমন কিছু module.VERSIONবা কিছু module.__version__), তবে কিছু না।

যেমন মডিউলগুলির বিশেষ উদাহরণগুলি হল libxslt এবং libxML2।

আমাকে যাচাই করা দরকার যে এই মডিউলগুলির সঠিক সংস্করণ রানটাইম ব্যবহার করা হচ্ছে। এই কাজ করতে একটি উপায় আছে কি?

একটি সম্ভাব্য সমাধান হ'ল রানটাইম উত্সে পড়ুন, এটি হ্যাশ করুন এবং তারপরে এটি পরিচিত সংস্করণের হ্যাশের সাথে তুলনা করুন, তবে এটি খুব বাজে।

এর চেয়ে ভাল সমাধান কি আছে?

উত্তর:


8

আমি হ্যাশিং থেকে দূরে থাকতাম Libxslt ব্যবহার করা সংস্করণটিতে এমন কিছু ধরণের প্যাচ থাকতে পারে যা এটির ব্যবহারের ক্ষেত্রে আপনার প্রভাব ফেলবে না।

বিকল্প হিসাবে, আমি আপনাকে পরামর্শ দিতে চাই যে আপনি রান সময় চেক করবেন না (এটি কোনও কঠিন প্রয়োজন কিনা তা আপনি জানেন না)। বাহ্যিক নির্ভরতা (তৃতীয় পক্ষের লাইব্রেরি) রয়েছে এমন পাইথন স্টাফের জন্য, আমি একটি স্ক্রিপ্ট লিখি যা ব্যবহারকারীরা মডিউলগুলির উপযুক্ত সংস্করণগুলি ইনস্টল করা আছে কিনা তা দেখতে তাদের পাইথন ইনস্টল পরীক্ষা করতে চালাতে পারেন।

যে মডিউলগুলির একটি সংজ্ঞায়িত 'সংস্করণ' বৈশিষ্ট্য নেই, আপনি এটিতে থাকা ইন্টারফেসগুলি (শ্রেণি এবং পদ্ধতি) পরিদর্শন করতে পারেন এবং তারা আশা করেন এমন ইন্টারফেসের সাথে মেলে কিনা তা দেখুন। তারপরে আপনি যে আসল কোডটিতে কাজ করছেন তাতে ধরে নিন যে তৃতীয় পক্ষের মডিউলগুলির আপনার কাছে প্রত্যাশা করা ইন্টারফেস রয়েছে।


244

পিকেজি_সোর্স ব্যবহার করুন । পাইপিআই থেকে ইনস্টল করা যেকোনো কিছুতে কমপক্ষে একটি সংস্করণ নম্বর থাকা উচিত।

>>> import pkg_resources
>>> pkg_resources.get_distribution("blogofile").version
'0.7.1'

8
আরও মনে রাখবেন যে প্যাকেজের নাম অবশ্যই পাইপিআই এন্ট্রি হতে হবে। সুতরাং "pkg_resources.get_distribration ('MySQLdb') এর মতো কিছু। সংস্করণ" pkg_resources.get_distribration ('mysql-python') ছাড়া কাজ করবে না। সংস্করণ "করবে।
রাহুল

1
আপনি যদি কোনও নিখুঁত ফাইলের নাম নিয়ে চলমান থাকেন তবে আপনি যা চালিয়ে যাচ্ছেন তার pkg_resourcesছায়াযুক্ত ভিন্ন সংস্করণ বেছে নিতে পারে কারণ এতে আপনার PYTHONPATHবা এর অনুরূপটির চেয়ে বেশি প্রাধান্য রয়েছে।
ট্রিপল

4
কোনও ক্ষেত্রে কীভাবে এই __version__বৈশিষ্ট্যটি তৈরি করতে হয় তা জানতে চান : stackoverflow.com/q/17583443/562769
মার্টিন থোমা

pkg_resourcesলিঙ্কটি একটি ত্রুটি 404
জন্মানো

অটোমেটেড প্রসেসিংয়ের জন্য, এই প্রশ্নটি দেখুন
জন্মানো

6

কিছু ধারণা:

  1. আপনার প্রয়োজনীয় সংস্করণগুলিতে বিদ্যমান বা বিদ্যমান না এমন ফাংশনগুলির জন্য পরীক্ষা করার চেষ্টা করুন।
  2. যদি কোনও ফাংশন পার্থক্য না থাকে তবে ফাংশন আর্গুমেন্ট এবং স্বাক্ষরগুলি পরীক্ষা করুন।
  3. আপনি যদি ফাংশন স্বাক্ষরগুলি থেকে এটি বের করতে না পারেন তবে আমদানির সময় কিছু স্টাব কল সেট আপ করুন এবং তাদের আচরণটি পরীক্ষা করুন।

প্যাকেজগুলির তাদের সংস্করণ নির্দিষ্ট করা উচিত। এই ধারণাগুলি সাধারণত কোনও সংস্করণ যাচাই করা সহজ কাজের (আনুমানিক 99% ক্ষেত্রে) সহজ কাজের জন্য সম্পূর্ণ ওভারকিল।
জেলফির কাল্টসটহল

2

তুমি ব্যবহার করতে পার

pip freeze

প্রয়োজনীয় বিন্যাসে ইনস্টল করা প্যাকেজগুলি দেখতে।


1

আপনি importlib_metadataএই জন্য গ্রন্থাগার ব্যবহার করতে পারেন ।

আপনি অজগর <এ থাকলে 3.8প্রথমে এটিটি ইনস্টল করুন:

pip install importlib_metadata

পাইথন যেহেতু 3.8এটি পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত।

তারপরে, প্যাকেজের সংস্করণটি পরীক্ষা করতে (এই উদাহরণে lxml) রান করুন:

>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'

মনে রাখবেন যে এটি কেবল পাইপিআই থেকে ইনস্টল হওয়া প্যাকেজগুলির জন্য কাজ করে। এছাড়াও, আপনাকে versionএই প্যাকেজটি সরবরাহ করে এমন কোনও মডিউল নাম নয় , আপনাকে অবশ্যই প্যাকেজের নামটি পদ্ধতির আর্গুমেন্ট হিসাবে পাস করতে হবে (যদিও তারা সাধারণত একই থাকে)।


0

আমি উপলব্ধ বিভিন্ন সরঞ্জাম (এটি অন্য উত্তরpkg_resources দ্বারা উল্লিখিত সেরা এক সহ) ব্যবহার করা বেশ বিশ্বাসযোগ্য বলে খুঁজে পেয়েছি , কারণ তাদের বেশিরভাগ ক্ষেত্রেই সমস্ত ঘটনা কভার হয় না। উদাহরণ স্বরূপ

  • অন্তর্নির্মিত মডিউল
  • মডিউলগুলি ইনস্টল করা হয়নি তবে পাইথন পাথে যুক্ত হয়েছে (উদাহরণস্বরূপ আপনার আইডিই দ্বারা)
  • একই মডিউলটির দুটি সংস্করণ উপলব্ধ (পাইথন পাথের মধ্যে একটি ইনস্টল হওয়াটিকে ছাড়িয়ে যাবে)

যেহেতু আমাদের যে কোনও প্যাকেজ, মডিউল বা সাবমডিউলটির সংস্করণ পেতে একটি নির্ভরযোগ্য উপায় প্রয়োজন , তাই আমি getversion লেখার কাজ শেষ করেছিলাম । এটি ব্যবহার করা বেশ সহজ:

from getversion import get_module_version
import foo
version, details = get_module_version(foo)

বিশদ জন্য ডকুমেন্টেশন দেখুন ।


0

মডিউলগুলির জন্য যা __version__নিম্নলিখিতগুলি সরবরাহ করে না এটি কুৎসিত তবে কার্যকর:

#!/usr/bin/env python3.6
import sys
import os
import subprocess
import re

sp = subprocess.run(["pip3", "show", "numpy"], stdout=subprocess.PIPE)
ver = sp.stdout.decode('utf-8').strip().split('\n')[1]
res = re.search('^Version:\ (.*)$', ver)
print(res.group(1))

অথবা

#!/usr/bin/env python3.7
import sys
import os
import subprocess
import re

sp = subprocess.run(["pip3", "show", "numpy"], capture_output=True)
ver = sp.stdout.decode('utf-8').strip().split('\n')[1]
res = re.search('^Version:\ (.*)$', ver)
print(res.group(1))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.