python - সটল - কিভাবে আমি নতুন ভাষা বৈশিষ্ট্য ব্যবহার করে একটি প্রোগ্রামে পাইথন সংস্করণ চেক করতে পারেন?




পাইথন শিখুন (12)

AskUbuntu এ AskUbuntu থেকে উত্তর:

আপনি স্ট্যান্ডার্ড লাইব্রেরি থেকে platform মডিউল ব্যবহার করে নিজেই কোড থেকে পাইথন সংস্করণ চেক করতে পারেন।

দুটি ফাংশন আছে:

  • platform.python_version() (স্ট্রিং ফেরত)।
  • platform.python_version_tuple() (tuple ফেরত দেয়)।

পাইথন কোড

উদাহরণস্বরূপ একটি ফাইল তৈরি করুন: version.py )

সংস্করণ চেক করার সহজ পদ্ধতি:

import platform

print(platform.python_version())
print(platform.python_version_tuple())

আপনি eval পদ্ধতি ব্যবহার করতে পারেন:

try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

কমান্ড লাইনে পাইথন ফাইলটি চালান:

$ python version.py 
2.7.11
('2', '7', '11')

উইন্ডোজ 10 এ একটি WAMP সার্ভারের মাধ্যমে সিআইজি সহ পাইথন আউটপুট:

সহায়ক সম্পদ

যদি আমার পাইথন স্ক্রিপ্ট থাকে যার জন্য অন্তত কোনও নির্দিষ্ট সংস্করণ পাইথন প্রয়োজন হয় তবে পাইথনের পূর্ববর্তী সংস্করণটি স্ক্রিপ্টটি চালু করার জন্য কীভাবে ব্যবহারযোগ্যভাবে ব্যর্থ হওয়ার সঠিক উপায়টি?

কিভাবে আমি ত্রুটি বার্তা প্রদান এবং প্রস্থান করার জন্য যথেষ্ট তাড়াতাড়ি নিয়ন্ত্রণ পেতে পারি?

উদাহরণস্বরূপ, আমার একটি প্রোগ্রাম রয়েছে যা টিনারি অপারেটর (2.5 -এ নতুন) এবং "সহ" ব্লকগুলি ব্যবহার করে (2.6 এ নতুন)। আমি একটি সহজ ছোট ইন্টারপ্রেটার-সংস্করণ চেকার রুটিন লিখেছিলাম যা স্ক্রিপ্ট কল করবে প্রথম জিনিস ... ব্যতীত এটি এতদূর পায় না। পরিবর্তে, স্ক্রিপ্ট পাইথন সংকলনের সময় ব্যর্থ হয়, আমার রুটিন এমনকি আগে বলা হয়। এইভাবে স্ক্রিপ্টের ব্যবহারকারী কিছু খুব অস্পষ্ট সিনাক্স ত্রুটি ট্র্যাসব্যাকগুলি দেখেন - যাটি বিশেষজ্ঞকে পাইথনটির ভুল সংস্করণটি চালানোর ক্ষেত্রে কেবলমাত্র এটির পক্ষে নিখরচায় করা প্রয়োজন।

আমি পাইথন সংস্করণ পরীক্ষা কিভাবে জানি। সমস্যাটি হল পাইথনের পুরোনো সংস্করণগুলিতে কিছু সিনট্যাক্স অবৈধ। এই প্রোগ্রাম বিবেচনা করুন:

import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

2.4 এর নিচে চালানোর সময়, আমি এই ফলাফল চাই

$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

এবং এই ফলাফল না:

$ ~/bin/python2.4 tern.py 
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(সহকর্মী জন্য চ্যানেল।)


আপনার ফাইলের শীর্ষে নীচেরটি রাখুন:

import sys

if float(sys.version.split()[0][:3]) < 2.7:
    print "Python 2.7 or higher required to run this code, " + sys.version.split()[0] + " detected, exiting."
    exit(1)

তারপর স্বাভাবিক পাইথন কোড দিয়ে অবিরত থাকুন:

import ...
import ...
other code...

আপনি sys.hexversion বা sys.version_info দিয়ে পরীক্ষা করতে পারেন।

