PYTHONPATH में स्थायी रूप से एक निर्देशिका जोड़ें?


324

जब भी मैं उपयोग करता हूं sys.path.append, नई निर्देशिका जोड़ी जाएगी। हालाँकि, एक बार जब मैं अजगर को बंद कर दूंगा, तो सूची पिछले (डिफ़ॉल्ट) मानों पर वापस आ जाएगी। मैं स्थायी रूप से एक निर्देशिका कैसे जोड़ूं PYTHONPATH?

जवाबों:


135

आपको अपनी नई निर्देशिका को पर्यावरण चर में जोड़ने की जरूरत है PYTHONPATH, जो कि पिछली सामग्री से अलग है। यूनिक्स के किसी भी रूप में, आप एक स्टार्टअप स्क्रिप्ट में कर सकते हैं जो आपके द्वारा उपयोग किए जा रहे शेल ( .profileया जो कुछ भी, अपने पसंदीदा शेल के आधार पर) को एक कमांड के साथ उपयुक्त है, जो फिर से, प्रश्न में शेल पर निर्भर करता है; विंडोज में, आप इसे सिस्टम GUI के माध्यम से कर सकते हैं।

superuser.com अधिक जानकारी के लिए एक बेहतर स्थान हो सकता है, अर्थात अधिक विवरण के लिए यदि आपको अपने चुने हुए मंच और शेल में पर्यावरण चर को समृद्ध करने की आवश्यकता है, क्योंकि यह वास्तव में प्रति प्रोग्रामिंग प्रोग्रामिंग नहीं है।


8
इरेटा: खिड़कियों पर विभाजक एक अर्धविराम होगा। यदि आपको विंडोज़ पर सिस्टम पथ को ओवरराइड करने की आवश्यकता है, तो GUI के माध्यम से एक उपयोगकर्ता पर्यावरण चर के रूप में सेटिंग पर्याप्त नहीं हो सकती है, क्योंकि उपयोगकर्ता चर सिस्टम चर में संलग्न हैं। इन मामलों में, आपको एक स्टार्टअप स्क्रिप्ट का सहारा लेना होगा जो आवश्यक समायोजन करता है।
नाथन अर्न्स्ट

1
@Nathan, अर्धविराम पर अनुस्मारक के लिए tx, लेकिन आप (यदि आप निश्चित रूप से एक व्यवस्थापक हैं) कर सकते हैं सेट प्रणाली खिड़कियों पर env.vars (प्लस, ओपी कैसे पूछ नहीं है ओवरराइड पथ, करने के लिए कितना संलग्न इसे करने के लिए , इसलिए, एक उपयोगकर्ता env.var भी उसके लिए ठीक होगा! -)।
एलेक्स मार्टेली

