2009-09-08 17 views
26

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

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

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

उत्तर

34

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

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 

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

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

"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 ... 

आप एक fileobject के रूप में एक संसाधन के इलाज के लिए की जरूरत है, resource_stream() का उपयोग करें।

संसाधनों तक पहुंचने वाला कोड कहीं भी आपके प्रोजेक्ट की उप-पैकेज संरचना के भीतर हो सकता है, इस मामले में छवियों को पूर्ण नाम: 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 से अपने परीक्षण स्क्रिप्ट आह्वान करना होगा । यदि आप code.py के समान निर्देशिका में हैं, तो Python को proj पैकेज के बारे में पता नहीं चलेगा। तो proj.resources जैसी चीजें हल नहीं होंगी।

+1

वैसे, यहां नुकसान बहुत अधिक हैं। क्या पाइथन परियोजनाओं के साथ संसाधनों को पैक करने का कोई आसान तरीका नहीं है? –

+0

मुझे केवल 2 व्यापक रूप से समर्थित तरीकों के बारे में पता है (वे दुर्भाग्य से सरल नहीं हैं): 1) 'distutils'-way (मानक): प्रलेखन संसाधन फ़ाइलों को पाठक के लिए एक अभ्यास के रूप में उपयोग करने से छोड़ देता है (शायद क्योंकि वे पथ में हेरफेर '__file__' के सापेक्ष सभी की जरूरत है)। 2) 'setuptools'-way ('distutils' का सुपरसेट) ऊपर वर्णित है। –

4

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

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

यहाँ __init__.py फ़ाइल है: उदाहरण देकर स्पष्ट करने मैं क्या मतलब है, मैं तीन स्थानों में निम्नलिखित __init__.py फ़ाइल बनाई

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

C: \ अस्थायी \ काम करते हैं, मैं एक ऐप्स topapp बनाने के लिए,। py, के रूप में इस प्रकार है:

import topp 
import topp.sub1 
import topp.sub2 

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

 
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 

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

अद्यतन:Here प्रासंगिक py2exe दस्तावेज़ है।

+0

लेकिन जब आप पूरी चीज़ को py2exe करना चाहते हैं तो क्या होगा? –

+0

मैं कोड के साथ संसाधनों को पैक करने के बारे में बात नहीं कर रहा था। मैं इस तथ्य के बारे में बात कर रहा था कि '__file__' काम नहीं करेगा। –

1

@ pycon2009, distutils और setuptools पर एक प्रस्तुति थी। आप यहाँ

Eggs and Buildout Deployment in Python - Part 3

वीडियो के सभी

Eggs and Buildout Deployment in Python - Part 1

Eggs and Buildout Deployment in Python - Part 2

इन वीडियो में पा सकते हैं, वे कैसे अपने पैकेज में निश्चित संसाधनों को शामिल करने का वर्णन। मेरा मानना ​​है कि यह भाग 2 में है।

सेटअपटॉल्स के साथ, आप निर्भरताओं को परिभाषित कर सकते हैं, इससे आपको 2 पैकेज होने की अनुमति मिल जाएगी जो तीसरे पैकेज से संसाधनों का उपयोग करती हैं।

Setuptools आपको इन संसाधनों तक पहुंचने का एक मानक तरीका भी प्रदान करता है और आपको अपने पैकेजों के अंदर सापेक्ष पथ का उपयोग करने की अनुमति देता है, जो आपके पैकेज कहां स्थापित किए जाने की चिंता करने की आवश्यकता को समाप्त करता है।

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