मैं अपनी निर्देशिका में cd-ing के बिना कमांड लाइन में पायथन स्क्रिप्ट का उपयोग कैसे कर सकता हूं? क्या यह PYTHONPATH है?


157

मैं PYTHONPATH का कोई भी उपयोग कैसे कर सकता हूं? जब मैं स्क्रिप्ट को पथ में चलाने का प्रयास करता हूं तो फ़ाइल नहीं मिलती है। जब मैं स्क्रिप्ट को पकड़कर निर्देशिका चलाता हूं तो स्क्रिप्ट चलती है। तो PYTHONPATH क्या अच्छा है?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

सीडी के बाद फ़ाइल निर्देशिका यह चलाता है ..

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

मैं PYTHONPATH का कोई उपयोग क्यों नहीं कर सकता हूं?


1
क्या हम इस पद का शीर्षक बदल सकते हैं? यह वास्तव में इसका स्पष्टीकरण नहीं मांग रहा है PYTHONPATH
निको सर्निके

संपादित शीर्षक क्योंकि यह पहली चीज़ है जो PYTHONPATH
गुगली

जवाबों:


194

मुझे लगता है कि आप थोड़ा भ्रमित हैं। PYTHONPATH अजगर मॉड्यूल आयात करने के लिए खोज पथ सेट करता है , उन्हें क्रियान्वित करने के लिए नहीं जैसे आप कोशिश कर रहे हैं।

PYTHONPATH मॉड्यूल फ़ाइलों के लिए डिफ़ॉल्ट खोज पथ को संवर्धित करता है। प्रारूप शेल के पथ के समान है: os.pathsep (जैसे यूनिक्स पर कॉलन या विंडोज पर अर्धविराम) द्वारा अलग किए गए एक या अधिक निर्देशिका पथनाम। गैर-मौजूद निर्देशिका को चुपचाप अनदेखा कर दिया जाता है।

सामान्य निर्देशिकाओं के अलावा, व्यक्तिगत PYTHONPATH प्रविष्टियां शुद्ध पायथन मॉड्यूल (दोनों स्रोत या संकलित रूप में) युक्त zipfiles को संदर्भित कर सकती हैं। एक्सटेंशन मॉड्यूल को zipfiles से आयात नहीं किया जा सकता है।

डिफ़ॉल्ट खोज पथ स्थापना निर्भर है, लेकिन आम तौर पर उपसर्ग / lib / pythonversion (PYTHONHOME देखें) से शुरू होता है। इसे हमेशा PYTHONPATH से जोड़ा जाता है।

इंटरफ़ेस विकल्पों के तहत ऊपर वर्णित अनुसार PYTHONPATH के सामने एक खोज पथ में एक अतिरिक्त निर्देशिका डाली जाएगी। खोज पथ को चर sys.path के रूप में पायथन प्रोग्राम के भीतर से हेरफेर किया जा सकता है।

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

क्या आप देख रहे हैं पेट है।

export PATH=$PATH:/home/randy/lib/python 

हालांकि, एक कार्यक्रम के रूप में अपनी अजगर स्क्रिप्ट को चलाने के लिए, आपको एक शबंग भी सेट करना होगा पहली पंक्ति में पायथन के लिए । कुछ इस तरह काम करना चाहिए:

#!/usr/bin/env python

और इसके लिए निष्पादन विशेषाधिकार दें:

chmod +x /home/randy/lib/python/gbmx.py

तब आपको gmbx.pyकहीं से भी बस चलाने में सक्षम होना चाहिए ।


2
धन्यवाद दोस्त। मैं अभी भी इसे बाहर इस्त्री कर रहा हूं। मेरी स्क्रिप्ट मेरे कस्टम PYTHONPATH से मेरे मॉड्यूल आयात करने में सफल होती है। और अब मैं अंतर को समझता हूं: यह स्क्रिप्ट बनाम मॉड्यूल के बारे में है; कमांड स्क्रिप्ट कॉल बनाम अजगर आयात। हां, मैं वास्तव में उपयोग export PATH=$PATH:/home/etc
करूंगा

57

आप PATH और PYTHONPATH को भ्रमित कर रहे हैं। आपको यह करने की आवश्यकता है:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH को किस मॉड्यूल को लोड करना है यह निर्धारित करने के लिए अजगर इंटरप्रेटर द्वारा उपयोग किया जाता है।

