शेल स्क्रिप्ट में पायथन संस्करण का पता लगाएं


85

मैं यह जानना चाहूंगा कि क्या लिनक्स सिस्टम पर अजगर स्थापित है और यदि यह है, तो अजगर संस्करण कौन सा स्थापित है।

मैं यह कैसे कर सकता हूं? के उत्पादन को पार्स करने की तुलना में अधिक सुंदर कुछ है "python --version"?


4
अजगर क्यों - अपमानजनक है? हो सकता है / usr / bin / env python --version?
हाइपरबोरस

3
"अस्वाभाविक" से मेरा अभिप्राय यह है कि स्ट्रिंग पार्सिंग को अमान्य करते हुए भविष्य में स्ट्रिंग प्रारूप बदल सकता है।
TheRealNeo

अजगर 2.4 के लिए एक त्रुटि देता है python --version। आपको उपयोग करने की आवश्यकता है python -V
jww

जवाबों:


80

आप निम्नलिखित पंक्तियों के साथ कुछ का उपयोग कर सकते हैं:

$ python -c 'import sys; print(sys.version_info[:])'
(2, 6, 5, 'final', 0)

टपल का दस्तावेज यहां दिया गया है । आप संस्करण संख्या को अपनी आवश्यकताओं के अनुरूप या वास्तव में उस पर जाँच करने के लिए ऊपर पायथन कोड का विस्तार कर सकते हैं।

$?जहाँ pythonनहीं पाया गया है उस मामले को संभालने के लिए आपको अपनी स्क्रिप्ट में जाँच करनी होगी ।

पुनश्च मैं थोड़ा अजीब सिंटैक्स का उपयोग कर रहा हूं ताकि पायथन 2.x और 3.x दोनों के साथ संगतता सुनिश्चित हो सके।


6
आप परिणामों को एक चर में संग्रहीत कर सकते हैं: export PYTHON_VERSION=`python -c 'import sys; version=sys.version_info[:3]; print("{0}.{1}.{2}".format(*version))'`उस समाधान का उपयोग करके। नीचे रेगेक्स सामान की तुलना में बहुत अच्छा है।
ड्रैगनटॉक्स

2
किसी और के लिए यहाँ कि भूमि क्योंकि आप एक निश्चित अजगर संस्करण को आश्वस्त करना चाहते हैं स्थापित किया गया है: मैं इसे एक मुखर के साथ मिलकर उपयोग कर रहा हूं, इसलिए मैं इसे इस तरह से bash स्क्रिप्ट में उपयोग कर सकता हूं:if ! python3 -c 'import sys; assert sys.version_info >= (3,6)' > /dev/null; then
थॉमस

31
python -c 'import sys; print sys.version_info'

या, मानव-पठनीय:

python -c 'import sys; print(".".join(map(str, sys.version_info[:3])))'


14

मैंने जाहिद के उत्तर का उपयोग एक स्ट्रिंग से एक्सट्रैक्ट वर्जन नंबर के साथ किया, ताकि वह शुद्ध रूप से शेल में कुछ लिखा जा सके। यह केवल एक संस्करण संख्या देता है, न कि "पायथन" शब्द। यदि स्ट्रिंग खाली है, तो पायथन स्थापित नहीं है।

version=$(python -V 2>&1 | grep -Po '(?<=Python )(.+)')
if [[ -z "$version" ]]
then
    echo "No Python!" 
fi

और मान लें कि आप संस्करण संख्या की तुलना यह देखना चाहते हैं कि क्या आप पायथन के अद्यतित संस्करण का उपयोग कर रहे हैं, संस्करण संख्या में अवधियों को हटाने के लिए निम्नलिखित का उपयोग करें। फिर आप पूर्णांक संचालकों का उपयोग करके संस्करणों की तुलना कर सकते हैं, जैसे "मुझे पायथन संस्करण 2.7.0 से अधिक और 3.0.0 से कम चाहिए"। संदर्भ: http://tldp.org/LDP/abs/html/parameter-sstst.html में $ {var // पैटर्न / प्रतिस्थापन}

parsedVersion=$(echo "${version//./}")
if [[ "$parsedVersion" -lt "300" && "$parsedVersion" -gt "270" ]]
then 
    echo "Valid version"
else
    echo "Invalid version"
fi

