2009-06-25 17 views
28

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

उदाहरण के लिए, मैं

python agent.py 

कहेंगे और agent.py आयात की एक संख्या है, जिनमें शामिल हैं:

import checks 

जहां चेकों agent.py रूप में एक ही निर्देशिका में एक फ़ाइल में है

agent/agent.py 
agent/checks.py 

जब वर्तमान कार्यशील निर्देशिका एजेंट है/तो सबकुछ ठीक है। हालांकि, अगर मैं किसी अन्य निर्देशिका से agent.py को कॉल करता हूं, तो यह स्पष्ट रूप से checks.py आयात करने में असमर्थ है और इसलिए त्रुटियां।

मैं कैसे सुनिश्चित कर सकता हूं कि कस्टम मॉड्यूल आयात किए जा सकते हैं चाहे एजेंट से कहां से कहा जाता है उदा।

python /home/bob/scripts/agent/agent.py 
+0

और परिणाम क्या था? क्या आप एमएनएन जवाब स्वीकार करने की योजना बना रहे हैं? –

+0

कोड का प्रयास करने के बाद मैं एक जवाब स्वीकार करूंगा, जो मैं कुछ हफ्तों तक नहीं करूँगा। मुझे कोई विशेष भीड़ नहीं दिख रही है। – DavidM

+0

क्या कोड का प्रयास किया? जैसा कि मैंने एक उदाहरण के साथ इंगित करने का प्रयास किया है, और जैसा कि एक या दो अन्य लोगों ने भी उल्लेख किया है, जो आपने कहा है, वह सिर्फ काम करना चाहिए और केवल काम करने के लिए दस्तावेज किया जाना चाहिए। "कोड का प्रयास करने" के बजाय, हमें बताएं [जैसा कि मैंने सुझाव दिया है] प्राथमिक जानकारी जो आपके प्रश्न (प्लेटफ़ॉर्म, पायथन संस्करण, पूर्ण ट्रेसबैक और त्रुटि संदेश) के साथ शामिल की जानी चाहिए और साथ ही मैंने प्राथमिक डीबगिंग भी सुझाई है ... आपके समय के कुछ मिनट; आपको जवाब देने के लिए छह लोग "पहुंचे"। –

उत्तर

26

वास्तव में अपने उदाहरण से काम करता है क्योंकि checks.py agent.py रूप में एक ही निर्देशिका में है, लेकिन कहते हैं कि checks.py पूर्ववर्ती निर्देशिका, जैसे में था; __file__ के उपयोग

path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 
if not path in sys.path: 
    sys.path.insert(1, path) 
del path 

नोट:

agent/agent.py 
checks.py 

तो आप निम्न कर सकता है।

+0

डेल पथ के बारे में नोट करने के लिए क्या है? वह खास क्यों है? –

+0

@CharlieParker जो 'पथ' चर को साफ़ करने के लिए जगह पर है। यदि आप इसे चारों ओर लटकना छोड़ना चाहते हैं, तो यह ठीक है। –

+2

+1 लेकिन मेरे जैसे अजगर के नए शौक के लिए, 'आयात ओएस, sys' (उद्धरण के बिना) जोड़ने के लिए मत भूलना, तो यह ठीक चल जाएगा :) – icasimpan

6

आपको वर्तमान में निष्पादन मॉड्यूल को sys.path चर में पथ जोड़ने की आवश्यकता है। चूंकि आपने इसे कमांड लाइन पर बुलाया है, इसलिए स्क्रिप्ट का पथ हमेशा sys.argv [0] में होगा।

import sys 
import os 
sys.path.append(os.path.split(sys.argv[0])[0]) 

अब मॉड्यूल के लिए आयात आयात करते समय, यह फ़ोल्डर में फ़ाइल को होस्ट करने वाले फ़ोल्डर में भी देखेंगे।

5

PYTHONPATH पर चीजों को जोड़ने के कई तरीके हैं।

पढ़ें http://docs.python.org/library/site.html

  1. PYTHONPATH वातावरण चर पहले तक स्क्रिप्ट चलाने के लिए सेट करें।

    आप अपने PYTHONPATH से agent.py चलाने के लिए यह python -m agent कर सकते हैं।

  2. .pth फाइलें lib/site-packages निर्देशिका में बनाएं।

  3. lib/site-packages में अपने मॉड्यूल इंस्टॉल करें।

11

आपको sys.path के साथ परेशान करने की आवश्यकता नहीं है। sys के लिए पायथन 2.6 दस्तावेज़ों से उद्धरण के लिए।पथ:

कार्यक्रम स्टार्टअप, इस सूची के पहले आइटम, पथ [0], स्क्रिप्ट करने के लिए इस्तेमाल किया गया था पायथन दुभाषिया आह्वान युक्त निर्देशिका है पर प्रारंभ के रूप में। यदि स्क्रिप्ट निर्देशिका उपलब्ध नहीं है (उदाहरण के लिए यदि दुभाषिया सहभागी शुरू हो जाती है या स्क्रिप्ट मानक इनपुट से पढ़ी जाती है), पथ [0] रिक्त स्ट्रिंग, जो पहले वर्तमान निर्देशिका में मॉड्यूल खोज करने के लिए अजगर का निर्देशन है। सूचना है कि स्क्रिप्ट निर्देशिका प्रविष्टियों PYTHONPATH का एक परिणाम के रूप में डाला से पहले डाला जाता है।

=== amod.py === 
def whoami(): 
    return __file__ 

=== ascript.py === 
import sys 
print "sys.argv", sys.argv 
print "sys.path", sys.path 
import amod 
print "amod __file__", amod.whoami() 

