2012-10-19 31 views
35

पाइथन में distutils में एक पाइथन पैकेज का वर्णन करते समय, __init__.py में प्रत्येक निर्देशिका को स्वचालित रूप से प्राप्त करने का एक तरीका है और इसे उप-पैकेज के रूप में शामिल किया गया है?पाइथन में डिस्ट्यूटल्स को स्वचालित रूप से पैकेज

यानी अगर संरचना होती है:

mypackage/__init__.py 
mypackage/a/__init__.py 
mypackage/b/__init__.py 

मैं कर रहा से बचना चाहते हैं:

packages = ['mypackage', 'mypackage.a', 'mypackage.b'] 

और इसके बजाय सिर्फ कार्य करें:

packages = ['mypackage'] 

और यह अपने आप a की तरह चीजों को खोजने के लिए है और b क्योंकि उनके पास एक init फ़ाइल है। धन्यवाद।

+0

बस सुनिश्चित करें कि आप न दें कि किसी भी कबाड़ का निर्माण करता है, तो आप यह कर पहले अपने पैकेज संरचना में जमा कर सकते हैं। – asmeurer

उत्तर

13

सबसे आसान तरीका है (है कि मैं के बारे में पता) pkgutil.walk_packages उपयोग करने के लिए संकुल उपज के लिए है:

from distutils.core import setup 
from pkgutil import walk_packages 

import mypackage 

def find_packages(path=__path__, prefix=""): 
    yield prefix 
    prefix = prefix + "." 
    for _, name, ispkg in walk_packages(path, prefix): 
     if ispkg: 
      yield name 

setup(
    # ... snip ... 
    packages = list(find_packages(mypackage.__path__, mypackage.__name__)), 
    # ... snip ... 
) 
+1

ऐसा करने के लिए बेहतर तरीके (वास्तव में, संभवतः * हैं) ... मैं बस उन्हें नहीं जानता (अभी तक) :-) –

+7

setuptools से find_packages() बिल्कुल वही अनिवार्य रूप से वही करता है, मेरा उत्तर – dm76

+1

देखें @ डीएम 76 हां लेकिन ओपी distutils के लिए पूछ रहा है, सेटअपtools नहीं। क्या मैं कुछ भूल रहा हूँ? – Paolo

98

मैं find_packages (का प्रयोग करके) समारोह उपलब्ध की सिफारिश करेंगे साथ setuptools जैसे:

from setuptools import setup, find_packages 

और उसके बाद करना

packages=find_packages() 
+1

नहीं है ध्यान दें कि 'find_packages()' नहीं मिला> 3.3-शैली no-__init__.py पैकेज। इस मुद्दे के बारे में टिकट https://bitbucket.org/pypa/setuptools/issue/97 पर है। तो अभी के लिए, 'find_packages()' ऑटो संग्रह के लिए संकुल में '__init __। Py' फ़ाइलों को जोड़ना आवश्यक है, या आपको उन्हें 'packages' में स्पष्ट रूप से नाम देना होगा। – Iodnas

+1

अद्यतन: यहां तक ​​कि स्पष्ट सूची समस्याएं उत्पन्न करती है यदि '__init __। Py' फ़ाइलों का उपयोग पायथन 3.3 (' पैकेज init फ़ाइल 'mymod/mysubmod/__ init__.py' नहीं मिला है (या नियमित फ़ाइल नहीं) ')। – Iodnas

2
import re, os 
def find_packages(path='.'): 
    ret = [] 
    for root, dirs, files in os.walk(path): 
     if '__init__.py' in files: 
      ret.append(re.sub('^[^A-z0-9_]+', '', root.replace('/', '.'))) 
    return ret 

setup(
... 
packages = find_packages() 
... 
) 
15

dm76 जवाब के रूप में एक ही, मैं अपने रेपो में परीक्षण किया है, इसलिए मैं का उपयोग सिर्फ इतना है कि:

from setuptools import find_packages 

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]), 

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

  • कोई संबंधित समस्या नहीं^_^