sys.hexversion খুব মানবিক বন্ধুত্বপূর্ণ নয় কারণ এটি একটি হেক্সাডেসিমেল সংখ্যা। sys.version_info একটি tuple হয়, তাই এটি আরো মানব-বান্ধব।

Python 3.6 অথবা sys.hexversion সাথে নতুন জন্য পরীক্ষা করুন:

import sys, time
if sys.hexversion < 0x30600F0:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

Python 3.6 অথবা sys.version_info সাথে নতুন জন্য পরীক্ষা করুন:

import sys, time
if sys.version_info[0] < 3 and sys.version_info[1] < 6:
    print("You need Python 3.6 or greater.")
    for _ in range(1, 5): time.sleep(1)
    exit()

sys.version_info আরো মানবিক বন্ধুত্বপূর্ণ, কিন্তু আরো অক্ষর লাগে। আমি sys.hexversion reccomend হবে, যদিও এটি কম মানুষের বন্ধুত্বপূর্ণ।

আমি এই আপনি সাহায্য আশা করি!


আমি আখানের চমৎকার উত্তরটি প্রসারিত করছি, যা পাইথন স্ক্রিপ্টটি এমনকি কম্পাইল করার আগে একটি সহায়ক বার্তা মুদ্রণ করে।

আপনি যদি স্ক্রিপ্টটি পাইথন 3.6 বা নতুনের সাথে চালানো নিশ্চিত করতে চান তবে আপনার পাইথন স্ক্রিপ্টের শীর্ষে এই দুটি লাইন যোগ করুন:

#!/bin/sh
''''python3 -c 'import sys; sys.exit(sys.version_info < (3, 6))' && exec python3 -u -- "$0" ${1+"[email protected]"}; echo 'This script requires Python 3.6 or newer.'; exit 1 # '''

(দ্রষ্টব্য: দ্বিতীয় লাইনটি চারটি একক-কোট দিয়ে শুরু হয় এবং তিনটি একক-কোট সহ শেষ হয়। এটি অদ্ভুত মনে হতে পারে তবে এটি একটি টাইপও নয়।)

এই সমাধানটির সুবিধাটি হল print(f'Hello, {name}!') মতো কোড print(f'Hello, {name}!') একটি SyntaxError করবে না যদি কোনও পাইথন সংস্করণ 3.6 এর চেয়ে পুরানো হয়। আপনি পরিবর্তে এই সহায়ক বার্তা দেখতে পাবেন:

This script requires Python 3.6 or newer.

অবশ্যই, এই সমাধানটি শুধুমাত্র ইউনিক্স-এর মতো শেলগুলিতে কাজ করে এবং শুধুমাত্র স্ক্রিপ্ট সরাসরি (যেমন: ./script.py ), এবং সঠিক eXecute অনুমতি বিট সেটের সাথে ডাকা হয়।


আমি ভাল সংস্করণ পরিবর্তে সংস্করণ জন্য পরীক্ষা করা হয় মনে হয়। কিছু ক্ষেত্রে, এই তুচ্ছ, অন্যদের মধ্যে তাই নয়।

উদাহরণ:

try :
    # Do stuff
except : # Features weren't found.
    # Do stuff for older versions.

যতক্ষণ আপনি চেষ্টা / ব্যবধান ব্যতীত ব্যবহারে যথেষ্ট নির্দিষ্ট, আপনি আপনার বেশিরভাগ ঘাঁটিগুলি ঢেকে রাখতে পারেন।


উপরে উল্লিখিত হিসাবে, সিনট্যাক্স ত্রুটি কম্পাইল সময় ঘটে, রান সময় না। পাইথন একটি "ব্যাখ্যা ভাষা" যদিও পাইথন কোডটি আসলে সরাসরি ব্যাখ্যা করা হয় না; এটি বাইট কোড কম্পাইল করা হয়, যা তারপর ব্যাখ্যা করা হয়। একটি মডিউল আমদানি করা হয় এমন একটি কম্পাইল ধাপ রয়েছে (যদি .pyc বা .pyd ফাইলের আকারে উপলব্ধ কোনও পূর্বে-সংকলিত সংস্করণ না থাকে) এবং এটি যখন আপনি আপনার ত্রুটি পাচ্ছেন তখন নয় (ঠিক আছে) আপনার কোড চলমান হয়।