दुर्भाग्य से मैं अपने कार्य पीसी पर व्यवस्थापक नहीं हूं, इसलिए मुझे ऐसे उपायों का सहारा लेना होगा। :(
नाथन अर्नस्ट

438

यदि आप bash (Mac या GNU / Linux डिस्ट्रो पर) का उपयोग कर रहे हैं, तो इसे अपने में जोड़ें ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"

28
यह मेरे लिए पूरी तरह से काम करता है, लेकिन सुनिश्चित करें कि जिस निर्देशिका को आप इंगित करते हैं वह आपकी निर्देशिका संरचना में सबसे ऊपरी init .py फ़ाइल पर है। यह पहली बार में मेरे लिए पूरी तरह से स्पष्ट नहीं था। उदाहरण के लिए, मैंने PYTHONPATH = $ PYTHONPATH: / Users / joey / repos को निर्यात करने की कोशिश की, लेकिन यह काम नहीं किया क्योंकि मेरी repos निर्देशिका में _ init_ .py नहीं था । एक निर्देशिका को और नीचे जाने के बाद: / उपयोगकर्ता / जॉय / रेपो / स्पेसिफेरो ने चाल चली। अब अजगर एक विशिष्ट। निर्देशिका से जुड़े किसी भी डाउनवर्ड निर्देशिका को पार कर सकता है जिसमें एक init .py होता है!
Qiao Yi

3
यह मेरे लिए काम करता है लेकिन क्या आप बता सकते हैं कि यह PYTHONPATH चर कहाँ स्थित है? और "सटीक PYTHONPATH" को कैसे पता चलता है कि सटीक फ़ाइल का पता लगाएं?
AppleLover

42
याद करने के बाद जब आप संपादित करते हैं ~/.bashrcतो source ~/.bashrcदेखते हैं stackoverflow.com/questions/2518127/…
b_dev

1
मुझे लगता है कि sudo suआपकी .bashrc फ़ाइल की शुरुआत में यह एक बुरा विचार है । यह पोस्ट मेरे साथ सहमत है। मेरे सिस्टम पर, कम से कम, यह आवश्यक भी नहीं है।
लंदनरॉब

यह उत्तर है।
एरिन

88

जोड़ तोड़ के बजाय PYTHONPATHआप एक पथ विन्यास फाइल भी बना सकते हैं । सबसे पहले पता करें कि पायथन किस निर्देशिका में इस जानकारी को खोजता है:

python -m site --user-site

किसी कारण से यह पायथन 2.7 में काम नहीं करता है। वहाँ आप उपयोग कर सकते हैं:

python -c 'import site; site._script()' --user-site

फिर .pthउस निर्देशिका में एक फ़ाइल बनाएं जिसमें वह पथ जोड़ना चाहते हैं (यदि वह मौजूद नहीं है तो निर्देशिका बनाएं)।

उदाहरण के लिए:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"

मैंने इसे पायथन 2.6 का उपयोग करने की कोशिश की है और यह मेरे लिए काम नहीं करता है
लोरकन ओ'नील

4
मैंने इस निर्देशिका को अपनी खुद की लाइब्रेरी डायरेक्टरी में सहानुभूति दी और अपनी सभी लिपियों को वहां संग्रहीत किया। ठीक काम किया।
फेयरसोफमे

इस विषय को फिर से खोजने के बाद इसे फिर से प्रयास करने का संकल्प लिया और इस बार के रूप में ऊपर काम करने में कामयाब रहा! अपवित्र और विपरीत क्षमायाचना :)
लोरेन ओ'नील

