2013-01-19 23 views
7

के आप एक परियोजना proj कहा जाता है और इस परियोजना आप निम्नलिखित संरचना है में मान लीजिए:setup.py: नाम बदलने src पैकेज का नाम पेश करने

proj/ 
    dists/ 
    doc/ 
    src/ 
    __init__.py 
    xyz.py 
    abc.py 
    test/ 
    setup.py 

वाली समस्त सामग्री देख सकते हैं की अपनी परियोजना में है src उपफोल्डर। src फ़ोल्डर से एक distutils वितरण पैकेज बनाने के बारे में कैसे जाना है?

मेरे अनुभवहीन विचार, निम्नलिखित the tutorial, setup.py इस तरह लिखने के लिए किया गया है जाएगा:

#omitting basics 
setup(
    name='proj', 
    packages=['src'], 
    package_dir={'proj':'src'} 
) 

लेकिन मेरी व्यवस्था करने के लिए जिसके परिणामस्वरूप पैकेज स्थापित करने के बाद, मैं अभी भी src.xyz और नहीं proj.xyz, आयात करने के लिए है जो लक्ष्य और अपेक्षित परिणाम होगा।

उत्तर

-3

से पहले आपको setup फ़ंक्शन को कॉल PYTHONPATH को src फ़ोल्डर जोड़ने की कोशिश कर सकते हैं:

os.chdir(src_path) 
:

import sys, os 
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src') 
sys.path.append(src_path) 

और यह भी, केवल सुरक्षा पर हो सकता है, आप तो कार्यशील निर्देशिका बदल

उसके बाद, यह सब ठीक होना चाहिए।

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

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

proj/ 
    src/ 
    proj/ 
     __init__.py 
     xyz.py 
     abc.py 
    setup.py 

और करने के लिए setup.py बदल रहा:

# ... 
setup(
    name='proj', 
    packages=['proj'], 
    package_dir={'':'src'} 
) 

यह distutils के लिए आवश्यक नहीं है, लेकिन अन्य उपकरणों मूल निर्देशिका उम्मीद कर सकते हैं

+1

मुझे यकीन है कि आप अभी तक समस्या मिला नहीं हूँ। मैं एक अजगर पैकेज लिखने की कोशिश कर रहा हूं जो अन्य लोग आसानी से स्थापित कर सकते हैं। यह सिर्फ आपके द्वारा किसी अन्य फ़ोल्डर में लिखे गए सामानों को आयात करने के बारे में नहीं है। – erikbwork

+0

हाँ मैं समझता हूं, लेकिन 'setup.py' को काम करने के लिए किसी अन्य फ़ोल्डर में सामान आयात करना होगा। एक बार ये पैकेज आपके पायथनपत में हैं, इससे कोई फर्क नहीं पड़ता कि वे कहां हैं। अगर यह आपके लिए काम नहीं करता है, तो आपको खेद है, आपको एक और तरीका देखना होगा। – jadkik94

+0

क्षमा करें, लेकिन यह समस्या नहीं है। – erikbwork

4

आप proj/ निर्देशिका में अजगर पैकेज फ़ाइलें डाल कर इसे ठीक कर सकता है इस मामले में __init__.py फ़ाइल का नाम पायथन पैकेज नाम यानी proj जैसा ही है।

+0

मैंने ऐसा किया और यह काम करता है। निश्चित नहीं है कि अगर मैं आपकी आखिरी टिप्पणी को समझता हूं, हालांकि। आपका मतलब है कि ऐसे उपकरण हैं जो मुझे अपेक्षा करते हैं कि काम करने के लिए 'proj/src/proj' जैसे फ़ोल्डर संरचना हो। इतना अक्षम लगता है। या मैं यहाँ कुछ अक्षम कर रहा हूँ? – erikbwork

+0

मेरा मतलब था कि निर्देशिका का नाम: '/__ init __। Py' पाइथन पैकेज नाम जैसा ही होना चाहिए, यदि मैं' __init __। Py' देखता हूं तो बस इसके मूल निर्देशिका नाम को देखकर मुझे पता है कि यह पाइथन पैकेज क्या है। – jfs

2

यह यहां सूचना दी setuptools में एक बग की वजह से है: https://github.com/pypa/setuptools/issues/250

असल में, यह काम करता है लेकिन देव मोड में नहीं।अब पर आप 3 समाधान है:

  • सिमलिंक proj रूप src पैकेज (और इसे अनदेखा जब comitting), यह बॉक्स से बाहर काम करता है होगा लेकिन src से proj
  • को गंदा
  • परिवर्तन है बनाने के एक src में उपनिर्देशिका proj और निम्न विकल्पों का उपयोग करें:
 
packages=['proj'], 
package_dir={'proj': 'src/proj'}, 
+0

सेटअप टूल्स समस्या से लिंक: https://github.com/pypa/setuptools/issues/250 –

+0

समस्या अब 3.5+ के लिए बंद है – Daniel