আপনি কম্পাইল পদক্ষেপটি বন্ধ করতে এবং কোডের একক লাইনের জন্য রান টাইম এ এটি ঘটতে পারেন, যদি আপনি চান, evl ব্যবহার করে উপরে উল্লেখিত হিসাবে, তবে আমি ব্যক্তিগতভাবে এটি করতে এটিকে অগ্রাধিকার দিতে পছন্দ করি কারণ এটি পাইথন সম্ভাব্যভাবে সঞ্চালন করে অপ্রয়োজনীয় রান-টাইম সংকলন, এক জিনিস এবং অন্যরকমের জন্য, এটি কোড ক্লাদারের মতো আমার কী মনে করে। (যদি আপনি চান তবে কোডটি জেনারেট করে এমন কোড জেনারেট করতে পারেন - এবং এখন থেকে 6 মাসের মধ্যে একেবারে কল্পনাপ্রসূত সময় সংশোধন এবং ডিবাগিং করুন।) তাই আমি এর পরিবর্তে কী সুপারিশ করব তা আরও ভালো কিছু:

import sys
if sys.hexversion < 0x02060000:
    from my_module_2_5 import thisFunc, thatFunc, theOtherFunc
else:
    from my_module import thisFunc, thatFunc, theOtherFunc

.. যা আমি যদি শুধুমাত্র একটি ফাংশন ছিল যা নতুন সিনট্যাক্স ব্যবহার করে এবং এটি খুব ছোট ছিল। (আসলে আমি এই ধরনের ফাংশনের সংখ্যা এবং আকার কমানোর জন্য প্রতিটি যুক্তিসঙ্গত পরিমাপ নেব। আমি যদি এমন একটি ফাংশন লিখতেও পারি তবে এটি একটি স্ট্রাইক সহ ifTrueAlseB (cond, a, b) সিনট্যাক্সের সাথে থাকবে।)

আরেকটি বিষয় যা হয়তো মূল্যবান হতে পারে (যে আমি একটু অবাক হয়েছি যে কেউ এখনো ইঙ্গিত করে নি) তবে পাইথনের পূর্ববর্তী সংস্করণগুলি কোডটিকে সমর্থন করে না

value = 'yes' if MyVarIsTrue else 'no'

.. এটা মত সমর্থন কোড করেনি

value = MyVarIsTrue and 'yes' or 'no'

যে ত্রৈমাসিক এক্সপ্রেশন লেখার পুরানো উপায় ছিল। আমার এখনও পাইথন 3 ইনস্টল নেই, কিন্তু যতদূর আমি জানি, যে "পুরানো" উপায়টি এখনও এই দিন কাজ করে, তাই যদি আপনি প্রয়োজন বোধ করেন তবে শর্তসাপেক্ষে নতুন সিনট্যাক্সটি ব্যবহারের জন্য এটি মূল্যবান কিনা তা নির্ধারণ করতে পারেন। পাইথনের পুরোনো সংস্করণের ব্যবহার সমর্থন করতে।


চেষ্টা

import platform
platform.python_version()

আপনাকে "2.3.1" মত একটি স্ট্রিং দিতে হবে। যদি এটি ঠিক না হয় তবে আপনি "প্ল্যাটফর্ম" বিল্ড-ইনের মাধ্যমে উপলব্ধ একটি সমৃদ্ধ সেট তথ্য পেতে চান। আপনি কি কোথাও হতে চান।


নিম্নলিখিত কাজ করে যে আপনার প্রোগ্রাম চারপাশে একটি মোড়ক আছে।

import sys

req_version = (2,5)
cur_version = sys.version_info

if cur_version >= req_version:
   import myApp
   myApp.run()
else:
   print "Your Python interpreter is too old. Please consider upgrading."

আপনি sys.version() ব্যবহার করে বিবেচনা করতে পারেন, যদি আপনি প্রাক sys.version() পাইথন ইন্টারপ্রেটার ব্যবহার করে এমন লোকেদের সম্মুখীন হওয়ার পরিকল্পনা করেন তবে আপনার কিছু নিয়মিত এক্সপ্রেশন আছে।

এবং এই কাজ আরো মার্জিত উপায় হতে পারে।


