2

我使用 python 的贴图编写了一个简单的 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的任何想法?谢谢。

4

3 回答 3

3

尝试以下操作:

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

module1.fcn1()

这将为zipimport您使用。

我认为您可能需要在它的init .py 文件中列出模块的公共部分,看看PEP 273

于 2013-10-12T13:13:33.660 回答
1

你少了一步。如果您的包不在 zip 文件中,您将执行以下操作:

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

OR 的文件内容pkg\__init__.py可能是:

import module1 # __init__.py does it for you.
于 2015-04-23T02:08:07.770 回答
0

当我查看其他已建立的软件包(如 bs4)时,他们的__init__.py文件中包含允许您访问其他模块的代码。例如,类BeautifulSoup__init__.py文件中。如果有人知道如何在不更改原始代码的情况下访问模块,那就太好了。否则,改变__init__.py工作。

于 2013-10-12T13:31:26.017 回答