4

我有两个 Python 包,其中一个需要由另一个导入。目录结构如下:

workspace/
  management/
    __init__.py
    handle_management.py
    other_management.py
  utils/
    __init__.py
    utils_dict.py

我正在尝试从文件utils中的项目导入功能handle_management.py

import utils.utils_dict

尝试运行时遇到的错误handle_management.py

ImportError: No module named utils.utils_dict

我已经阅读了很多有关如何解决此问题的信息,但似乎找不到有效的解决方案。

从从相对路径导入模块开始- 我尝试了适用的解决方案,但没有一个奏效。

是唯一workspace/可以通过的解决方案site_packages吗?如果是这样,最好的方法是什么?

编辑:

我试图将 - 添加/home/rico/workspace/PYTHONPATH- 不走运。

编辑2:

我能够成功使用 klobucar 的解决方案,但我认为它不会作为通用解决方案工作,因为该实用程序将被其他几个开发人员使用。我知道我可以使用一些 Python 概括来确定每个用户的相对路径。我只是觉得有一个更优雅的解决方案。

最终,该脚本将通过 cron 运行,以对多个 Python 项目执行单元测试。这也将可供每个开发人员使用,以确保在他们的开发过程中进行集成测试。

我需要能够使这更普遍。

编辑 3:

很抱歉,但对于我想要完成的事情,我真的不喜欢这些解决方案。我很感激您的意见 - 我将它们用作临时修复。作为一个完整的修复,我将考虑在site_packages目录中添加一个可用的脚本,该脚本将添加到PYTHONPATH. 这是多台机器和多个开发人员需要的东西。

一旦我构建了完整的解决方案,我将在此处发布我所做的并将其标记为解决方案。

编辑4:

我觉得好像我没有很好地表达我对这个问题的需求。下面的答案很好地解决了这个问题 - 但不是我的实际需求。结果,我在另一篇文章中重组了我的问题。我考虑过编辑这个,但是下面的答案(这对其他人非常有帮助)对更改没有意义,而且看起来不合适且无关紧要。

对于这个问题的修订版本,请参阅无法普遍导入 Python 包

4

3 回答 3

3

您有 2 个解决方案:

将工作区放在您的 PYTHONPATH 中:

import sys
sys.path.append('/path/to/workspace')

from utils import utils_dict

(请注意,如果您在工作区中运行脚本,即导入句柄管理,很可能工作区已经在您的 PYTHONPATH 中,您不需要这样做,但这里似乎不是这种情况)。

或者,通过在工作空间目录中添加一个空(或不)__init__.py文件来使“工作空间”成为一个包。然后:

from ..utils import utils_dict

我更喜欢第二个,因为如果你的 PYTHONPATH 中有另一个名为“utils”的模块,你会遇到问题

除此之外,您在这里导入错误:import utils.utils_dict.py. 您不需要包含文件“.py”的扩展名。您不是在导入文件,而是在导入模块(或包,如果它是一个文件夹),因此您不需要该文件的路径,您需要它的名称。

于 2012-05-14T16:59:21.533 回答
0

将“workspace/”放在您的 PYTHONPATH 中,以便在搜索时使您可以使用下面的包。

这可以从你的 shell 配置文件中完成(如果你在 *nix 上,或者在 windows 上的环境变量。

例如,在 OSX 上,您可以添加到 ~/.profile (如果工作区在您的主目录中):

export PYTHONPATH=$HOME/workspace:$PYTHONPATH

另一种选择是使用virtualenv使您的项目区域成为自己的包含环境。

于 2012-05-14T16:42:52.720 回答
0

您需要做的是将工作区添加到您的导入路径。我会在工作空间中为你做一个包装器,或者只是将工作空间作为环境变量放在你的 PYTHONPATH 中。

import sys
# Add the workspace folder path to the sys.path list
sys.path.append('/path/to/workspace/')

from workspace.utils import utils_dict
于 2012-05-14T16:46:06.590 回答