python एक पायथन मॉड्यूल वितरण में एक फ़ाइल ढूँढना




distutils (3)

मैंने एक पायथन पैकेज लिखा है जिसमें अधिक समय-उपभोक्ता कम्प्यूटेशंस में से एक के लिए पूर्व-गणना मूल्यों के एक bsddb डेटाबेस शामिल है सादगी के लिए, मेरी सेटअप स्क्रिप्ट डेटाबेस को एक ही निर्देशिका में डेटाबेस के रूप में स्थापित करती है जो डेटाबेस को एक्सेस करता है (यूनिक्स पर, /usr/lib/python2.5/site-packages/mypackage/ जैसे कुछ)।

मैं डेटाबेस फ़ाइल के अंतिम स्थान को कैसे संग्रहीत करूं ताकि मेरा कोड इसे एक्सेस कर सके? अभी, मैं डेटाबेस में __file__ वाले मॉड्यूल में __file__ चर के आधार पर एक हैक का उपयोग कर रहा हूं:

dbname = os.path.join(os.path.dirname(__file__), "database.dat")

यह काम करता है, लेकिन ऐसा लगता है ... क्या ऐसा करने के लिए इससे अच्छा तरीका है? मैं सेटअप स्क्रिप्ट चाहता हूं कि बस distutils मॉड्यूल से अंतिम इंस्टॉलेशन स्थान को प्राप्त करें और इसे "dbconfig.py" फ़ाइल में जमा करें जो कि डेटाबेस के साथ कोड के साथ स्थापित हो जाता है।


pkgutil.get_data उपयोग करें यह pkg_resources.resource_stream का चचेरा भाई है, लेकिन मानक पुस्तकालय में, और फ्लैट फाइलसिस्टम के साथ ही ज़िप पैकेज और अन्य आयातकों के साथ काम करना चाहिए।


Pkg_resources का उपयोग करने की कोशिश करें, जो setuptools का हिस्सा है (और सभी अजगरों पर उपलब्ध है जो मुझे अभी तक पहुंच है):

>>> import pkg_resources
>>> pkg_resources.resource_ filename(__name__, "foo.config")
'foo.config'
>>> pkg_resources.resource_filename('tempfile', "foo.config")
'/usr/lib/python2.4/foo.config'

अंडे पृष्ठ और pkg_resources पृष्ठ पर संसाधन पाने के लिए pkg_resources का उपयोग करने के बारे में अधिक चर्चा है।

यह भी ध्यान दें, जहां संभावित संभव है, pkg_resources.resource_stream या pkg_resources.resource_string का उपयोग करने के लिए शायद यह उचित है क्योंकि अगर पैकेज अंडा का हिस्सा है, संसाधन_फाइलनाम फाइल को एक अस्थायी निर्देशिका में कॉपी करेगा।


संभवत: ऐसा करने का तरीका, उन फ़ाइलों को स्थापित करने के लिए setuptools का उपयोग करने की तरह अधिक उन्नत करने का बिना, जहां वे हैं

नोटिस उस दृष्टिकोण में एक समस्या है, क्योंकि वास्तविक सुरक्षा फ़्रेमवर्क (यूनिक्सस, आदि) के साथ ओएस पर आपके स्क्रिप्ट पर चलने वाले उपयोगकर्ता को सिस्टम निर्देशिका में डीबी तक पहुंचने के अधिकार नहीं मिल सकते हैं जहां इसे स्थापित किया जाता है





distutils