2009-06-18 7 views
12

मैं किसी फ़ाइल की अपेक्षाकृत फ़ाइल को संदर्भित कैसे करूं?पायथन पैकेज में संबंधित फ़ाइल पथ

मेरे निर्देशिका संरचना है:

 
    /foo 
    package1/ 
     resources/ 
     __init__.py 
    package2/ 
     resources/ 
     __init__.py 
    script.py 

script.py आयात संकुल package1 और package2। हालांकि संकुल सिस्टम पर किसी अन्य स्क्रिप्ट द्वारा आयात किया जा सकता है। package1 के अंदर संसाधनों का संदर्भ कैसे देना चाहिए, यह सुनिश्चित करने के लिए कि os.path.curdir मामले में मनमाने ढंग से काम करेगा?

उत्तर

14

यदि आप foo/package1/resources फ़ोल्डर से फ़ाइलों का संदर्भ देना चाहते हैं तो आप मॉड्यूल के __file__ चर का उपयोग करना चाहते हैं। foo/package1/__init__.py के अंदर:

from os import path 
resources_dir = path.join(path.dirname(__file__), 'resources') 
+0

जैसा कि किसी अन्य उत्तर से मिलता है, यह आपके काम को ज़िप फ़ाइल में पैक किया गया है, तो यह काम नहीं करेगा। – Glyph

0

क्योंकि, यदि आपके पैकेज ज़िप किया गया अंडे के रूप में स्थापित किया गया था, तो संसाधन उपलब्ध नहीं हो सकता है यह एक बुरा विचार है।

यदि आप setuptool का उपयोग करते हैं, तो zip_safe = setup.py config में गलत जोड़ने के लिए मत भूलना।

+3

यह सच है, लेकिन यह वास्तव में एक उत्तर के बजाय टिप्पणी में होना चाहिए, क्योंकि यह सवाल का जवाब नहीं देता है। – Glyph

4

आप ज़िप-सुरक्षित हो सकते हैं और साथ ही साथ twisted.python.modules का उपयोग करते हुए एक अच्छा सुविधाजनक API का उपयोग कर सकते हैं।

उदाहरण के लिए

, अगर मैं इसे में कुछ पाठ और के साथ एक data.txt और एक निर्देशिका में इस sample.py है:

from twisted.python.modules import getModule 
moduleDirectory = getModule(__name__).filePath.parent() 
print repr(moduleDirectory.child("data.txt").open().read()) 

तो आयात करने sample यह कर देगा:

>>> import sample 
'Hello, data!\n' 
>>> 

यदि आपका मॉड्यूल है एक नियमित निर्देशिका में, getModule(__name__).filePathFilePath होगा; यदि यह एक ज़िप फ़ाइल में है, तो यह ZipPath होगा, जो एक ही एपीआई के अधिकांश, लेकिन सभी का समर्थन नहीं करता है।

4

एक साधारण/सुरक्षित तरीका यह है (जो setuptools साथ वितरित किया जाता है) pkg_resources से resource_filename विधि इतनी तरह उपयोग कर रहा है:

from pkg_resources import resource_filename 
filepath = resource_filename('package1', 'resources/thefile') 

या, आप package1/___init___.py अंदर इस लागू कर रहे हैं:

from pkg_resources import resource_filename 
filepath = resource_filename(__name__, 'resources/thefile') 

यह आपको एक साफ समाधान देता है जो भी (यदि मुझे गलत नहीं है) ज़िप सुरक्षित है।

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

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