2015-04-11 22 views
5

मैं ज़िप पैकेज से उप-मॉड्यूल लोड करने का प्रयास कर रहा हूं लेकिन यह काम नहीं करेगा। यह सही कैसे करें?zipimporter उप-मॉड्यूल नहीं ढूंढ सकता/लोड नहीं कर सकता

foo.zip

foo/ 
    __init__.py 
    bar.py 

test.py

import os 
import zipimport 

dirname = os.path.dirname(__file__) 
importer = zipimport.zipimporter(os.path.join(dirname, 'foo.zip')) 
print importer.is_package('foo') 
print importer.load_module('foo') 
print importer.load_module('foo.bar') 

आउटपुट

$ python test.py 
True 
<module 'foo' from 'foo.zip/foo/__init__.py'> 
Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    print importer.load_module('foo.bar') 
zipimport.ZipImportError: can't find module 'foo.bar' 

अद्यतन 2015/04/11 06:30 बजे PT

निम्नलिखित काम करेगा, लेकिन इस समस्या का वास्तविक समाधान है? zipimport.zipimporter दस्तावेज़ीकरण स्पष्ट रूप से बताता है "पूर्ण नाम पूरी तरह से योग्य (बिंदीदार) मॉड्यूल नाम होना चाहिए।" और इसमें is_package() विधि है जो ठीक से काम करता है।

import os 
import zipimport 

dirname = os.path.dirname(__file__) 
importer = zipimport.zipimporter(os.path.join(dirname, 'foo.zip')) 

def load_module(name): 
    parts = name.split('.') 
    module = importer.load_module(parts[0]) 
    full_name = parts[0] 
    for part in parts[1:]: 
     full_name += '.' + part 
     if not hasattr(module, '__path__'): 
      raise ImportError('%s' % full_name) 
     path = module.__path__[0] 
     module = zipimport.zipimporter(path).load_module(part) 

    return module 

print load_module('foo.bar') 
+0

मुझे लगता है कि आप इसे जानते हैं, लेकिन यदि आप मॉड्यूल ऑब्जेक्ट प्राप्त करने के बजाय ज़िप से आयात करना चाहते हैं, तो पाइथन आपके लिए यह करेगा यदि आप ज़िप फ़ाइल को 'पायथनपथ' में जोड़ते हैं और केवल 'import foo' .bar'। – wrgrs

उत्तर

3

अगर आप importer.load_module('foo/bar') को importer.load_module('foo.bar') बदल यह लोड होगा। मुझे यकीन है कि क्यों, क्योंकि प्रलेखन पढ़ता

load_module (पूरा नाम)

लोड मॉड्यूल पूरा नाम द्वारा निर्दिष्ट नहीं हूँ। पूर्ण नाम पूरी तरह से योग्य (बिंदीदार) मॉड्यूल नाम होना चाहिए। यह आयातित मॉड्यूल देता है, या यदि यह नहीं मिला तो ZipImportError बढ़ाता है।

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