PATH का उपयोग शेल द्वारा किया जाता है ताकि यह निर्धारित किया जा सके कि कौन से निष्पादनयोग्य चलने हैं।


38

PYTHONPATHकेवल importबयानों को प्रभावित करता है, न कि शीर्ष स्तर के पायथन दुभाषिए को तर्कों के रूप में दी गई अजगर फाइलों की खोज।

PYTHONPATHसेट होने की आवश्यकता एक महान विचार नहीं है - जैसा कि पर्यावरण चर पर निर्भर कुछ के साथ, अलग-अलग मशीनों में लगातार चीजों की नकल करना मुश्किल हो जाता है। बेहतर है कि अजगर 'पैकेज' का उपयोग करें जिसे सिस्टम-निर्भर पथों में स्थापित किया जा सकता है ('पाइप', या डिस्टुटिल्स का उपयोग करके) जिसके बारे में पायथन पहले से जानता है।

Https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 'द हिचहाइकर गाइड टू पैकेजिंग' और साथ ही http://docs.python.org/3/-tutorial पर भी पढ़ें /modules.html - जो PYTHONPATH और संकुल को निचले स्तर पर समझाता है।


मुद्दा लेना। इस विशेष मामले में PYTHONPATH को जोड़ने पर अच्छी तरह से काम करने लगता है। एक मशीन पर एक उपयोगकर्ता के रूप में मैं अच्छी तरह से उपयोग कर सकता हूं और कुछ पहले से ही लिखित .py कोड का पुन: उपयोग कर सकता हूं।
रैंडी स्क्रेका

1
मैं ईमानदारी से सिस्टम आश्रित रास्तों में चीजों को स्थापित करने के बारे में नहीं सोचता, रूट एक्सेस की आवश्यकता के साथ, उपयोग करने से बेहतर विचार है PYTHONPATH। मैं किसी भी अधिक गणना नहीं करता हूं कि मुझे कितनी बार एक अल्पविकसित पायथन कार्यक्रम से निपटना पड़ा है, जो उस pip installचीज पर जोर देता है जहां मैं मेजबान पर एक नियमित उपयोगकर्ता था न केवल रूट एक्सेस के बिना (मुझे पता है कि पाइप स्थानीय स्थापना कर सकता है) लेकिन बिना पाइप के भी। यहां पायथन सॉफ़्टवेयर वितरित करने वाले सभी को एक सलाह दी गई है - वेनिला लिनक्स होस्ट पर अपना स्वयं का सॉफ़्टवेयर स्थापित करने का प्रयास करें, जहाँ आपके पास रूट एक्सेस नहीं है और केवल पाइप के बिना कोर पायथन वितरण है।
एमएन

3

मुझे लगता है कि आप PATH और PYTHONPATH के बीच घुलमिल गए हैं। एक 'स्क्रिप्ट' को चलाने के लिए आपको बस इतना करना होगा कि यह पैतृक निर्देशिका आपके पैथ वेरिएबल से जुड़ी हो। आप इसे चलाकर परीक्षण कर सकते हैं

which myscript.py

इसके अलावा, अगर myscripy.pyकस्टम मॉड्यूल पर निर्भर करता है , तो उनके पैतृक निर्देशिका को PYTHONPATH चर में भी जोड़ा जाना चाहिए। दुर्भाग्य से, क्योंकि अजगर के डिजाइनर दवाओं पर स्पष्ट रूप से थे, निम्नलिखित के साथ उत्तर में अपने आयात का परीक्षण करने की गारंटी नहीं होगी कि आपका PYTHONPATH स्क्रिप्ट में उपयोग के लिए ठीक से सेट है। अजगर प्रोग्रामिंग का यह हिस्सा जादू है और स्टैकओवरफ्लो पर उचित जवाब नहीं दिया जा सकता है।

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule

3

अपने उदाहरण में PYTHONPATH सेट के साथ, आपको ऐसा करने में सक्षम होना चाहिए

python -m gmbx

-mविकल्प पायथन को आपके मॉड्यूल के लिए पथों में खोज देगा पायथन आमतौर पर उन मॉड्यूलों को खोजता है, जिनमें आपने PYTHONATATH में जोड़ा है। जब आप दुभाषिया चलाते हैं python gmbx.py, तो यह विशेष फ़ाइल के लिए दिखता है और PYTHONPATH लागू नहीं होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.