যদিও প্রশ্ন হল: ত্রুটি বার্তাটি প্রেরণ করতে এবং প্রস্থান করার জন্য আমি কীভাবে দ্রুত নিয়ন্ত্রণ পেতে পারি?

আমি যে প্রশ্নের উত্তর দিচ্ছি তা হল: অ্যাপ্লিকেশনটি শুরু করার আগে আমি কীভাবে ত্রুটি বার্তা জারি করতে যথেষ্ট পরিমাণে নিয়ন্ত্রণ পেতে পারি ?

আমি অন্যান্য পোস্ট তারপর অনেক ভিন্নভাবে উত্তর দিতে পারেন। উত্তর যতদূর পর্যন্ত পাইথন থেকে আপনার প্রশ্নের সমাধান করার চেষ্টা করছে।

আমি বলি, পাইথন চালু করার আগে সংস্করণ পরীক্ষা করে দেখুন। আমি আপনার পথ লিনাক্স বা ইউনিক্স দেখতে। তবে আমি শুধুমাত্র আপনাকে একটি উইন্ডোজ স্ক্রিপ্ট অফার করতে পারেন। আমি linux স্ক্রিপ্টিং সিনট্যাক্স এটি adapting ইমেজ খুব কঠিন হবে না।

এখানে সংস্করণ 2.7 সহ ডোএস স্ক্রিপ্ট রয়েছে:

@ECHO OFF
REM see http://ss64.com/nt/for_f.html
FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul
IF NOT ErrorLevel 1 GOTO Python27
ECHO must use python2.7 or greater
GOTO EOF
:Python27
python.exe tern.py
GOTO EOF
:EOF

এটি আপনার অ্যাপ্লিকেশনের কোন অংশ চালায় না এবং তাই পাইথন ব্যতিক্রমটি বাড়াবে না। এটি কোনও টেম্প ফাইল তৈরি করে না বা কোনও OS পরিবেশের ভেরিয়েবল যুক্ত করে না। এবং এটি ভিন্ন সংস্করণ সিনট্যাক্সের নিয়মগুলির কারণে আপনার অ্যাপটিকে ব্যতিক্রম হিসাবে শেষ করে না। যে অ্যাক্সেস তিনটি কম সম্ভাব্য নিরাপত্তা পয়েন্ট।

FOR /F লাইনটি কী।

FOR /F "tokens=1,2" %%G IN ('"python.exe -V 2>&1"') DO ECHO %%H | find "2.7" > Nul

একাধিক পাইথন সংস্করণের জন্য চেক আউট করুন url: http://www.fpschultze.de/modules/smartfaq/faq.php?faqid=17

এবং আমার হ্যাক সংস্করণ:

[এমএস স্ক্রিপ্ট; পাইথন সংস্করণটি পাইথন মডিউল এর প্রলোভন চেক করুন] http://pastebin.com/aAuJ91FQ


সমস্যা বেশ সহজ। সংস্করণ 2.4 এর চেয়ে কম না, আপনি কম বা সমান কিনা পরীক্ষা করেছেন। সুতরাং পাইথন সংস্করণ 2.4 হলে এটি 2.4 এর কম নয়। আপনি কি ছিল উচিত ছিল:

    if sys.version_info **<=** (2, 4):

, না

    if sys.version_info < (2, 4):

স্বতন্ত্র পাইথন স্ক্রিপ্টগুলির জন্য, নিচের মডিউল ডকস্ট্রিং কৌশলটি একটি পাইথন সংস্করণ প্রয়োগ করতে (এখানে v2.7.x) কাজ করে (* নিক্সে পরীক্ষা করে)।

#!/bin/sh
''''python -V 2>&1 | grep -q 2.7 && exec python -u -- "$0" ${1+"[email protected]"}; echo "python 2.7.x missing"; exit 1 # '''

import sys
[...]

এই অনুপস্থিত Python এক্সিকিউটেবল হিসাবে ভাল হ্যান্ডেল করা উচিত কিন্তু grep উপর নির্ভরতা আছে। পটভূমি জন্য here দেখুন।


import sys
sys.version

এই মত উত্তর পেয়ে হবে

'2.7.6 (ডিফল্ট, অক্টোবর 2016, 20:30:19) \ n [জিसीसी 4.8.4]'

এখানে 2.7.6 সংস্করণ







version