=== result of running ascript.py from afar === 
C:\somewhere_else>\python26\python \junk\timport\ascript.py 
sys.argv ['\\junk\\timport\\ascript.py'] 
sys.path ['C:\\junk\\timport', 'C:\\WINDOWS\\system32\\python26.zip', SNIP] 
amod __file__ C:\junk\timport\amod.py 

और अगर यह है फिर से चलाने के लिए, करने के लिए ... amod.pyc पाठ्यक्रम की अंतिम पंक्ति बदल जाता है। यह एक नवीनता नहीं प्रतीत होता है, यह पायथन 2.1 और 1.5.2 के साथ काम करता है।

डीबग आप के लिए संकेत: दो सरल फ़ाइलों का प्रयास करें की तरह मेरे पास है। पाइथन को -v और -vv के साथ चलाने का प्रयास करें। हमें पूर्ण ट्रैस बैक और त्रुटि संदेश, और अपने दो फ़ाइलों सहित आपके नाकाम रहने के परीक्षणों के परिणामों दिखाएं। हमें बताएं कि आप किस प्लेटफ़ॉर्म पर चल रहे हैं, और पायथन का कौन सा संस्करण। Checks.py फ़ाइल पर अनुमतियों की जांच करें। क्या कोई जांच है। कुछ ऐसा है जो हस्तक्षेप कर रहा है?

+0

मुझे लगता है कि यह सही जवाब होना चाहिए .. ओपी स्पष्ट रूप से विभिन्न स्थानों से स्क्रिप्ट आयात करने के बजाय आविष्कार के बारे में बात करता है। –

1

मुझे लगता है कि आप एक उचित अजगर पैकेज में एजेंट निर्देशिका बनाने पर विचार करना चाहिए। तो फिर तुम अजगर रास्ते पर कहीं भी इस पैकेज जगह है, और आप के रूप में

from agent import checks 

चेकों आयात कर सकते हैं देखें http://docs.python.org/tutorial/modules.html

1

आप पूरा पथ पता है उपयोग यह नुस्खा check.py को (http://code.activestate.com/recipes/159571/)

हैं यह नुस्खा (http://code.activestate.com/recipes/52662/) - आप सिस्टम पथ के लिए निर्देशिका जोड़ना चाहते हैं। इस मामले में मुझे एप्लिकेशन निर्देशिका (sys.argv [0]) निर्धारित करना होगा, यह मान AddSysPath फ़ंक्शन को पास करता है। यदि आप उत्पादन नमूना देखना चाहते हैं तो कृपया इस धागे पर एक टिप्पणी छोड़ दें ताकि मैं इसे बाद में पोस्ट करूं।

सम्मान।

0

अपने लक्ष्य की मेरी समझ सामान्यीकरण के लिए, आपको import custom_package_name कोई फर्क नहीं पड़ता का उपयोग कर जहां से अजगर और चाहे आपकी अजगर स्क्रिप्ट स्थित है बुला रहे हैं कस्टम संकुल आयात करने में सक्षम होना चाहता हूँ।

कई उत्तरों का उल्लेख है जो मैं वर्णन करने जा रहा हूं, लेकिन मुझे लगता है कि अधिकांश उत्तर पिछले ज्ञान को मानते हैं। मैं जितना स्पष्ट हो उतना स्पष्ट होने की कोशिश करूंगा।

कस्टम पैकेज को import कथन के माध्यम से आयात करने की अनुमति देने के लक्ष्य को प्राप्त करने के लक्ष्य के लिए, उन्हें पथ के माध्यम से पाइथन का उपयोग करने के पथ के माध्यम से कहीं भी खोजने योग्य होना चाहिए। पाइथन वास्तव में कई पथों का उपयोग करता है, लेकिन हम sys.prefix (आपके पायथन दुभाषिया में) /lib/pythonX.Y/site-packages (या lib/site-packages के साथ यदि आप विंडोज़ का उपयोग कर रहे हैं) के आउटपुट को जोड़कर केवल उस पर ध्यान केंद्रित करेंगे, जहां X.Y आपका पायथन संस्करण है।

Concretely, चलाकर रास्ता है कि अपने अजगर का उपयोग करता है लगता है:

import sys 
your_path = sys.prefix + '/lib/pythonX.Y/site-packages' 
print(your_path) 

इस पथ /usr/local/lib/python3.5/site-packages कुछ इस प्रकार दिखाई आप अजगर 3.5 उपयोग कर रहे हैं चाहिए, लेकिन यह आपके सेटअप के आधार पर बहुत अलग हो सकता है।

पायथन इस पैकेज (और कुछ अन्य) का उपयोग उन पैकेजों को ढूंढने के लिए करता है जिन्हें आप आयात करना चाहते हैं। तो आप अपने कस्टम पैकेज को /usr/local/lib/python3.5/site-packages फ़ोल्डर में डाल सकते हैं। init फ़ोल्डर में .py फ़ाइल जोड़ने के लिए मत भूलना।

टर्मिनल प्रकार में फिर से ठोस होने के लिए,:

cd your_path 
cp path_to_custom_package/custom_package ./ 

अब आप की तरह आप अगर पैकेज एक ही निर्देशिका (यानी import package.subpackage प्रत्येक सबपैकेज फ़ाइल के लिए में स्थित था होता सब कुछ अपने कस्टम पैकेज आयात करने के लिए सक्षम होना चाहिए आपके पैकेज में काम करना चाहिए)।

+0

कुछ प्रश्न कालातीत हैं –

संबंधित मुद्दे