2009-08-11 19 views
274

मेरे पास /project पर स्थित tester.py नामक एक फ़ाइल है।एक उपनिर्देशिका से एक फ़ाइल आयात करें?

/project/tester.py 
/project/lib/BoxTime.py 

मैं tester से BoxTime आयात करना चाहते हैं:

/project उप-निर्देशिका lib कहा जाता है, BoxTime.py नामक एक फ़ाइल के साथ है। मैं इस की कोशिश की है:

import lib.BoxTime 

कौन सा हुई:

Traceback (most recent call last): 
    File "./tester.py", line 3, in <module> 
    import lib.BoxTime 
ImportError: No module named lib.BoxTime 

कोई भी विचार कैसे उपनिर्देशिका से BoxTime आयात करने के लिए?

संपादित

__init__.py समस्या थी, लेकिन मत भूलना lib.BoxTime, या प्रयोग के रूप में BoxTime का उल्लेख करने के:

import lib.BoxTime as BT 
... 
BT.bt_function() 

उत्तर

353

संकुल प्रलेखन पर एक नज़र डालें (धारा 6.4) यहां: http://docs.python.org/tutorial/modules.html

संक्षेप में, आपको

नामक एक खाली फ़ाइल डालना होगा
__init__.py 

"lib" निर्देशिका में।

+28

क्यों यह महसूस करता है * hacky *? यह तरीका है कि पाइथन सुरक्षित/उपलब्ध आयात निर्देशिकाओं को चिह्नित करता है। – IAbstract

+5

इतना ही नहीं यह सुरक्षित/उपलब्ध आयात निर्देशिका के निशान, लेकिन यह भी जब एक निर्देशिका नाम का आयात कुछ प्रवर्तन कोड को चलाने के लिए एक तरह से प्रदान करता है। – Sadjad

+12

हाँ इस hacky और भी गंदा है, और मेरी राय में भाषा फाइल सिस्टम भर में लोड हो रहा है फ़ाइलों की अपनी तरह से लागू नहीं करना चाहिए। PHP में हम userland कोड रजिस्टर कई autoloading कार्यों है कि जब एक नाम स्थान/वर्ग याद आ रही है कहा जाता है की अनुमति से समस्या हल हो। फिर समुदाय ने पीएसआर -4 मानक और संगीतकार का उत्पादन किया है, और आजकल किसी को इसके बारे में चिंता करने की ज़रूरत नहीं है। और कोई बेवकूफ हार्डकोडेड '__init__' फ़ाइलें (लेकिन यदि आप इसे, बस एक autoloading हुक रजिस्टर करना चाहते हैं! यह _hacky_ और _hackable_ के बीच का अंतर है)। –

11

import .lib.BoxTime आज़माएं। अधिक जानकारी के लिए PEP 328 में सापेक्ष आयात के बारे में पढ़ें।

+2

में काम किया मुझे नहीं लगता कि मैं कभी भी पहले इस्तेमाल किया है कि वाक्य रचना को देखा है है। क्या इस विधि का उपयोग करने के लिए कोई मजबूत कारण नहीं है? – tgray

+1

यह उत्तर क्यों नहीं था। निश्चित रूप से, अगर आप पूरी पैकेज चीज करना चाहते हैं, तो आपको यह करना चाहिए। लेकिन यह मूल सवाल नहीं था। –

+0

यह मुझे देता है: ValueError: गैर-पैकेज – Alex

19

क्या आपकी lib निर्देशिका में __init__.py फ़ाइल है?

पाइथन __init__.py का उपयोग यह निर्धारित करने के लिए करता है कि कोई निर्देशिका मॉड्यूल है या नहीं।

108
  • lib नाम वाली उप बनाएँ।
  • lib\__init__.py नाम की एक खाली फ़ाइल बनाएं। lib ऊपर निर्देशिका में

    def foo(): 
        print "foo!" 
    
  • अपने ग्राहक कोड में, लिखना:

  • lib\BoxTime.py में, इस तरह एक समारोह foo() लिखने

    from lib import BoxTime 
    BoxTime.foo() 
    
  • अपने ग्राहक कोड चलाएँ।आप मिल जाएगा:

    foo! 
    

काफी समय बाद - लिनक्स में, यह इस तरह दिखेगा:

% cd ~/tmp 
% mkdir lib 
% touch lib/__init__.py 
% cat > lib/BoxTime.py << EOF 
heredoc> def foo(): 
heredoc>  print "foo!" 
heredoc> EOF 
% tree lib 
lib 
├── BoxTime.py 
└── __init__.py 

0 directories, 2 files 
% python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from lib import BoxTime 
>>> BoxTime.foo() 
foo! 
+0

क्या आप पाइथन दस्तावेज के लिए एक लिंक प्रदान कर सकते हैं जहां यह समझाया गया है? धन्यवाद! – Zenon

+1

@ ज़ेनॉन, इसे आज़माएं: docs.python.org/tutorial/modules.html#packages – hughdbrown

32

आप sys.path में यह डालने की कोशिश कर सकते हैं:

sys.path.insert(0, './lib') 
import BoxTime 
+6

यह बहुत अच्छा है अगर आप किसी कारण से __init__.py फ़ाइल नहीं बना सकते हैं या नहीं बनाएंगे। – jpihl

+1

मेरे लिए काम नहीं कर रहा है ('कोई मॉड्यूल ..' त्रुटि) – minsk

+1

यदि आप "प्रोजेक्ट" निर्देशिका से पायथन चलाते हैं तो यह काम करता है। "।" आपकी वर्तमान कार्यशील निर्देशिका के सापेक्ष व्याख्या की गई है, निर्देशिका के सापेक्ष नहीं, जहां आप जिस फ़ाइल को निष्पादित कर रहे हैं। आपको 'सीडी/डेटा',' पायथन ../ project/tester.py' कहें। फिर यह काम नहीं करेगा। – morningstar

0

इस प्रयास करें:

from lib import BoxTime

+1

बिना किसी स्पष्टीकरण के यह बहुत उपयोगी नहीं है। –

6

मैं क्या यह जो मूल रूप से सभी मामलों (सुनिश्चित करें कि आप रिश्तेदार/रास्ते में __init__.py है/to/अपने/lib/फ़ोल्डर बनाने) को शामिल किया गया:

import sys, os 
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder") 
import someFileNameWhichIsInTheFolder 
... 
somefile.foo() 


उदाहरण:
आपके पास अपने प्रोजेक्ट फ़ोल्डर में है:

/root/myproject/app.py 

आप एक अन्य परियोजना फ़ोल्डर में है:

/root/anotherproject/utils.py 
/root/anotherproject/__init__.py 

आप /root/anotherproject/utils.py का उपयोग करें और foo समारोह जो उस में है कॉल करना चाहते हैं।

तो तुम app.py में लिखें:

import sys, os 
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject") 
import utils 

utils.foo() 
+1

यदि आप 'os.path' का उपयोग कर रहे हैं तो आप शायद' os.path.join ((os.path.dirname (os.path.realpath (__ फ़ाइल __)), '..', 'anotherproject') का उपयोग करना चाहते हैं। अपने पथ concatenation में '/' हार्डकोडिंग के बजाय। – cowbert

0

उपनिर्देशिका/lib में एक खाली फ़ाइल __init__.py बनाएँ। और मुख्य कोड के शुरू में जोड़ने

from __future__ import absolute_import 

तो

import lib.BoxTime as BT 
... 
BT.bt_function() 

या बेहतर

from lib.BoxTime import bt_function 
... 
bt_function() 
संबंधित मुद्दे