दिलचस्प पोस्ट
सी ++ 0x में कोई सिमाफोर नहीं है? थ्रेड को सिंक्रनाइज़ कैसे करें? क्या "अनाम स्ट्रैक्ट्स" मानक है? और, वास्तव में, वे क्या हैं? सी # के प्रयोग से, यह कैसे पता चलता है कि किस प्रक्रिया ने एक फाइल लॉक की है? टूटी छवियों को बदलने के लिए jQuery / JavaScript संसाधनों को प्राप्त / समापन करते समय जावा प्रयास / पकड़ / अंततः सर्वश्रेष्ठ प्रथाओं Yyyy-mm-dd को जावास्क्रिप्ट स्वरूपित करें एसक्यूएल सर्वर चयन करने के लिए JSON फ़ंक्शन अजगर की मदद से फ़ाइल में सभी रिक्त पंक्तियों को कैसे हटाएं? Android पर 'संदर्भ' प्राप्त करने का स्थिर तरीका है? सी प्रोग्रामिंग भाषा मानकों के अनुसार एक संरचना को कैसे प्रारंभ करें फ़ोल्डर्स की तारीख- उसके बाद- (सीएमडी फाइल में डेट कैल्श) पायथन में तीर कुंजी के मान ढूँढना: वे ट्रिपल क्यों हैं? एक जेपीनल पर आयताकार आरेखण एनएसटीपीएन में पार्स प्लिस्ट (एनएसएसटीइंग) परीक्षण के लिए समीकरण यदि कोई बिंदु एक वृत्त के अंदर है

अजगर: निष्पादन योग्य ज़िप फ़ाइलों में डेटा फ़ाइलों को शामिल किया जा सकता है?

अजगर में काफी नए होने के नाते, मैंने हाल ही में फ़ाइल के शीर्ष पर एक __main__.py फ़ाइल रखकर एक .zip फ़ाइल को सीधे निष्पादित करने की क्षमता की खोज की है। यह अजगर कोड के लिए बहुत अच्छा काम करता है, लेकिन क्या मैं अन्य प्रकार की फ़ाइलों को बंडल कर सकता हूं और मेरी स्क्रिप्ट के साथ उन तक पहुंच सकता हूं? यदि हां, तो कैसे?

मेरा अंतिम लक्ष्य एक .zip फ़ाइल में अजगर कोड के साथ कुछ छवि फ़ाइलों को बंडल करने के लिए होगा, फिर डिस्क में उन्हें निकालने के बिना ऐप के भीतर उन चित्रों का उपयोग करने में सक्षम हो जाएगा। मैं भी एक कॉपीराइट नोटिस, रिलीज नोट, आदि को बंडल करना चाहूंगा ताकि पूरे ऐप और उसकी डेटा फ़ाइलें एक ही ज़िप में हों, जिसे इसे कहीं से निकालने के बिना निष्पादित किया जा सकता है

वेब के समाधान से एकत्रित समाधान "अजगर: निष्पादन योग्य ज़िप फ़ाइलों में डेटा फ़ाइलों को शामिल किया जा सकता है?"

आप फ़ाइलों को एक्सेस करने के लिए pkg_resources फ़ंक्शंस का उपयोग कर सकते हैं:

 # __main__.py import pkg_resources from PIL import Image print pkg_resources.resource_string(__name__, 'README.txt') im = Image.open(pkg_resources.resource_stream('app', 'im.png')) im.rotate(45).show() 

जहां ज़िपफ़ाइल में शामिल हैं:

  ।
 | - ऐप
 |  | - IM.png
 |  `- __init__.py
 | - README.txt
 `- __main__.py 

ज़िपफ़ाइल निष्पादन योग्य बनाने के लिए, चलाएं:

 $ echo '#!/usr/bin/env python' | cat - zipfile > program-name $ chmod +x program-name 

इसे परीक्षण करने के लिए:

 $ cp program-name /another-dir/ $ cd /another-dir && ./program-name 

बस इस जवाब में सुझाए गए अनुसार pkgutil.get_data () का उपयोग करें

अपने लिनक्स बॉक्स पर कम से कम कोई भी खुली फाइलहैन्डल या मैप की गई मेमोरी प्रक्रिया की अपनी ज़िपफ़ाइल में नहीं है, इसलिए संभवतः "जादुई" से इसका उपयोग करने का कोई रास्ता नहीं है।

हालांकि, अपनी खुद की पहुंच बनाना मुश्किल नहीं है। __main__.py तरह से एक __main__.py बनाएँ:

 import os, zipfile me = zipfile.ZipFile(os.path.dirname(__file__), 'r') f = me.open('other.txt') print f.read() f.close() me.close() 

संपादित करें: कुछ हद तक संक्षेप में, वह संपूर्णता के लिए:

 $ echo "Hello ZIP" > other.txt $ zip testo.zip __main__.py other.txt $ python testo.zip Hello ZIP 

pkgutil.get_data(package, resource) एक पैकेज और एक संसाधन का नाम लेता है। इसका अर्थ है कि आपको ज़िप फ़ाइल के भीतर एक पैकेज के अंदर अपनी डेटा फाइलें डालनी होगी।

इसलिए उदाहरण के लिए एक ज़िप फ़ाइल है:

 __main__.py zippeddata/__init__.py zippeddata/data.txt 

__init__.py फ़ाइल रिक्त या सिर्फ एक टिप्पणी हो सकती है, लेकिन आपको zippeddata आयात करने योग्य बनाने की आवश्यकता है।

फिर __main__.py आप कॉल करते हैं:

 data = pkgutil.get_data('zippeddata', 'data.txt')