2013-10-12 56 views
1

我使用Python的貼紙,當我的包具有目錄結構寫了一個簡單的Python包。我安裝包,我能夠調用module1.py函數從Python提示:如何使用Python的zipimport從包中訪問模塊?</p> <pre><code>pkg/ __init__.py module1.py subpackage/ __init__.py module2.py </code></pre> <p>的<strong>初始化</strong> .py文件是空白,module1.py包含進口的東西從module2.py功能:

import pkg.module1 

我去安裝了包凡(/usr/lib/python2.7/dist-packages/包裝/)和郵編PKG目錄:

zip -r pkg.zip pkg/ 

我試圖從Python提示符訪問模塊使用的zipimport:

import zipimport 
importer = zipimport.zipimporter('pkg.zip') 
importer.find_module('pkg') 
# <zipimporter object "pkg.zip"> 
importer.load_module('pkg') 
# <module 'pkg' from 'pkg.zip/pkg/__init__.pyc'> 
importer.is_package('pkg') 
# True 
pkg = importer.load_module('pkg') 
# trying to call a function in module 1 called fcn1 
pkg.module1.fcn1() 
#Traceback (most recent call last): 
#File "<stdin>", line 1, in <module> 
#AttributeError: 'module' object has no attribute 'module1' 
pkg.module1 
#Traceback (most recent call last): 
#File "<stdin>", line 1, in <module> 
#AttributeError: 'module' object has no attribute 'module1' 

關於如何訪問模塊1任何想法?謝謝。

+0

爲什麼這個downvoted? –

+0

如果你打電話給'dir(pkg)'可能會有幫助,你會得到什麼? –

+0

我得到:['__builtins__','__doc__','__file__','__name__','__package__','__path__'] – user1910316

回答

0

當我看着像BS4等地建立了包,他們__init__.py文件有代碼允許你訪問其他模塊。例如,類BeautifulSoup位於__init__.py文件中。如果有人知道如何在不改變原始代碼的情況下訪問模塊,那就太好了。否則,更改__init__.py的作品。

+0

beautifulsoup4-4.4.1.zip/bs4文件夾 - 模塊將被導入: 'bs4_importer = zipimporter('beautifulsoup4-4.4.1.zip') bs4 = bs4_importer.load_module('bs4')' –

1

嘗試以下操作:

import sys 
sys.path.append('./pkg.zip') # Or path to pkg.zip 
import module1 

module1.fcn1() 

這將使用zipimport爲您服務。

我認爲你可能需要列出你的模塊的公共部分,在它的初始化 .py文件看看PEP 273

+0

當我嘗試導入module1時出現錯誤:Traceback(最近調用最後一次): 文件「」,第1行,在 ImportError:沒有名爲module1的模塊。有任何想法嗎?如果沒有,謝謝你的嘗試。 – user1910316

+0

@ user1910316如果上面的Steve Barnes代碼片段在main.py中,那麼pkg.zip需要與main.py所在的目錄位於同一目錄中。它可能不起作用,因爲pkg.zip不在同一個目錄中。同時壓縮包含評論的文件也不起作用。同時檢查你的zip文件,確保它不是'pkg.zip \ pkg \ __ init__.py',而不是'pkg.zip \ __ init __。py'。另外請確保您的PYTHONPATH中沒有pkg.zip,這實際上並不是一個Python包。 – DevPlayer

0

您錯過了一個步驟。如果你的包在一個zip文件是不是,你會怎麼做:

import pkg 
import pkg.module1 # You did not do this. 
result = pkg.module1.fnc1() 

或文件的內容pkg\__init__.py可改爲:

import module1 # __init__.py does it for you.