【问题标题】:How do I access a module from a package using Python's zipimport?如何使用 Python 的 zipimport 从包中访问模块?
【发布时间】:2013-10-20 11:13:03
【问题描述】:

我用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 的任何想法?谢谢。

【问题讨论】:

  • 为什么这被否决了?
  • 如果您拨打dir(pkg) 可能会有所帮助,您会得到什么?
  • 我得到:['builtins', 'doc', 'file', 'name ', '', '路径']

标签: python python-2.7 package


【解决方案1】:

你少了一个步骤。如果您的包不在 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.

【讨论】:

  • 我在 osx 尝试 zip 导入并使用 Python 3.6.5;我认为您的意思是客户端代码必须先手动按文件名导入 zip
【解决方案2】:

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

【讨论】:

  • beautifulsoup4-4.4.1.zip/bs4 文件夹 - 模块将被导入:bs4_importer = zipimporter('beautifulsoup4-4.4.1.zip') bs4 = bs4_importer.load_module('bs4')
【解决方案3】:

尝试以下方法:

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

module1.fcn1()

这将为您使用zipimport

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

【讨论】:

  • 当我尝试导入模块 1 时,我收到错误:回溯(最后一次调用):文件“”,第 1 行,在 中 ImportError:没有名为 module1 的模块。有任何想法吗?如果没有,感谢您的尝试。
  • @user1910316 如果上面的 Steve Barnes 代码 sn-p 位于 main.py 中,那么 pkg.zip 需要与 main.py 位于同一目录中。它可能不起作用,因为 pkg.zip 不在同一目录中。一次使用 cmets 的 zip 文件也不起作用。还要检查您的 zip 文件并确保它不是 'pkg.zip\pkg_init_.py' 而不仅仅是 pkg.zip\__init__.py。还要确保 PYTHONPATH 中没有 pkg​​.zip 实际上不是 Python 包。
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 2018-08-01
  • 2014-12-12
  • 1970-01-01
  • 2019-05-29
  • 2021-10-14
相关资源
最近更新 更多