2011-01-14 7 views
6

के साथ स्फिंक्स का उपयोग करके मैंने सी में लिखे गए एक सबमिशन सहित एक पायथन मॉड्यूल लिखा है: मॉड्यूल को foo कहा जाता है और सी भाग foo._bar है। यह बढ़ाने के लिएएक डिस्ट्यूट-निर्मित सी एक्सटेंशन

src/ 
    foo/__init__.py <- contains the public stuff 
    foo/_bar/bar.c <- the C extension 
doc/    <- Sphinx configuration 
    conf.py 
    ... 

foo/__init__.py आयात _bar, और उपयोगी सामग्री foo मॉड्यूल में सामने आ रहा है: संरचना की तरह लग रहा है। यह ठीक होने पर ठीक काम करता है, लेकिन स्पष्ट रूप से असम्बद्ध रूप में काम नहीं करेगा, क्योंकि _bar तब तक अस्तित्व में नहीं है जब तक यह बनाया गया न हो।

मैं परियोजना दस्तावेज करने के लिए स्फिंक्स का उपयोग करना चाहता हूं, और foo मॉड्यूल पर autodoc एक्सटेंशन का उपयोग करना चाहता हूं। इसका मतलब है कि मैं प्रलेखन बनाने से पहले परियोजना बनाने की जरूरत है।

चूंकि मैं distutils के साथ निर्माण करता हूं, निर्मित मॉड्यूल कुछ अलग-अलग नामित डीआईआर build/lib.linux-ARCH-PYVERSION में समाप्त होता है - जिसका अर्थ है कि मैं केवल स्पिंक्स 'conf.py में निर्देशिका को हार्ड-कोड नहीं कर सकता।

तो मैं निर्मित मॉड्यूल पर स्फिंक्स बिल्डर चलाने के लिए अपने distutils setup.py स्क्रिप्ट को कैसे कॉन्फ़िगर कर सकता हूं?

setup(cmdclass = { 
     'fake': fake, 
     'build_ext_fake' : build_ext_fake 
     }, 
     package_dir = {'': 'src'}, 
     packages = ['foo'], 
     name = 'foo', 
     version = '0.1', 
     description = desc, 
     ext_modules = [module_real]) 

उत्तर

4

distutils के बाद से चर का निर्माण पथ पता लगाना, क्यों नहीं करने का एक तरीका है:

पूर्णता के लिए, यहाँ setup करने के लिए कॉल है ('झूठे' चीजें हैं जो build उपवर्ग और build_ext कस्टम बिल्डरों कर रहे हैं) बस इसका इस्तेमाल करें?

import distutils.command.build 
from distutils.dist import Distribution 

b = distutils.command.build.build(Distribution()) 
b.initialize_options() 
b.finalize_options() 

print b.build_temp 

# If you're building a library, you might need: 
print b.build_lib 

# Other values of interest are: 
b.build_purelib 
b.build_platlib 
b.build_scripts 
b.build_base 

भी सोचा distutils डॉक्स विरल हैं, here you'll find one-liners निर्माण किस प्रकार के बारे में नहीं है।

+0

यह एक बहुत अच्छा दृष्टिकोण है - मैं इसे सही रूप से 'conf.py' (मुझे लगता है) में डाल सकता है। मैं कल कोशिश करूँगा। – detly

+1

आह ... मुझे 'build_lib' का उपयोग करने की आवश्यकता नहीं है, 'build_temp' नहीं, और मेरे क्रॉस संकलन के साथ गड़बड़ है, लेकिन ऐसा लगता है कि (और विस्तार भाग पर भी, एक अतिरिक्त बोनस के रूप में!) – detly

+0

कूल, अगर आप चाहते हैं कि मैं अधिक विस्तार जोड़ सकता हूं (या अपने सटीक चरणों के साथ एक उत्तर जोड़ें ताकि अन्य लाभ उठा सकें)। – TryPyPy

2

वहाँ सरल तरीके निर्माण dir नाम पाने के लिए कर रहे हैं:

>>> from distutils.util import get_platform 
>>> get_platform() 
'linux-x86_64' 

मैं तुम्हें स्ट्रिंग संयोजन :)

खत्म दूँगा अपनी समस्या को हल करने के लिए एक और तरीका है एक setup.cfg बनाने के लिए है इस सामग्री के साथ अपने setup.py के साथ फ़ाइल:

[build_ext] 
inplace = 1 

यह आपके मूल पैकेज निर्देशिका में आपके एक्सटेंशन मॉड्यूल का निर्माण करेगा। स्फिंक्स इसे देखना चाहिए।