यह काम करता है बस पूरी तरह से, मैं सही रास्ते पर था, लेकिन python -m site --user-siteऔर (create the directory if it doesn't exist)भागों के लिए कि मैं क्या याद आ रही थी यह काम कर रहा हो रहे थे।
औरेलियन ओम्स

1
क्या मुझे एक अतिरिक्त कदम उठाने की ज़रूरत है ताकि अजगर जोड़े गए मार्ग को पहचान सके somelib.pth? यदि नहीं, तो कोई भी अनुमान लगाता है कि यह काम क्यों नहीं कर रहा है?
मिलादियस

38

यह विंडोज पर काम करता है

  1. विंडोज पर, पायथन 2.7 के साथ पायथन सेटअप फ़ोल्डर में जाएं।
  2. Lib / साइट-संकुल खोलें।
  3. इस फ़ोल्डर में एक example.pth खाली फ़ाइल जोड़ें।
  4. फ़ाइल के लिए आवश्यक पथ जोड़ें, प्रत्येक पंक्ति में से एक।

तब आप अपनी स्क्रिप्ट से उन रास्तों के भीतर सभी मॉड्यूल देख पाएंगे।


3
IMO, यह सबसे अच्छा समाधान है, क्योंकि यह शेल या काम के माहौल की पसंद पर निर्भर नहीं करता है। लाइनक्स पर भी काम करता है, जहां डिफ़ॉल्ट पायथन पथ "/usr/local/lib/pythonX.Y/site-packages" है। अगर वह काम नहीं करता है, तो अपने .pth फ़ाइल को डिस्ट-पैकेज डायरेक्टरी में डालने की कोशिश करें।
माटस

1
विंडोज 7, पायथन 3.6.5। यह उत्तर है। जैसा कि auserdude ने लिखा है: Python के Lib / साइट-संकुल फ़ोल्डर में "example.pth" बनाएं और फिर अपना पथ इस तरह जोड़ें: C: \ somefolder \ otherfolder \ targetfolder
JayJay123

उत्कृष्ट उत्तर, विंडोज़ 10 पर अजगर 3.7 के साथ भी काम करता है, मेरी विंडोज़ 10 पथ है: "C: \ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib"
अली 80

यह पुष्टि कर सकता है कि यह विंडोज 10. पर पायथन 3.6.7 के लिए काम करता है। हालांकि, ध्यान दें कि पथ को आपके PYTHONPATH के साथ जोड़ा गया है, इसका मतलब है कि आपका जोड़ा गया मॉड्यूल नाम टकराव के मामले में नहीं मिलेगा।
BramAppel

24

मामले में कोई भी अभी भी भ्रमित है - यदि आप एक मैक पर हैं, तो निम्न कार्य करें:

  1. टर्मिनल खोलें
  2. प्रकार open .bash_profile
  3. पॉप होने वाली टेक्स्ट फ़ाइल में, इस पंक्ति को अंत में जोड़ें: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. फ़ाइल सहेजें, टर्मिनल को पुनरारंभ करें, और आप कर रहे हैं

1
कोई भी सोच रहा है कि अजगर का रास्ता कैसे देखें, उपयोग करें: कौन सा अजगर
अरिंदम रॉयचौधरी

बहुत यकीन है कि आपको टर्मिनल फिर से लोड करने की आवश्यकता है
उपयोगकर्ता

वास्तव में exportकुंजी वह चीज थी जो मुझे याद आ रही थी !!!!, उत्कीर्ण, धन्यवाद बहुत!
a_m_dev

21

आप अपने pythonrc फ़ाइल के माध्यम से पथ जोड़ सकते हैं, जो linux पर ~ / .pythonrc के लिए डिफॉल्ट करता है। अर्थात।

import sys
sys.path.append('/path/to/dir')

आप PYTHONPATHएक वैश्विक आरसी फ़ाइल में, जैसे ~/.profileकि मैक या लिनक्स पर, या नियंत्रण कक्ष -> सिस्टम -> उन्नत टैब -> पर्यावरण चर पर खिड़कियों में पर्यावरण चर सेट कर सकते हैं।


40
sys.path.append ('/ path / to / dir') स्थायी रूप से प्रविष्टि नहीं जोड़ता है।
jeremyjjbrown

15

थोड़ा और स्पष्टीकरण देने के लिए, पायथॉन स्क्रिप्ट (आमतौर पर sys.prefix + और साथ ही स्थित ) का उपयोग करके स्वचालित रूप से अपने खोज पथ (जैसा कि ऊपर और यहां बताया गया है ) का निर्माण करेगा । कोई sys.prefix का मान प्राप्त कर सकता है:site.pylib/python<version>/site-packageslib/site-python

python -c 'import sys; print(sys.prefix)'

Site.py स्क्रिप्ट तो जैसे निर्देशिका, मंच पर निर्भर, के एक नंबर कहते हैं /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packagesखोज पथ के लिए है और यह भी के लिए इन रास्तों खोज <package>.pthफ़ाइलें जो विशिष्ट अतिरिक्त खोज पथ शामिल config। उदाहरण के लिए आसान-स्थापित अपने स्थापित पैकेजों के संग्रह को बनाए रखता है जो उबंटू में सिस्टम विशिष्ट फ़ाइल में जोड़े जाते हैं /usr/local/lib/python2.7/dist-packages/easy-install.pth। एक विशिष्ट प्रणाली पर इन .pth फ़ाइलों का एक गुच्छा होता है, जिसके चारों ओर sys.path में कुछ अनपेक्षित रास्तों की व्याख्या की जा सकती है:

python -c 'import sys; print(sys.path)'

तो एक .pth फ़ाइल बना सकते हैं और इनमें से किसी भी निर्देशिका में डाल सकते हैं ( ऊपर बताए गए अनुसार सिदिर सहित )। ऐसा लगता है कि PYTHONPATH का उपयोग करने के विपरीत अधिकांश पैकेज sys.path में जुड़ जाते हैं।

नोट: OSX पर 'फ्रेमवर्क बिल्ड्स' (लेकिन अजगर के सामान्य कमांड लाइन के उपयोग के लिए काम करने के लिए लगता है) के लिए site.py द्वारा जोड़ा गया एक विशेष अतिरिक्त खोज पथ है: /Library/Python/<version>/site-packages(उदाहरण के लिए Python2.7:) /Library/Python/2.7/site-packages/जो कि 3 पार्टी पैकेज माना जाता है स्थापित किया जाना है (उस dir में README को देखें)। तो कोई अतिरिक्त खोज पथ वाले पथ कॉन्फ़िगरेशन फ़ाइल को जोड़ सकता है जैसे कि एक फ़ाइल बनाएँ /Library/Python/2.7/site-packages/pip-usr-local.pthजिसमें समाहित हो /usr/local/lib/python2.7/site-packages/और फिर सिस्टम अजगर उस खोज पथ को जोड़ देगा।


10

मेरे लिए यह काम किया जब मैंने .bash_profileफ़ाइल को बदल दिया । .bashrcकेवल फ़ाइल बदलने तक मैंने शेल को पुनरारंभ करने तक ही काम किया।

अजगर 2.7 के लिए यह इस तरह दिखना चाहिए:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

.bash_profileफ़ाइल के अंत में ।


1
अगर मैं सही ढंग से समझ पाऊं तो यह टर्मिनल के माध्यम से लॉन्च किए गए पायथन सत्रों के लिए वेरिएबल को केवल सही निर्यात करेगा?
jxramos

1
@jxramos - हाँ!
पीटर पाइपर

9

लिनक्स पर आप पर्यावरण चर से निपटने के लिए बिना अपने पैकेज से PYTHONPATH की निर्देशिका के लिए एक प्रतीकात्मक लिंक बना सकते हैं। कुछ इस तरह:

ln -s /your/path /usr/lib/pymodules/python2.7/

7

export PYTHONPATH="${PYTHONPATH}:/my/other/path"अगर PYTHONPATHवर्तमान में मौजूद नहीं है (तो :) के कारण ~ / .bashrc में जोड़ना संभव नहीं है ।

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

ऊपर मेरे ~ / .bashrc में जोड़ने ने मेरे लिए Ubuntu 16.04 पर चाल चली


मैंने किया echo PYTHONPATHऔर कुछ नहीं दिखाया! इसका मतलब यह है कि इस PYTHONPATH को गलत नहीं किया गया है, इसलिए मैं सिर्फ इस लाइन export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectionको अपनी ~/.bashrcफाइल में पेस्ट करता हूं source ~/.bashrc । बाद में, जब मैंने `इको $ PYTHONPATH` किया तो इसने मुझे दिया :<PATH_TO_TF>/TensorFlow/models/research/object_detection, यदि मैंने कुछ गलत किया है तो कोई सुझाव?
अनु

export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, जब आप पहली बार PYTHONPATH को निर्यात कर रहे हैं, तो आपको इसे बिना ${PYTHONPATH}:भाग के करना होगा
boyangeor

धन्यवाद, लेकिन जब भी मैं अपने कंप्यूटर को रिबूट करता हूं तो अजगर पथ को उसी पर रीसेट कर रहा होता है जिसे मैंने 1 सेट किया है :<PATH_TO_TF>/TensorFlow/models/research/object_detectionऔर 2 को हटा दिया है export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim। उस पर कोई सुझाव, इसे कैसे ठीक करें?
अनु ०

7

MacOS पर, एक विशिष्ट पुस्तकालय को रास्ता देने के बजाय। में रूट प्रोजेक्ट फ़ोल्डर के लिए पूर्ण पथ दे रहा है

~/.bash_profile 

मेरा दिन बनाया, उदाहरण के लिए:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

इसके बाद करें:

source ~/.bash_profile

6

बस awesomo के उत्तर को जोड़ने के लिए, आप उस लाइन को अपने ~/.bash_profileया में भी जोड़ सकते हैं~/.profile


.bash_profileयदि आप लॉगिन शेल का उपयोग करते हैं, तो इसमें जोड़ें , अन्यथा उपयोग करें.profile
smac89

3

PYTHONPATH में एक नया पथ जोड़कर मैन्युअल रूप से कर रहा है:

टर्मिनल द्वारा अपने ~ / .bashrc प्रोफ़ाइल में पथ जोड़कर:

vim ~/.bashrc

अपनी प्रोफ़ाइल में निम्नलिखित पेस्ट करें

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

तब, जब आप कभी भी टर्मिनल में अपना कोड चलाते हैं, तो अपने bashrc प्रोफ़ाइल को स्रोत बनाना सुनिश्चित करें:

source ~/.bashrc 

उम्मीद है की यह मदद करेगा।


2

मैंने स्थायी रूप से विंडोज विस्टा, पायथन 3.5 में जोड़ा

सिस्टम> नियंत्रण कक्ष> उन्नत प्रणाली सेटिंग्स> उन्नत (टैप) पर्यावरण चर> सिस्टम चर> (यदि आप चर कॉलम में PYTHONPATH नहीं देखते हैं) (क्लिक करें) नया> चर नाम: PYTHONPATH: परिवर्तनीय मूल्य:

कृपया, परिवर्तनीय मान में निर्देशिका लिखें। यह ब्लू पेपर के उत्तर का विवरण है।


1

नीचे दी गई स्क्रिप्ट सभी प्लेटफार्मों पर काम करती है क्योंकि यह शुद्ध पायथन है। यह पथ-संबंधी पथ का उपयोग करता है, यहाँ प्रलेखित https://docs.python.org/3/library/pathlib.html , इसे कार्य-मंच बनाने के लिए। आप इसे एक बार चलाते हैं, कर्नेल को पुनरारंभ करें और यह वह है। Https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574 से प्रेरित होकर ।

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))

