आपने कभी किसी सॉफ़्टवेयर को यह अनुमति माँगते देखा होगा कि वह आपके PATH वेरिएबल में बदलाव कर सके, या किसी दूसरे प्रोग्राम के इंस्टॉलेशन निर्देशों में यह गूढ़ लाइन कि आपको "अपना LD_LIBRARY_PATH वेरिएबल सही तरह सेट करना है"।
डेटा वैज्ञानिक के रूप में, आप अपने कंप्यूट स्टैक के साथ काम करते समय अन्य environment variable संबंधी समस्याओं से भी दो-चार हो सकते हैं (खासतौर पर तब, जब उस पर आपका पूरा नियंत्रण न हो, जैसा कि मेरे साथ होता है)। यह पोस्ट बताती है कि environment variable होता क्या है और डेटा साइंस के संदर्भ में इसका उपयोग कैसे होता है।
Environment Variable क्या है?
सबसे पहले, मैं PATH environment variable के ज़रिए गहराई से समझाता हूँ कि environment variable क्या होता है। मैं आपको प्रोत्साहित करूँगा कि यहाँ दिए गए कमांड्स अपने bash टर्मिनल में चलाएँ (ज़रूरत के मुताबिक बदलाव करें — मैं क्या कर रहा हूँ, यह समझने के लिए टेक्स्ट पढ़ें!).
जब आप अपने कंप्यूटर सिस्टम में लॉग इन करते हैं, मान लें लोकल कंप्यूटर के टर्मिनल में या SSH के ज़रिए किसी रिमोट सर्वर में, तो आपका bash इंटरप्रेटर यह जानना चाहता है कि किन प्रोग्रामों को कहाँ ढूँढना है, जैसे nano (टेक्स्ट एडिटर), या git (वर्ज़न कंट्रोल सॉफ़्टवेयर), या आपका Python executable। यह सब आपके PATH वेरिएबल से नियंत्रित होता है। इसमें उन फ़ोल्डरों के पाथ होते हैं जहाँ आपके executable प्रोग्राम मिलते हैं।
ऐतिहासिक परंपरा से, कमांड लाइन प्रोग्राम, जैसे nano, which, और top, /usr/bin डायरेक्टरी में मिलते हैं। (ऐतिहासिक परंपरा से, /bin फ़ोल्डर सॉफ़्टवेयर बाइनरीज़ के लिए है, इसलिए उनका नाम /bin है।) ये वे प्रोग्राम हैं जो आपके ऑपरेटिंग सिस्टम के साथ बंडल होते हैं और इन्हें अपग्रेड करने के लिए विशेष अनुमतियों की ज़रूरत होती है।
टर्मिनल में आज़माएँ:
$ which which
/usr/bin/which
$ which top
/usr/bin/top
कुछ अन्य प्रोग्राम (किसी वजह से) /bin में इंस्टॉल होते हैं। ls एक उदाहरण है:
$ which ls
/bin/ls
और कुछ प्रोग्राम अन्य विशेष डायरेक्टरियों में भी इंस्टॉल हो सकते हैं:
$ which nano
/usr/local/bin/nano
आपका Bash टर्मिनल यह कैसे समझता है कि किन जगहों पर क्या ढूँढना है? वह PATH environment variable का उपयोग करता है। यह कुछ इस तरह दिखता है:
$ echo $PATH
/usr/bin:/bin:/usr/local/bin
PATH वेरिएबल के बारे में सबसे अहम बात यह है कि यह "कोलन-डिलिमिटेड" होता है। यानी, हर डायरेक्टरी पाथ अगले से "कोलन" (:) कैरेक्टर के साथ अलग होता है। आपका bash टर्मिनल प्रोग्राम ढूँढते समय बाएँ से दाएँ क्रम में देखता है:
/usr/bin/bin/usr/local/bin
मेरे कंप्यूटर पर, जब मैं ls टाइप करता हूँ, तो मेरा bash इंटरप्रेटर पहले /usr/bin डायरेक्टरी में देखता है। वहाँ ls नहीं मिलता, तो वह अगली डायरेक्टरी /bin में जाता है। चूँकि मेरा ls /bin के भीतर है, वह यहीं से ls प्रोग्राम चलाता है।
आप देख सकते हैं कि यह व्यवस्था आपकी कंप्यूट एनवायरनमेंट को कस्टमाइज़ करने में बेहद लचीली है, लेकिन अगर कोई प्रोग्राम आपकी जानकारी के बिना आपका PATH वेरिएबल बदल दे, तो यह उतनी ही निराशाजनक भी हो सकती है।
रुकिए, क्या आप सच में अपना PATH वेरिएबल बदल सकते हैं? हाँ, और इसके कुछ तरीके हैं।
PATH वेरिएबल कैसे बदलें
Bash सत्र का उपयोग करते हुए
पहला तरीका अस्थायी होता है और सिर्फ आपके मौजूदा bash सत्र पर लागू होता है। आप किसी फ़ोल्डर को मौजूदा पाथ्स से अधिक प्राथमिकता देना चाहें, तो उसे PATH वेरिएबल में "प्रि-पेंड" करें:
$ export PATH=/path/to/my/folder:$PATH
$ echo $PATH
/path/to/my/folder:/usr/bin:/bin:/usr/local/bin
या आप उसे कम प्राथमिकता देना चाहें, तो PATH वेरिएबल के अंत में "एपेंड" करें:
$ export PATH=$PATH:/path/to/my/folder
$ echo $PATH
/usr/bin:/bin:/usr/local/bin:/path/to/my/folder
यह अस्थायी इसलिए है क्योंकि मैं इसे केवल मौजूदा bash सत्र के दौरान ही एक्सपोर्ट करता हूँ।
bashrc या .bash_profile फ़ाइल
अगर मैं बदलावों को कुछ अधिक स्थायी बनाना चाहूँ, तो उन्हें अपनी .bashrc या .bash_profile फ़ाइल में शामिल करूँगा। (मैं .bashrc फ़ाइल की सिफारिश करता हूँ।) .bashrc/.bash_profile फ़ाइल आपके होम डायरेक्टरी में रहती है (इसे आपका $HOME environment variable बताता है) और आपका bash इंटरप्रेटर लोड होते ही सबसे पहले इसे चलाता है। यह अंदर लिखे सभी कमांड्स चलाता है। इसका मतलब, आप अपनी .bashrc में लाइनें डालकर PATH वेरिएबल बदल सकते हैं:
...other stuff above...
# Make /path/to/folder have higher priority
export PATH=/path/to/folder:$PATH
# Make /path/to/other/folder have lower priority
export PATH=$PATH:/path/to/folder
...other stuff below...
डेटा साइंस और PATH environment variable
अब, यह डेटा वैज्ञानिकों के लिए प्रासंगिक क्यों है? अगर आप डेटा वैज्ञानिक हैं, तो बहुत मुमकिन है कि आप Python का इस्तेमाल करते हों, और आपका Python इंटरप्रेटर Anaconda Python डिस्ट्रीब्यूशन से आता हो (यह वाकई शानदार है, इसे आज़माएँ!). Anaconda Python इंस्टॉलर PATH environment variable में /path/to/anaconda/bin फ़ोल्डर को प्राथमिकता देता है। आपके सिस्टम पर दूसरे Python इंटरप्रेटर भी हो सकते हैं (जैसे Apple अपना देता है)। लेकिन यह PATH बदलाव सुनिश्चित करता है कि जब भी आप Bash टर्मिनल में python टाइप करें, तो Anaconda Python डिस्ट्रीब्यूशन वाला इंटरप्रेटर ही चले। मेरे मामले में, Anaconda इंस्टॉल करने के बाद मेरा PATH कुछ ऐसा दिखता है:
$ echo $PATH
/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin
और भी अच्छा यह है कि conda environments, environment के सक्रिय रहने के दौरान, conda environment के binaries फ़ोल्डर का पाथ PATH में सबसे आगे जोड़ देते हैं। उदाहरण के लिए, अपने ब्लॉग के लिए मैं lektor नाम का environment इस्तेमाल करता हूँ। तो...
$ echo $PATH
/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin
$ which python
/Users/ericmjl/anaconda/bin/python
$ source activate lektor
$ echo $PATH
/Users/ericmjl/anaconda/envs/lektor/bin:/Users/ericmjl/anaconda/bin:/usr/bin:/bin:/usr/local/bin
$ which python
/Users/ericmjl/anaconda/envs/lektor/bin/python
ध्यान दें कि अब bash टर्मिनल उच्च-प्राथमिकता वाले lektor environment के अंदर वाले Python को प्राथमिकता दे रहा है।
अगर आप यहाँ तक पहुँच गए हैं, तो उम्मीद है कि आपने कुछ अहम अवधारणाएँ समझ ली होंगी। आइए उनका संक्षेप में पुनरावलोकन करें:
PATHएक environment variable है जो सादा टेक्स्ट स्ट्रिंग के रूप में संग्रहीत होता है और bash इंटरप्रेटर executable प्रोग्राम कहाँ खोजे, यह समझने के लिए इसका उपयोग करता है।PATHकोलन-डिलिमिटेड होता है; उच्च प्राथमिकता वाली डायरेक्टरियाँ स्ट्रिंग के बाएँ होती हैं, जबकि निम्न प्राथमिकता वाली डायरेक्टरियाँ दाएँ।PATHमें डायरेक्टरियाँ प्रि-पेंड या एपेंड करके बदलाव किया जा सकता है। यह काम अस्थायी रूप से bash सत्र के भीतर कमांड प्रॉम्प्ट परexportकमांड चलाकर किया जा सकता है, या स्थायी रूप से कई bash सत्रों में लागू करने के लिए अपनी.bashrcया.bash_profileमेंexportलाइन जोड़कर किया जा सकता है।
अन्य उपयोगी Environment Variables
और कौन-से environment variables किसी डेटा वैज्ञानिक के काम आ सकते हैं? यहाँ कुछ उदाहरण हैं जो आपको दिख सकते हैं और जिन्हें आपको ठीक करना पड़ सकता है, खासकर तब जब आपके सिस्टम एडमिन छुट्टी पर हों (या जवाब देने में देर कर रहे हों)।
सामान्य उपयोग के लिए, आपको अपना HOME फ़ोल्डर जानना ज़रूरी होगा — Linux सिस्टम पर यह अक्सर /home/username होता है, जबकि macOS पर अक्सर /Users/username। आप HOME क्या है, यह ऐसे जान सकते हैं:
$ echo $HOME
/Users/ericmjl
अगर आप Python उपयोगकर्ता हैं, तो PYTHONPATH एक ऐसा वेरिएबल है जो उपयोगी हो सकता है। Python इंटरप्रेटर इसका उपयोग यह जानने के लिए करता है कि Python modules/packages कहाँ ढूँढने हैं।
अगर आपको C++ लाइब्रेरीज़ से काम करना है, तो LD_LIBRARY_PATH environment variable जानना बहुत महत्वपूर्ण है। मैं इसमें इतना पारंगत नहीं हूँ कि इस पर विस्तार से और समझदारी से बोल सकूँ, इसलिए इस वेबसाइट को सर्वोत्तम प्रथाओं के लिए देखने की सलाह दूँगा कि LD_LIBRARY_PATH का उपयोग कैसे करें।
अगर आप Spark के साथ काम कर रहे हैं, तो PYSPARK_PYTHON environment variable दिलचस्प होगा। यह मूलतः Spark को बताता है कि अपने ड्राइवर और वर्कर्स के लिए कौन-सा Python इस्तेमाल करना है; आप ज़रूरत पड़ने पर PYSPARK_DRIVER_PYTHON को PYSPARK_PYTHON से अलग भी सेट कर सकते हैं।
अपनी Environment Variables को हैक करें
यही वह जगह है जहाँ सबसे ज़्यादा मज़ा आता है! नीचे कुछ काम हैं जो आप अपनी environment variables को हैक करके कर सकते हैं।
हैक #1: PyPy तक पहुँच सक्षम करें। मैं कभी-कभी PyPy के विकास पर नज़र रखता हूँ, पर क्योंकि PyPy अभी डिफ़ॉल्ट Python इंटरप्रेटर नहीं है, और अभी conda install से उपलब्ध नहीं है, मुझे इसे अपने $HOME/pypy/bin डायरेक्टरी में रखना पड़ता है। PyPy इंटरप्रेटर तक पहुँच सक्षम करने के लिए, मुझे यह सुनिश्चित करना होता है कि मेरा /path/to/pypy PATH environment variable में मौजूद हो, लेकिन मेरे सामान्य CPython इंटरप्रेटर से कम प्राथमिकता पर।
हैक #2: अन्य भाषाओं के इंटरप्रेटर/कंपाइलर्स तक पहुँच सक्षम करें। यह PyPy के समान है। मैंने एक बार Torch के साथ डीप लर्निंग करने के लिए Lua के JIT इंटरप्रेटर को आज़माया था, और मुझे उसका पाथ अपनी .bashrc में जोड़ना पड़ा।
हैक #3: Python पैकेज अपने होम डायरेक्टरी में इंस्टॉल करें। साझा Linux कंप्यूट सिस्टम पर जो conda environments की बजाय modules सिस्टम का उपयोग करते हैं, वहाँ जो modulefile आप लोड करते हैं, वह किसी ऐसे वर्चुअल environment के साथ कॉन्फ़िगर हो सकता है जिसे आप बदलने की अनुमति नहीं रखते। अगर आपको कोई Python पैकेज इंस्टॉल करना है, तो आप pip install --user my_pkg_name कर सकते हैं। यह पैकेज को $HOME/.local/lib/python-[version]/site-packages/ में इंस्टॉल करेगा। इस स्थिति में यह सुनिश्चित करना महत्वपूर्ण होगा कि आपका PYTHONPATH में $HOME/.local/lib/python-[version]/site-packages पर्याप्त उच्च प्राथमिकता पर शामिल हो।
हैक 4: समस्या आने पर डीबगिंग। अगर कुछ एरर फेंके, या अप्रत्याशित बर्ताव हो — जैसा कि मैंने झेला था जब अपने सभी Linux मॉड्यूल्स लोड करने के बाद मेरा Python इंटरप्रेटर सही तरह नहीं मिल रहा था — तो डीबग करने का एक तरीका यह है कि अस्थायी रूप से अपने PATH environment variable को किसी समझदारी भरे "डिफ़ॉल्ट" पर सेट कर दें और उसे सोर्स करें, यानी प्रभावी रूप से अपने PATH को "रीसेट" करें, ताकि आप डीबगिंग के दौरान मैन्युअली प्रि-पेंड/एपेंड कर सकें।
ऐसा करने के लिए, अपने होम डायरेक्टरी में .path_default नाम की फ़ाइल में निम्न पंक्तियाँ रखें:
export PATH="" # resets PATH to an empty string.
export PATH=/usr/bin:/bin:/usr/local/bin:$PATH # this is a sensible default; customize as needed.
कुछ गड़बड़ होने के बाद, आप "source" कमांड का उपयोग करके अपना PATH environment variable रीसेट कर सकते हैं:
$ echo $PATH
/some/complicated/path:/more/complicated/paths:/really/complicated/paths
$ source ~/.path_default
$ echo $PATH
/usr/bin:/bin:/usr/local/bin
ध्यान दें - आप यही कमांड्स सीधे अपने bash सत्र में भी चला सकते हैं; इंटरैक्टिविटी भी सहायक हो सकती है।
निष्कर्ष
आशा है यह लेख आपको अच्छा लगा होगा, और जब भी आप इन environment variables से टकराएँगे, तो यह आपको, उhm, आगे बढ़ने का रास्ता दिखाएगा!