2009-06-16 7 views
10

, मैं निम्न निर्देशिकाओं संरचना है:कैसे एक मॉड्यूल मेरी अजगर आवेदन के लिए वर्तमान स्क्रिप्ट ऊपर के स्तर पर एक निर्देशिका से आयात करने

\myapp 
\myapp\utils\ 
\myapp\utils\GChartWrapper\ 
\myapp\model\ 
\myapp\view\ 
\myapp\controller\ 

में \ MyApp \ दृश्य \ मेरी कक्षा एक वर्ग आयात करना चाहिए में से एक GChartWrapper कहा जाता है।

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart 
     args = ('No module named GChartWrapper.GChart',) 
     message = 'No module named GChartWrapper.GChart' 

क्या मैं गलत कर रहा हूँ: हालांकि, मैं एक आयात त्रुटि हो रही है ...

myview.py 
from myapp.utils.GChartWrapper import * 

यहाँ त्रुटि है? मुझे पाइथन में मॉड्यूल/कक्षाओं को आयात करने में वास्तव में कठिन समय है ...

उत्तर

7

GChartWrapper पैकेज के __init__.py file PYTHONPATH पर GChartWrapper पैकेज की उम्मीद है। आप पहली पंक्ति से बता सकते हैं:

from GChartWrapper.GChart import * 

क्या आपके पैकेज निर्देशिका संरचना में GChartWrapper पैकेज शामिल होना आवश्यक है? यदि ऐसा है, तो एक चीज जो आप कर सकते हैं वह पथ जोड़ रहा है जहां पैकेज रन समय पर sys.path में रहता है। मुझे लगता है कि myview.pymyapp\view निर्देशिका में है? तो फिर तुम GChartWrapper आयात करने से पहले ऐसा कर सकता है:

import sys 
import os 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils'))) 

अगर यह आपकी निर्देशिका संरचना में यह होना आवश्यक नहीं है, यह यह परंपरागत स्थान पर स्थापित करने के लिए आसान हो सकता है। आप gChartWrapper स्रोत वितरण में शामिल setup.py स्क्रिप्ट चलाकर ऐसा कर सकते हैं।

+0

मैं ऐप इंजन पर GChartWrapper का उपयोग करने की कोशिश कर रहा हूं, इसलिए मैं वास्तव में सेटअप नहीं चला सकता। धन्यवाद! :) – Martin

2

आप उस पथ को बदल सकते हैं जहां पायथन फाइलों को ढूंढता है।

अपने स्रोत फ़ाइल के शीर्ष पर, जोड़ें:

import sys 
sys.path.append("..") 

या वैकल्पिक रूप से वातावरण चर बदलने के लिए:

export PYTHONPATH=.. 
5

आप arbritary पथ से मॉड्यूल और संकुल आयात नहीं करते इसके बजाय, अजगर में आप पैकेज और पूर्ण आयात का उपयोग करें। यह सभी भविष्य की समस्याओं से बच जाएगा।

उदाहरण:

बनाने निम्न फ़ाइलें:

MyApp\myapp\__init__.py 
MyApp\myapp\utils\__init__.py 
MyApp\myapp\utils\charts.py 
MyApp\myapp\model\__init__.py 
MyApp\myapp\view\__init__.py 
MyApp\myapp\controller\__init__.py 
MyApp\run.py 
MyApp\setup.py 
MyApp\README 

फ़ाइलों को छोड़कर खाली होना चाहिए:

MyApp\myapp\utils\charts.py:

class GChartWrapper(object): 
    def __init__(self): 
     print "DEBUG: An instance of GChartWrapper is being created!" 

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper 

def start(): 
    c = GChartWrapper() # creating instance of the class 

MyApp\run.py:

from myapp.view import start 
start() 

बस इतना ही! जब आप अपना एंट्री पॉइंट चलाते हैं (run.py) यह दृश्य पर एक फ़ंक्शन कॉल करता है, और यह GChartWrapper क्लास का एक उदाहरण बनाता है। इस ढांचे का उपयोग करके आप कहीं भी कुछ भी आयात कर सकते हैं और इसका इस्तेमाल कर सकते हैं।

पूरक के लिए, MyApp\setup.py में आप MyApp \ myapp पैकेज के लिए एक इंस्टॉलेशन प्रोग्राम लिखते हैं। इसे लिखने के लिए distutils का उपयोग करें:

from distutils.core import setup 
setup(name='MyApp', 
     version='1.0', 
     description='My Beautiful Application', 
     author='Martin', 
     author_email='[email protected]', 
     url='http://stackoverflow.com/questions/1003843/', 
     packages=['myapp'], 
     scripts=['run.py'] 
    ) 

यह पर्याप्त है। अब जब लोग MyApp फ़ोल्डर डाउनलोड करते हैं, तो वे इसे setup.py का उपयोग करके इंस्टॉल कर सकते हैं और run.py का उपयोग कर इसे चला सकते हैं। Distutils विंडोज़ स्थापित करने योग्य सहित कई प्रारूपों में संकुल उत्पन्न कर सकते हैं .EXE

यह पायथन पैकेज/अनुप्रयोगों को वितरित करने का मानक तरीका है।

sudo pip install GChartWrapper==0.9 

यह तो स्वत: ही आपके PYTHONPATH में जोड़ दिया जाएगा और फिर आप अपने/MyApp/utils से निकाल सकते हैं:

0

GChartWrapper ताकि आप मॉड्यूल स्थापित करने के लिए easy_install या पिप उपयोग कर सकते हैं भी PyPI से उपलब्ध है निर्देशिका। यदि आप सूडो का उपयोग नहीं कर सकते हैं, तो वर्चुअलएन्व (और वर्चुअलएन्वार्पर) का उपयोग करके देखें।

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