1

यह इस थ्रेड के लिए एक अद्यतन है जिसके कुछ पुराने उत्तर हैं।

मैक-ओएस कैटालिना या कुछ नए (> = 10.15) का उपयोग करने वालों के लिए, इसे एक नया टर्मिनल नाम दिया गया था zsh(पुराने का विकल्प bash)।

मुझे इस बदलाव के कारण ऊपर दिए गए जवाबों से कुछ समस्याएँ थीं, और मैंने कुछ हद तक फ़ाइल बनाने ~/.zshrcऔर फ़ाइल निर्देशिका को फ़ाइल में चिपकाकर $PATHऔर$PYTHONPATH

तो, पहले मैंने किया:

nano ~/.zshrc

जब संपादक ने खोला तो मैंने निम्नलिखित सामग्री चिपकाई:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

इसे सहेजा, और टर्मिनल को पुनरारंभ किया।

महत्वपूर्ण: ऊपर का रास्ता मेरे कंप्यूटर के पथ पर सेट है, आपको इसे अपने अजगर के अनुकूल बनाना होगा।


0

अजगर 3.6.4 में आप इस तरह अजगर सत्र भर में sys.path जारी रख सकते हैं:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

मैं दृढ़ता से सुझाव देता हूं कि आप virtualenv और virtualenvwrapper का उपयोग करें अन्यथा आप अपने रास्ते को अव्यवस्थित करेंगे


-3

ए <-> बी के बीच सबसे छोटा रास्ता एक सीधी रेखा है;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.