2
अच्छा है, इसके लिए धन्यवाद, लेकिन समस्या यह है कि अजगर के कुछ संस्करण 4 अंक और 3 अंक के साथ अन्य रिटर्न करते हैं, जैसे कि पायथन 2.7.12, इसलिए 300 के साथ 2712 की तुलना करना काम नहीं करता है :(
Lilás

ऐसा करना कम सरल हो जाता है, लेकिन आपको पूर्णांक मान 2712, स्टिक '0.' मिल सकता है। इसके पीछे है, तो साथ '0.300' तर्क का प्रयोग में पाया तुलना stackoverflow.com/questions/11237794/...
सोहराब टी

12

आप प्लेटफ़ॉर्म मॉड्यूल का उपयोग कर सकते हैं जो मानक पायथन लाइब्रेरी का हिस्सा है:

$ python -c 'import platform; print(platform.python_version())'
2.6.9

यह मॉड्यूल आपको संस्करण स्ट्रिंग के केवल एक भाग को प्रिंट करने की अनुमति देता है :

$ python -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major); print(minor); print(patch)'
2
6
9

दरअसल, प्लैटफॉर्म मॉड्यूल के लिए बनाया गया लगता है। हालाँकि, यह sys.version_info का उपयोग करने में थोड़ा अवर लगता है क्योंकि प्लेटफ़ॉर्म मॉड्यूल केवल पायथन 2.3 में दिखाई दिया था जबकि sys.version_info Python 2.0 में दिखाई दिया था
TheRealNeo

10

यहां यह प्रमाणित करने के लिए हैश का उपयोग करने का एक और उपाय है कि क्या अजगर स्थापित है और संस्करण के पहले दो प्रमुख नंबरों को निकालने के लिए sed है और यदि न्यूनतम संस्करण स्थापित है तो तुलना करें

if ! hash python; then
    echo "python is not installed"
    exit 1
fi

ver=$(python -V 2>&1 | sed 's/.* \([0-9]\).\([0-9]\).*/\1\2/')
if [ "$ver" -lt "27" ]; then
    echo "This script requires python 2.7 or greater"
    exit 1
fi


8

यदि आप शेल स्क्रिप्ट में संस्करण की तुलना करना चाहते हैं तो sys.hexversion का उपयोग करना उपयोगी हो सकता है

ret=`python -c 'import sys; print("%i" % (sys.hexversion<0x03000000))'`
if [ $ret -eq 0 ]; then
    echo "we require python version <3"
else 
    echo "python version is <3"
fi

6

संभावित समाधानों की लंबी सूची में जोड़कर, यहां एक समान है - स्वीकृत उत्तर - सिवाय इसके कि इसमें एक सरल संस्करण चेक बनाया गया है:

python -c 'import sys; exit(1) if sys.version_info.major < 3 and sys.version_info.minor < 5 else exit(0)'

यदि अजगर स्थापित है और कम से कम संस्करण 3.5, तो यह 0 पर वापस आ जाएगा और 1यदि:

  • अजगर स्थापित नहीं है
  • पायथन आईएस स्थापित है, लेकिन इसका संस्करण संस्करण से कम है 3.5

मूल्य की जांच करने के लिए, बस तुलना करें $?(मान लें bash), जैसा कि अन्य प्रश्नों में देखा गया है।

खबरदार कि यह अलग-अलग संस्करणों की जाँच करने की अनुमति नहीं देता है Python2- जैसा कि उपरोक्त वन-लाइनर Py2 में एक अपवाद को फेंक देगा। हालाँकि, चूंकि Python2यह दरवाजे से बाहर है, इसलिए यह कोई समस्या नहीं होनी चाहिए।


4

एक शेल स्क्रिप्ट में अजगर संस्करण 2+ या 3+ का पता लगाना:

# !/bin/bash
ver=$(python -c"import sys; print(sys.version_info.major)")
if [ $ver -eq 2 ]; then
    echo "python version 2"
elif [ $ver -eq 3 ]; then
    echo "python version 3"
else 
    echo "Unknown python version: $ver"
fi

3

यह जाँचने के लिए कि क्या कोई पायथन स्थापित है (यह पथ पर है), यह उतना ही सरल है:

if which python > /dev/null 2>&1;
then
    #Python is installed
else
    #Python is not installed
fi

> /dev/null 2>&1हिस्सा सिर्फ दबाने उत्पादन के लिए है।

वर्जन नंबर भी प्राप्त करने के लिए:

if which python > /dev/null 2>&1;
then
    #Python is installed
    python_version=`python --version 2>&1 | awk '{print $2}'`
    echo "Python version $python_version is installed."

else
    #Python is not installed
    echo "No Python executable is found."
fi

पायथन 3.5 के साथ नमूना आउटपुट स्थापित किया गया: "पायथन संस्करण 3.5.0 स्थापित है।"

