python - महत - विद्यालय प्रबंधन के सिद्धांत




एक पायथन परियोजना में संसाधनों का प्रबंध करना (2)

मेरे पास एक पायथन प्रोजेक्ट है जिसमें मैं कई गैर-कोड फ़ाइलों का उपयोग कर रहा हूं I वर्तमान में ये सभी छवियां हैं, लेकिन मैं भविष्य में अन्य प्रकार की फ़ाइलों का उपयोग कर सकता हूं। इन फाइलों को भंडारण और संदर्भित करने के लिए क्या अच्छी योजना होगी?

मैं सिर्फ मुख्य निर्देशिका में एक फ़ोल्डर "संसाधनों" बनाने पर विचार किया, लेकिन एक समस्या है; कुछ छवियों का उपयोग मेरे प्रोजेक्ट के उप-पैकेज में किया जाता है। इन छवियों को संग्रहीत करने से जिस तरह से युग्मन होता है, जो एक नुकसान है।

इसके अलावा, मुझे इन फ़ाइलों तक पहुंचने की ज़रूरत है जो मेरी वर्तमान निर्देशिका है पर स्वतंत्र है।


आपके प्रत्येक os.path हमेशा एक अलग "संसाधन" फ़ोल्डर हो सकता है, जिसके लिए इसकी आवश्यकता होती है, और अपने सबपैकेज के __file__ मानों से ये प्राप्त करने के लिए os.path फ़ंक्शन का उपयोग करें। यह समझाने के लिए कि मेरा क्या मतलब है, मैंने निम्नलिखित __init__.py फ़ाइल को तीन स्थानों में बनाया है:

c:\temp\topp        (top-level package)
c:\temp\topp\sub1   (subpackage 1)
c:\temp\topp\sub2   (subpackage 2)

यहां __init__.py फ़ाइल है:

import os.path
resource_path = os.path.join(os.path.split(__file__)[0], "resources")
print resource_path

C: \ temp \ work में, मैं एक ऐप बनाऊं, topapp.py, निम्नानुसार:

import topp
import topp.sub1
import topp.sub2

यह topp पैकेज और topp का उपयोग कर आवेदन को topp । तब मैं इसे चलाता हूँ:

C:\temp\work>topapp
Traceback (most recent call last):
  File "C:\temp\work\topapp.py", line 1, in 
    import topp
ImportError: No module named topp

उम्मीद के मुताबिक हम पथ पर हमारे पैकेज होने के अनुकरण के लिए PYTHONPATH सेट करें:

C:\temp\work>set PYTHONPATH=c:\temp

C:\temp\work>topapp
c:\temp\topp\resources
c:\temp\topp\sub1\resources
c:\temp\topp\sub2\resources

जैसा कि आप देख सकते हैं, पथ पर वास्तविक (उप) संकुल के स्थान पर संसाधन पथ ठीक तरीके से हल किए गए थे।

अद्यतन: यहाँ प्रासंगिक py2exe प्रलेखन है


आप pkg_resources लायब्रेरी का उपयोग करना चाहते हैं जो setuptools साथ आता है।

उदाहरण के लिए, मैंने एक छोटा सा पैकेज "proj" बनाया है जिसका उपयोग मैं संसाधन संगठन योजना का उपयोग करता हूं:

proj/setup.py
proj/proj/__init__.py
proj/proj/code.py
proj/proj/resources/__init__.py
proj/proj/resources/images/__init__.py
proj/proj/resources/images/pic1.png
proj/proj/resources/images/pic2.png

ध्यान दें कि मैं एक अलग सबपैकेज में सभी संसाधनों को कैसे रखता हूं

"code.py" दिखाता है कि संसाधन ऑब्जेक्ट के संदर्भ में pkg_resources कैसे उपयोग किया जाता है:

from pkg_resources import resource_string, resource_listdir

# Itemize data files under proj/resources/images:
print resource_listdir('proj.resources.images', '')
# Get the data file bytes:
print resource_string('proj.resources.images', 'pic2.png').encode('base64')

यदि आप इसे चलाते हैं, तो आप प्राप्त करते हैं:

['__init__.py', '__init__.pyc', 'pic1.png', 'pic2.png']
iVBORw0KGgoAAAANSUhE ...

यदि आपको किसी फाइल को एक वस्तु के रूप में व्यवहार करने की आवश्यकता है, तो source_stream resource_stream() उपयोग करें

संसाधनों तक पहुंचने वाला कोड आपकी प्रोजेक्ट की सबपैकेज संरचना के भीतर कहीं भी हो सकता है, इसे केवल पूरे नाम से proj.resources.images को संदर्भित करने की आवश्यकता है: proj.resources.images , इस स्थिति में।

यहां "setup.py" :

#!/usr/bin/env python

from setuptools import setup, find_packages

setup(name='proj',
      packages=find_packages(),
      package_data={'': ['*.png']})

चेतावनी: चीजों को "स्थानीय रूप से" जांचने के लिए, जो पहले पैकेज को स्थापित करना है, आपको अपनी परीक्षण स्क्रिप्ट को उस निर्देशिका से setup.py जो setup.py । यदि आप code.py के समान निर्देशिका में हैं, तो पायथन को code.py पैकेज के बारे में नहीं पता होगा। तो proj.resources जैसी चीजों का समाधान नहीं होगा।





decoupling