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


239

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

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

উদাহরণস্বরূপ, আমার কাছে একটি প্রোগ্রাম রয়েছে যা টের্নি অপারেটর (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

২.৪ এর অধীনে চালিত হওয়ার সময় আমি এই ফলাফলটি চাই

$ ~/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

(সহকর্মীর পক্ষে চ্যানেলিং।)


3
"পাইথনের সংস্করণটি পরীক্ষা করে দেখুন। এটি কীভাবে সমস্যা হয় তা আমি পাই না। আপনি যদি সংস্করণটি পরীক্ষা করতে পারেন তবে আপনি সিনট্যাক্স ত্রুটি এড়াতে পারবেন। সংস্করণ চেকিং সিনট্যাক্সের জন্য কীভাবে প্রযোজ্য নয়? আপনি আপনার প্রশ্ন পরিষ্কার করতে পারেন?
এস .লট

4
@ এসলট না আপনি ভুল নন, ঠিক যে অসুবিধাটি কোডটি কোথাও অন্তর্ভুক্ত করা হচ্ছে যেখানে এটি পড়া (পার্সড) করা হবে না এবং কার্যকর করা হবে না - উত্তরগুলি দেখানোর সাথে সাথে এটি তত্ক্ষণাত স্পষ্ট নয়।
ব্রেন্ডন

7
এস। লট, আপনি পাইথনের পুরানো সংস্করণে আপনার পরীক্ষা চালাতে পারবেন না কারণ এটি সংকলন করে না। পরিবর্তে, আপনি একটি জেনেরিক সিনট্যাক্স ত্রুটি পান। একটি 2.4 দোভাষী দিয়ে উদাহরণ কোডটি ব্যবহার করে দেখুন এবং আপনি দেখতে পাবেন যে আপনি সংস্করণ পরীক্ষায় যেতে পারবেন না।
মার্ক হ্যারিসন

7
@ এসলট ওয়েল এটি নির্ভর করে যে আপনি তুচ্ছ বিবেচনা করেন - ব্যক্তিগতভাবে আমি পাইথনের বিভিন্ন সংস্করণের জন্য আলাদা ফাইল তৈরি করা বা অতিরিক্ত প্রক্রিয়াগুলিকে তুচ্ছ হিসাবে বিবেচনা করব না। আমি বলব যে এই প্রশ্নটি মূল্যবান, বিশেষত যখন আপনি পাইথনটি পরিস্কার এবং প্রায়শই অবাক করার কৌশলগুলি সহ বিবেচনা করেন - আমি গুগল থেকে এখানে এসেছি এখানে একটি ঝরঝরে উত্তর আছে কিনা তা জানতে চেয়েছিলেন
ব্রেন্ডন

7
আমি মনে করি আমরা এই আলোচনার শেষ পর্যায়ে পৌঁছেছি। আমি এমন কিছু সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করেছি যা আমি কীভাবে করব তা জানি না এবং কীভাবে এটি করতে হয় তা সম্পর্কে আমাকে উত্তর পেয়েছে। আমি কোনও প্রস্তাব দিচ্ছি না, আমি কেবল অরিপের উত্তর গ্রহণ করেছি যা আমার জন্য দুর্দান্ত কাজ করছে (আসলে সহকর্মী যার জন্য আমি চ্যানেল করছি)। ভিভা লে স্ট্যাক ওভারফ্লো!
মার্ক হ্যারিসন

উত্তর:


111

আপনি পরীক্ষা করে দেখতে পারেন eval:

try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

এছাড়াও, with হয় পাইথন 2.5 এ, শুধু যোগ প্রাপ্তিসাধ্য from __future__ import with_statement

সম্পাদনা: তাড়াতাড়ি নিয়ন্ত্রণ পেতে, আপনি এটিকে বিভিন্ন .pyফাইলে বিভক্ত করতে এবং আমদানির আগে মূল ফাইলটিতে সামঞ্জস্যতা পরীক্ষা করতে পারেন (উদাহরণস্বরূপ __init__.pyপ্যাকেজটিতে):

# __init__.py

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

# import from another module
from impl import *

10
এটি একটি দুর্দান্ত উত্তর। যে প্রশ্নটির সমাধানের প্রয়োজন ছিল তার মূল বিষয়টি হ'ল অজগরটির সেই সংস্করণটির জন্য এমনকি একটি সম্পাদন শুরু করার জন্য একটি প্রোগ্রাম অবশ্যই সিন্টেক্সিকভাবে সঠিক হওয়া উচিত, সুতরাং নতুন সিনট্যাক্স ব্যবহার করে কোনও প্রোগ্রামকে অনুবাদকের পুরানো সংস্করণ শুরু করা থেকে বিরত রাখে। এর চারপাশে eval কাজ করে
8,99 এ অটোপলেক্টিক

7
যদি প্যাকেজটি সেটআপলগুলিতে ইনস্টল করা থাকে তবে উত্স ফাইলগুলি বাইট-সংকলন ব্যর্থ হবে। এছাড়াও, একটি রান-টাইম ত্রুটি বার্তা উত্পন্ন সমস্ত কনট্রোলশানগুলি কিছু অর্থহীন বলে মনে হয় - কেন কেবল প্রয়োজনীয়তাগুলি নথিবদ্ধ করে এটিকে ছেড়ে দেওয়া হয় না?
জন মাচিন

2
মনে রাখবেন যে যদি কোনও সাধারণ বিবৃতি না দিয়ে অভিব্যক্তিটি পরীক্ষা করার চেষ্টা করা হয় তবে আপনার execপরিবর্তে ব্যবহার করা দরকার eval। আমি একটি ফাংশন লিখার চেষ্টা করার সময় এই বিষয়টি সামনে এনেছিলাম যা স্টায়ার্ডারে py2k এবং py3k মুদ্রণ করতে পারে।
জিয়াং চিয়ামিওভ

2
আমি মনে করি যে এই সমাধানটির ক্লিনার সংস্করণটি হ'ল আপনার "চেকগুলি" আলাদা মডিউলে রাখা হবে এবং এটি আমদানি করা ( importচেষ্টা করুন / বাদে স্টেশনটি মোড়ানো )। মনে রাখবেন যে আপনার SyntaxErrorপাশাপাশি অন্যান্য জিনিসগুলির জন্যও পরীক্ষা করা প্রয়োজন (যেমন স্ট্যান্ডার্ড ফাংশন বা স্ট্যান্ডার্ড লাইব্রেরিতে সংযোজন)
স্টিভেন

103

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

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()যদি 2.0-পূর্ব পাইথন দোভাষী ব্যবহার করছেন এমন লোকদের মুখোমুখি হওয়ার পরিকল্পনা করেন তবে আপনি এটি ব্যবহার করেও বিবেচনা করতে পারেন , তবে আপনার কিছু নিয়মিত প্রকাশ করতে হবে ions

এটি করার জন্য আরও মার্জিত উপায় থাকতে পারে।


7
FYI, "cur_version> = req_version" শর্তাধীন হিসাবে কাজ করা উচিত।
অরিপ

4
sys.version_infoকোন কাজ নয়।
এনএইচ 2

3
এর মতো সাফল্যের শর্তাধীন কোডের কোড লাগানো বেশ খারাপ অভ্যাস কারণ এটি একটি যুক্তিযুক্ত যুক্তি এবং যুক্তির সংযোজন। কেবল একটি করুন: যদি sys.version_info [: 2] <req_version: "পুরানো" মুদ্রণ করুন; sys.exit () - এবং অন্যথায় যথারীতি চালিয়ে যান।
টিমাস

1
এটি টিম পিটার্সের মতো "পাইথনের জেন" -তে বলেছেন: "ফ্ল্যাটটি নেস্টেডের চেয়ে ভাল।" (
অজগরটিতে

1
@ ক্রিস্টোফারশ্রোবা আপনাকে ধন্যবাদ import this । একটি সুন্দর বাঁক
স্যামুয়েল হারমার

32

চেষ্টা

আমদানি প্ল্যাটফর্ম
platform.python_version ()

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


4
-1: আপডেট করা প্রশ্নে বর্ণিত হিসাবে এটি কাজ করে না। আপনি যদি পাইথনের নতুন সংস্করণ থেকে কোনও সিনট্যাক্স ব্যবহার করেন তবে আপনার ফাইলটি সংকলন করবে না এবং এটি সংকলন না করলে এটি চালনা করে সংস্করণটি পরীক্ষা করতে পারে না!
স্কট গ্রিফিথস

1
এর print(platform.python_version())পরিবর্তে স্কটগ্রিফিটস চালান platform.python_version()!
সুরিয়া

@ScottGriffiths এছাড়াও আমার উত্তর চেকআউট: stackoverflow.com/a/40633458/5157221
সুরিয়া

22

সম্ভবত এই সংস্করণটি তুলনা করার সর্বোত্তম উপায় হ'ল ব্যবহার করা sys.hexversion। এটি গুরুত্বপূর্ণ কারণ সংস্করণ টিপলগুলি তুলনা করা আপনাকে সমস্ত অজগর সংস্করণে পছন্দসই ফলাফল দেয় না।

import sys
if sys.hexversion < 0x02060000:
    print "yep!"
else:
    print "oops!"

আমি মনে করি এটি সবচেয়ে মার্জিত, তবে অন্যান্য দেবগণের দ্বারা বোঝা সম্ভবত সহজ নয়।
নিক বোল্টন

5
সংস্করণ টিপলগুলি তুলনা করে কোন পরিস্থিতিতে কাঙ্ক্ষিত ফলাফল দেবে না আপনি তা ব্যাখ্যা করতে পারেন?
চামচমাইজার

সংস্করণ টিপলগুলিতে বর্ণমালার মানও থাকতে পারে।
সোরিিন

8
-1: আপডেট করা প্রশ্নে বর্ণিত হিসাবে এটি কাজ করে না। আপনি যদি পাইথনের নতুন সংস্করণ থেকে কোনও সিনট্যাক্স ব্যবহার করেন তবে আপনার ফাইলটি সংকলন করবে না এবং এটি সংকলন না করলে এটি চালনা করে সংস্করণটি পরীক্ষা করতে পারে না!
স্কট গ্রিফিথস 14

কোন সংস্করণ / প্ল্যাটফর্মে এটি ব্যর্থ হয়?
sorin

15
import sys    
# prints whether python is version 3 or not
python_version = sys.version_info.major
if python_version == 3:
    print("is python 3")
else:
    print("not python 3")

7
জেনে রাখুন যে পাইথন 2.6 এবং নীচের মধ্যে হও sys.version_infoহয় না একটি নামাঙ্কিত tuple। আপনাকে sys.version_info[0]প্রধান সংস্করণ নম্বর এবং sys.version_info[1]নাবালিকার জন্য ব্যবহার করতে হবে।
coredumperror

9

এ Nykakin থেকে উত্তর 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 এ ডাব্লুএএমপি সার্ভারের মাধ্যমে সিজিআই দিয়ে পাইথনের আউটপুট:

স্ক্রিনশট 2016-11-16 14.39.01 সুরিয়া কুডো লিখেছেন


সহায়ক সংস্থান


7

পিছনে সামঞ্জস্যপূর্ণ থাকার জন্য সেটগুলি পাইথন ২.৪-এ মূল ভাষার অংশে পরিণত হয়েছিল। আমি তখন এটি করেছি, যা আপনার পক্ষেও কার্যকর হবে:

if sys.version_info < (2, 4):
    from sets import Set as set

3
সংস্করণের পরিবর্তে বৈশিষ্ট্যটি পরীক্ষা করা ভাল, না? try: set except NameError: from sets import Set as set
অলিপ

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

7

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

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

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

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

সংস্করণ ২.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

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

FOR /Fলাইন চাবিকাঠি।

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

একাধিক অজগর সংস্করণের জন্য url চেক আউট করুন :

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

[এমএস লিপি; পাইথন সংস্করণ পরীক্ষা পাইথন মডিউলটির প্রিল لانঞ্চ] http://pastebin.com/aAuJ91FQ


নিচের মত ভোটের জন্য দয়া করে এর কারণ ব্যাখ্যা করতে ভয় পাবেন না।
দেবপ্লেয়ার

ঠিক আমি খুঁজছিলাম ছিল। ধন্যবাদ! %% এইচ কি?
ক্লোকার

@ ক্লোকার পাইথন.এক্সই-ভি একটি "পাইথন ২.7" স্ট্রিং ফিরিয়ে আনবে। কনসোলটি "পাইথন" স্ট্রিংটি %% G এবং "2.7" স্ট্রিংকে স্বয়ংক্রিয়ভাবে তৈরি করা OS var %% H (G এর পরের অক্ষর) মধ্যে রাখে। প্রতিধ্বনি %% এইচ | ডস কমান্ডের মধ্যে "2.7" পাইপগুলি "2.7" সন্ধান করুন "2.7" সন্ধান করুন যা "% 2.7" তে %% H পাওয়া গেলে ত্রুটির স্তর 1 এ সেট করে। এই ত্রুটি স্তরটি 1 এর ফলে ডস
ফাইন্ড

3
import sys
sys.version

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

'২.7..6 (ডিফল্ট, ২ 26 অক্টোবর 2016, 20:30:19) \ n [জিসিসি 4.8.4]'

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


2

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

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

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

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

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

value = 'yes' if MyVarIsTrue else 'no'

..এটি সমর্থন কোড পছন্দ করে

value = MyVarIsTrue and 'yes' or 'no'

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


2
সিরিয়াসলি? আপনার কোডটিকে নকল করুন যাতে আপনি কিছু ছোট ছোট কাঠামো পরিবর্তন করতে পারেন? ইশ। খুব ইয়াক এবং a and b or cপরিবর্তে হিসাবে b if a else c, এটি সমতুল্য নয়; যদি bfalsy এটা ব্যর্থ হবে, উৎপাদন aবদলে b
ক্রিস মরগান

1
আমি সদৃশ কোডের পরামর্শ দিচ্ছি না, আমি সংস্করণ-নির্দিষ্ট কোডের জন্য মোড়ক ফাংশন তৈরির পরামর্শ দিচ্ছি, যার স্বাক্ষরগুলি সংস্করণগুলিতে পরিবর্তিত হয় না এবং সেই ফাংশনগুলিকে সংস্করণ-নির্দিষ্ট মডিউলগুলিতে রাখে। আমি এমন ফাংশনগুলির বিষয়ে বলছি যা সম্ভবত 1 থেকে 5 লাইন দীর্ঘ। এটি সত্য যে খ এবং মিথ্যা হিসাবে মূল্যায়ন করতে পারে এমন ক্ষেত্রে অন্য কোনও সি যদি খ এবং সি বা বি এর সমান হয় না। সুতরাং আমি অনুমান করি if_TenBElseC (a, b, c) সাধারণ_অ্যাপস _4৪.৩.২০ এ, 1 এর পরিবর্তে 2 বা 3 লাইন লম্বা হতে হবে method এই পদ্ধতিটি আসলে সাধারণ আইডিয়োমগুলিকে ফাংশনগুলিতে আবদ্ধ করে আপনার সমস্ত কোডকে হ্রাস করে।
শাওয়াইস

2

নিম্নলিখিতটি আপনার ফাইলের একেবারে শীর্ষে রাখুন:

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...

1
বরং ব্যবহার করুনsys.version_info < (2, 7)
এন্টি হাপাল

@ আন্টিহাপাল এটি আমার পক্ষে নিখুঁত, আপনি কী ব্যাখ্যা করতে পারেন যে sys.version_infoধরণের তুলনাটি একটি টিপল কাজের সাথে কেন ?
jjj

@jjj টিপল sys.version_info হত ; উদাহরণস্বরূপ (2, 4, 6, 'final', 0); কেবল পাইথন 3 এবং 2.7 এ এটি একটি পৃথক ধরণের রূপান্তরিত হয়েছিল, যা তবুও টিউপসগুলির সাথে তুলনীয়।
অ্যান্টি হাপালা

অ্যান্টিহাপাল @ আমার কাছে এই পদ্ধতির চেয়ে ভাল লাগছে ... ধন্যবাদ!
জেএমএল

1

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

উদাহরণ:

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

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


2
তুমি ঠিক বলছো. তিনি কীভাবে এটি করতে চেয়েছিলেন - কখনও কখনও ওয়াই সংস্করণে বৈশিষ্ট্যগুলির জন্য পরীক্ষা করা X সংস্করণে বাইটকোড তৈরি করতে সংকলন করে না, তাই এটি সরাসরি করা যায় না।
অরিপ

1

আমি নিজেই এই সমস্যার সমাধান করার চেষ্টা করার সাথে সাথে দ্রুত অনুসন্ধানের পরে এই প্রশ্নটি পেয়েছি এবং আমি উপরের কয়েকটি পরামর্শের ভিত্তিতে একটি হাইব্রিড নিয়ে এসেছি।

আমি একটি র‌্যাপার স্ক্রিপ্ট ব্যবহারের জন্য দেবপ্লেয়ারের ধারণা পছন্দ করি তবে খারাপ দিকটি হ'ল আপনি বিভিন্ন ওএসের জন্য একাধিক মোড়কের রক্ষণাবেক্ষণ শেষ করেন, তাই আমি পাইথনটিতে মোড়কটি লেখার সিদ্ধান্ত নিয়েছি, তবে একই বেসিকটি "এক্সপি চালিয়ে সংস্করণটি ধরুন" ব্যবহার করুন এবং এটি সঙ্গে এসেছিলেন।

আমি মনে করি এটি 2.5 এবং এর পরেও কাজ করা উচিত। আমি এটিকে 2.66, 2.7.0 এবং 3.1.2 এবং লিনাক্সে এবং 2.6.1 ওএস এক্স-তে পরীক্ষা করেছি।

import sys, subprocess
args = [sys.executable,"--version"]

output, error = subprocess.Popen(args ,stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()
print("The version is: '%s'"  %error.decode(sys.stdout.encoding).strip("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLMNBVCXZ,.+ \n") )

হ্যাঁ, আমি জানি চূড়ান্ত ডিকোড / স্ট্রিপ লাইনটি ভয়াবহ, তবে আমি দ্রুত সংস্করণ নম্বরটি দখল করতে চেয়েছিলাম। আমি এটি পরিমার্জন করতে যাচ্ছি।

এটি আপাতত আমার পক্ষে যথেষ্ট কাজ করে তবে কেউ যদি এটির উন্নতি করতে পারে (বা আমাকে কেন এটি ভয়ঙ্কর ধারণা) তবে খুব শীতল হতে চাই।


1

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

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

import sys
[...]

এটি অজানা এক্সিকিউটেবল হ্যান্ডেল করা উচিত তবে গ্রেপের উপর নির্ভরতা রয়েছে। পটভূমি জন্য এখানে দেখুন ।


0

আপনি sys.hexversionবা সাথে চেক করতে পারেন sys.version_info

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

পাইথন 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()

পাইথন 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 , যদিও এটি কম মানুষের বান্ধব।

আমি আশা করি এটি আপনাকে সাহায্য করেছে!


0

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

যদি আপনি নিশ্চিত করতে চান যে স্ক্রিপ্টটি পাইথন ৩.6 বা আরও নতুন দিয়ে চলছে, তবে আপনার পাইথন স্ক্রিপ্টের শীর্ষে এই দুটি লাইন যুক্ত করুন:

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

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

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

This script requires Python 3.6 or newer.

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


-2

এটি সম্পর্কে:

import sys

def testPyVer(reqver):
  if float(sys.version[:3]) >= reqver:
    return 1
  else:
    return 0

#blah blah blah, more code

if testPyVer(3.0) == 1:
  #do stuff
else:
  #print python requirement, exit statement

5
-1: আপডেট করা প্রশ্নে বর্ণিত হিসাবে এটি কাজ করে না। আপনি যদি পাইথনের নতুন সংস্করণ থেকে কোনও সিনট্যাক্স ব্যবহার করেন তবে আপনার ফাইলটি সংকলন করবে না এবং এটি সংকলন না করলে এটি চালনা করে সংস্করণটি পরীক্ষা করতে পারে না!
স্কট গ্রিফিথস 14

-3

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

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

, না

    if sys.version_info < (2, 4):

4
অনুচ্ছেদ 3 এবং আপডেটটি পড়ুন। আপনি এই কোডটি কার্যকর করতে পারবেন না কারণ আপনি যদি নতুন ভাষা গঠন ব্যবহার করেন তবে আপনার কোডটি ২.৪-এ সংকলন করবে না।
মার্ক হ্যারিসন

এর চেয়ে কম জরিমানা, খালি খালি অনুপস্থিত।
ক্রেগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.