नोट 1: awk '{print $2}'यदि पायथन स्थापित नहीं है, तो यह हिस्सा सही ढंग से काम नहीं करेगा, इसलिए या तो ऊपर के नमूने में चेक का उपयोग करें, या सोहराब टीgrep द्वारा सुझाए अनुसार उपयोग करें । हालांकि Perl regexp सिंटैक्स का उपयोग करता है और इसमें कुछ पोर्टेबिलिटी समस्याएं हो सकती हैं।grep -P

नोट 2: python --versionया python -V2.5 से पहले पायथन संस्करणों के साथ काम नहीं कर सकता है। इस मामले python -c ...में अन्य उत्तरों में सुझाए अनुसार उपयोग करें ।


2

यदि आपको बैश स्क्रिप्ट की आवश्यकता है, तो "NoPython" को गूँजता है यदि पायथन स्थापित नहीं है, और पायथन संदर्भ के साथ यदि इसे स्थापित किया गया है, तो आप निम्न check_python.shस्क्रिप्ट का उपयोग कर सकते हैं ।

  • यह समझने के लिए कि आपके ऐप में इसका उपयोग कैसे किया जाता है, मैंने भी जोड़ा है my_app.sh
  • जांचें कि यह किसके साथ खेलकर काम करता है PYTHON_MINIMUM_MAJORऔरPYTHON_MINIMUM_MINOR

check_python.sh

#!/bin/bash

# Set minimum required versions
PYTHON_MINIMUM_MAJOR=3
PYTHON_MINIMUM_MINOR=6

# Get python references
PYTHON3_REF=$(which python3 | grep "/python3")
PYTHON_REF=$(which python | grep "/python")

error_msg(){
    echo "NoPython"
}

python_ref(){
    local my_ref=$1
    echo $($my_ref -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major); print(minor);')
}

# Print success_msg/error_msg according to the provided minimum required versions
check_version(){
    local major=$1
    local minor=$2
    local python_ref=$3
    [[ $major -ge $PYTHON_MINIMUM_MAJOR && $minor -ge $PYTHON_MINIMUM_MINOR ]] && echo $python_ref || error_msg
}

# Logic
if [[ ! -z $PYTHON3_REF ]]; then
    version=($(python_ref python3))
    check_version ${version[0]} ${version[1]} $PYTHON3_REF
elif [[ ! -z $PYTHON_REF ]]; then
    # Didn't find python3, let's try python
    version=($(python_ref python))
    check_version ${version[0]} ${version[1]} $PYTHON_REF
else
    # Python is not installed at all
    error_msg
fi

my_app.sh

#!/bin/bash
# Add this before your app's code
PYTHON_REF=$(source ./check_python.sh) # change path if necessary
if [[ "$PYTHON_REF" == "NoPython" ]]; then
    echo "Python3.6+ is not installed."
    exit
fi

# This is your app
# PYTHON_REF is python or python3
$PYTHON_REF -c "print('hello from python 3.6+')";

1
ठीक वही जो मेरे द्वारा खोजा जा रहा था। धन्यवाद!
एंड्रे सेमकिन

1

अभी तक केवल प्रमुख और मामूली संस्करण संख्या के साथ एक पठनीय तरीके से पायथन संस्करण को प्रिंट करने का एक और तरीका है। उदाहरण के लिए, "3.8.3" के बजाय यह "38" प्रिंट करेगा, और "2.7.18" के बजाय यह "27" प्रिंट करेगा।

python -c "import sys; print(''.join(map(str, sys.version_info[:2])))"

पायथन 2 और 3 दोनों के लिए काम करता है।


0

यदि आपको यह जांचने की आवश्यकता है कि क्या संस्करण कम से कम 'कुछ संस्करण' है, तो मैं समाधान पसंद करता हूं जो संस्करण भागों में अंकों की संख्या के बारे में धारणा नहीं बनाता है।

VERSION=$(python -V 2>&1 | cut -d\  -f 2) # python 2 prints version to stderr
VERSION=(${VERSION//./ }) # make an version parts array 
if [[ ${VERSION[0]} -lt 3 ]] || [[ ${VERSION[0]} -eq 3 && ${VERSION[1] -lt 5 ]] ; then
    echo "Python 3.5+ needed!" 1>&2
    return 1
fi

यह इस उत्तर से प्रेरित होकर 2.12.32 या 3.12.0 आदि की संख्या के साथ भी काम करेगा ।


-1 का कोई कारण?
Mi-La

0

सबसे आसान तरीका होगा:

if ! python3 --version ; then
    echo "python3 is not installed"
    exit 1
fi

# In the form major.minor.micro e.g. '3.6.8'
# The second part excludes the 'Python ' prefix 
PYTHON_VERSION=`python3 --version | awk '{print $2}'`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.