簡體   English   中英

如何使用Python的zipimport從包訪問模塊?

[英]How do I access a module from a package using Python's zipimport?

我使用python的Paster編寫了一個簡單的Python程序包,其中我的程序包具有目錄結構:

pkg/
    __init__.py
    module1.py
    subpackage/
        __init__.py
        module2.py

init .py文件為空,而module1.py包含一個從module2.py導入內容的函數。 我安裝了該軟件包,並能夠從python提示符下調用module1.py中的函數:

import pkg.module1

我轉到軟件包的安裝位置(/usr/lib/python2.7/dist-packages/pkg/)並壓縮pkg目錄:

zip -r pkg.zip pkg/

我嘗試使用zipimport從python提示符下訪問模塊:

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'

關於如何訪問module1的任何想法? 謝謝。

請嘗試以下操作:

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

module1.fcn1()

這將為您使用zipimport

我認為您可能需要在init .py文件中列出模塊的公共部分,以查看PEP 273

當我查看其他已建立的軟件包(如bs4)時,它們的__init__.py文件具有允許您訪問其他模塊的代碼。 例如,類BeautifulSoup位於__init__.py文件中。 如果有人知道如何在不更改原始代碼的情況下訪問模塊,那就太好了。 否則,更改__init__.py

您錯過了一步。 如果您的軟件包不在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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM