我使用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从 有关如何访问module1的任何想法?感谢。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'
答案 0 :(得分:1)
尝试以下方法:
import sys
sys.path.append('./pkg.zip') # Or path to pkg.zip
import module1
module1.fcn1()
这将为您使用zipimport
。
我认为您可能需要在其 init .py文件中列出模块的公共部分,请查看PEP 273
答案 1 :(得分:0)
当我查看其他已建立的软件包(如bs4)时,他们的__init__.py
文件具有允许您访问其他模块的代码。例如,类BeautifulSoup
位于__init__.py
文件中。如果有人知道如何在不更改原始代码的情况下访问模块,那就太棒了。否则,更改__init__.py
会有效。
答案 2 :(得分:0)
你错过了一步。如果你的包不在zip文件中,你可以这样做:
import pkg
import pkg.module1 # You did not do this.
result = pkg.module1.fnc1()
pkg\__init__.py
的OR文件内容可能改为:
import module1 # __init__.py does it for you.