【问题标题】:Python package import issuePython包导入问题
【发布时间】:2012-11-02 19:08:08
【问题描述】:

我一直在为 Python 包导入而苦恼。我搜索了网络,但找不到合适的答案。

我的目录结构如下:

.
./__init__.py
./packages/
./packages/__init__.py
./packages/package
./packages/package/__init__.py
./packages/package/module.py

module.py 源码只包含一行:

import package

如果我进入“packages”目录,我可以导入包:

>>> import python
>>>

如果我转到“。”目录,我想导入模块(或包)如下:

>>> import packages.package.module as module

但我得到了错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "vendor/package/module.py", line 1, in <module>
    import package
ImportError: No module named package

我需要在 __init__.py 文件中放入什么,才能进行上述导入? 另外,我需要在 ./__init__.py 文件中放入什么,这样我才能从 ../ 目录导入我的项目?

如果可能的话,我想在不改变 sys.path 变量的情况下解决这个问题。

【问题讨论】:

  • 你先运行什么文件?谁开始整个过程​​?
  • from packages.package import module
  • @alexvassel,我从“。”开始这个过程目录,这是我的项目的根文件夹。基本上,我从“.”运行“python project.py”。
  • @ragsagar,这显然行不通。

标签: python python-import python-packaging


【解决方案1】:

为了使 module.py 中的 import package 成功,python 包 package 必须是可发现的。这意味着它必须在PYTHONPATH 上。默认情况下,此路径包括site-packages(使用easy_installpip 放置python 包的目录)。此外,PYTHONPATH 还包括当前工作目录。

如果您在. 中,那么. 将放置在您的 PYTHONPATH 的开头。此目录包含名为package 的python 包,因此import package 失败。

您可以在启动 python 解释器之前移至./packages,也可以安装您的包。要执行后者,您需要一个 setup.py

【讨论】:

  • 所以我无法通过编辑 _init_.py 文件来解决这个问题?
  • 你可以在 packages/__init__.py 中操作 sys.path 来添加 /packages 目录
  • sys.path.insert 是我现在正在使用的解决方案,但我对它并不满意。
  • 你真正想要达到什么目的?您能否举例说明为什么要从其中的模块导入父包?你熟悉使用 setuptools 安装 python 包吗?
【解决方案2】:

当从 .所有导入都必须相对于该目录。对于您的 module.py 文件,这意味着您必须这样做

import packages.package

而不是

import package

这是因为 python 会使用 .作为您在程序中执行的所有导入的基础。如果没有很多魔法,就不可能从父目录导入一些东西,所以你必须像上面那样做一个绝对导入。

【讨论】:

  • 它工作了,但有没有可能在不修改包模块的情况下做到这一点?
  • 我认为这并不容易。但无论如何都不应该,因为您指的是子模块中的父级,这可能被认为是糟糕的设计,因为模块应该尽可能地自包含。尽管如此,它当然会发生,但仅在自包含项目中,在这种情况下,无论如何您将始终从同一个文件启动它。
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 2021-02-06
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多