ImportError - 在同一级别使用Python包

时间:2012-05-14 16:38:17

标签: python

我有两个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

我已经阅读了很多关于如何解决这个问题的文章,但我似乎无法找到有效的解决方案。

我从Import a module from a relative path开始 - 我尝试了适用的解决方案但没有效果。

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

编辑:

我尝试将/home/rico/workspace/添加到PYTHONPATH - 没有运气。

编辑2:

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

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

我需要能够使这更加通用。

编辑3:

对不起,但我真的不喜欢这些解决方案,因为我正在努力实现这一目标。我很欣赏这些输入 - 我正在使用它们作为临时修复。作为一个完整的修复,我将考虑在site_packages目录中添加一个可添加到PYTHONPATH的脚本。这是几台机器和几个开发人员需要的东西。

一旦我构建完整的解决方案,我将在此回复我所做的事情,并将其标记为解决方案。

编辑4:

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

有关此问题的修订版,请参阅Unable to import Python package universally

3 个答案:

答案 0 :(得分:1)

你有2个解决方案:

将工作区放在PYTHONPATH中:

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

from utils import utils_dict

(注意,如果你在工作区内运行一个脚本,那就是导入handle_management,很可能工作区已经在你的PYTHONPATH中了,你不需要这样做,但似乎不是这里的情况)。

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

from ..utils import utils_dict

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

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

答案 1 :(得分:0)

将“workspace /”放入PYTHONPATH中,以便在搜索时为您提供下面的包。

这可以从您的shell配置文件中完成(如果您使用的是* nix,或者是Windows上的环境变量。

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

export PYTHONPATH=$HOME/workspace:$PYTHONPATH

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

答案 2 :(得分: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