2009-12-21 7 views
10

एक्सेस करें मुझे लाइब्रेरी.ज़िप में फ़ाइलों को जोड़ने का समाधान मिला: Extend py2exe to copy files to the zipfile where pkg_resources can load themPy2exe: exe फ़ाइल में स्थिर फ़ाइलों को एम्बेड करें और उन्हें

लाइब्रेरी.ज़िप में exe शामिल नहीं होने पर मैं अपनी फ़ाइल तक पहुंच सकता हूं।

मैं एक फ़ाइल जोड़ता हूं: निर्देशिका में text.txt: पुस्तकालय.जीआईपी में foo/media।

import pkg_resources 
import zipfile 
from cStringIO import StringIO 

my_data = pkg_resources.resource_string(__name__,"library.zip") 

filezip = StringIO(my_data) 
zip = zipfile.ZipFile(filezip) 
data = zip.read("foo/media/text.txt") 

मैं pkg_resources इस्तेमाल करने की कोशिश, लेकिन मुझे लगता है कि मैं कुछ समझ में नहीं आता है क्योंकि मैं सीधे "library.zip" खोल सकते: और मैं इस कोड का उपयोग।

मेरा प्रश्न यह है कि मैं यह कैसे कर सकता हूं जब library.zip exe में एम्बेड किया गया है?

बेस्ट सादर

जीन मिशेल

उत्तर

0

आप pkg_resources नहीं का उपयोग करना चाहिए library.zip फ़ाइल को प्राप्त करने। अतिरिक्त संसाधन को पुनः प्राप्त करने के लिए आपको इसका उपयोग करना चाहिए।

मान लीजिए आप निम्नलिखित परियोजना संरचना है:

setup.py 
foo/ 
    __init__.py 
    bar.py 
    media/ 
     image.jpg 

आप image.jpg तक पहुँचने के लिए resource_string (या, अधिमानतः, resource_stream) का प्रयोग करेंगे:

img = pkg_resources.resource_string(__name__, 'media/image.jpg') 

कि "बस काम" चाहिए। कम से कम यह तब हुआ जब मैंने EXE में अपनी मीडिया फ़ाइलों को बंडल किया। (क्षमा करें, मैंने तब से कंपनी छोड़ दी है जहां मैं py2exe का उपयोग कर रहा था, इसलिए ड्रॉ करने के लिए एक काम करने वाला उदाहरण नहीं है।)

आप pkg_resources.resource_filename() का उपयोग करने का भी प्रयास कर सकते हैं, लेकिन मुझे नहीं लगता जो py2exe के तहत काम करता है।

1

धन्यवाद, लेकिन मैं समाधान

my_data = pkg_resources.resource_stream("__main__",sys.executable) # get lib.zip file 
zip = zipfile.ZipFile(my_data) 
data = zip.read("foo/media/doc.pdf") # get my data on lib.zip 
file = open(output_name, 'wb') 
file.write(data) # write it on a file 
file.close() 

बेस्ट सादर

10

मैं एक साथ यह करने के लिए एक यथोचित साफ समाधान पत्थर मिला, लेकिन यह pkg_resources उपयोग नहीं करता।

मुझे उत्पादकता उपकरण को स्टैंडअलोन EXEs के रूप में वितरित करने की आवश्यकता है, यानी, सभी एक .exe फ़ाइल में बंडल किए गए हैं। फ़ाइल-आधारित कॉन्फ़िगरेशन का उपयोग करते हुए, इन उपकरणों का उपयोग होने पर मुझे सूचनाएं भेजने की आवश्यकता होती है, जो मैं लॉगिंग एपीआई के माध्यम से करता हूं। मैंने logging.cfg फ़ाइल को इमेज किया है ताकि इन अधिसूचनाओं को प्रभावी ढंग से स्विच-ऑफ करना बंद कर दिया जा सके यानी ढीली फाइल को हटाकर ... जो शायद ऐप को तोड़ देगा।

तो निम्नलिखित मेरी setup.py से दिलचस्प बिट्स है:

LOGGING_CFG = open('main/resources/logging.cfg').read() 

setup(
    name='productivity-tool', 
    ... 

    # py2exe extras 
    console=[{'script': productivity_tool.__file__.replace('.pyc', '.py'), 
       'other_resources': [(u'LOGGINGCFG', 1, LOGGING_CFG)]}], 
    zipfile=None, 
    options={'py2exe': {'bundle_files': 1, 'dll_excludes': ['w9xpopen.exe']}}, 
) 
फिर स्टार्टअप कोड में productivity_tool.py के लिए

:

from win32api import LoadResource 
from StringIO import StringIO 
from logging.config import fileConfig 
... 

if __name__ == '__main__': 
    if is_exe(): 
     logging_cfg = StringIO(LoadResource(0, u'LOGGINGCFG', 1)) 
    else: 
     logging_cfg = 'main/resources/logging.cfg' 
    fileConfig(logging_cfg) 
    ... 

इलाज काम करता है !!!

+0

साफ समाधान! मैंने इसका इस्तेमाल किया और यह बहुत अच्छा काम करता है! – foresightyj

+0

क्या यह पीएनजी फाइलों पर काम करेगा? मैं इसे आजमा रहा हूं, लेकिन अगर आपको पता है तो मैं सुनकर आभारी रहूंगा। –

+0

ठीक है कुछ फाइल स्वरूपण मुद्दे हैं क्योंकि मैंने सोचा था कि मैं उन पर ध्यान दूंगा लेकिन इसके अलावा इसे काम करना चाहिए, है ना? –

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