我有两个 Python 包,其中一个需要由另一个导入。目录结构如下:
workspace/
management/
__init__.py
handle_management.py
other_management.py
utils/
__init__.py
utils_dict.py
我正在尝试从 handle_management.py 文件中的 utils 项目导入功能:
import utils.utils_dict
尝试运行 handle_management.py 时出现错误:
ImportError: No module named utils.utils_dict
我已经阅读了很多关于如何解决这个问题的资料,但我似乎找不到有效的解决方案。
我从 Import a module from a relative path 开始- 我尝试了适用的解决方案,但没有一个奏效。
是通过 site_packages 使 workspace/ 可用的唯一解决方案吗?如果是这样,最好的方法是什么?
编辑:
我尝试将 /home/rico/workspace/ 添加到 PYTHONPATH - 没有成功。
编辑 2:
我能够成功使用 klobucar 的解决方案,但我认为它不会作为通用解决方案工作,因为该实用程序将被其他几个开发人员使用。我知道我可以使用一些 Python 概括来确定每个用户的相对路径。我只是觉得有一个更优雅的解决方案。
最终,该脚本将通过 cron 运行,以对多个 Python 项目执行单元测试。这也将提供给每个开发人员,以确保在他们的开发过程中进行集成测试。
我需要能够使它更通用。
编辑 3:
抱歉,我不太喜欢这些解决方案中的任何一个来实现我想要完成的目标。我感谢您的意见 - 我将它们用作临时修复。作为一个完整的解决方案,我将研究添加一个位于 site_packages 目录中的可用脚本,该脚本将添加到 PYTHONPATH。这是跨多台机器和多位开发人员所需要的东西。
一旦我构建了完整的解决方案,我将在此处发布我所做的并将其标记为解决方案。
编辑 4:
这个问题我感觉好像没表达好我的需求。下面的答案很好地解决了这个问题——但不是我的实际需要。因此,我在另一篇文章中重组了我的问题。我考虑过编辑这个,但下面的答案(这对其他人非常有帮助)对更改没有意义,而且看起来不合适且无关紧要。
有关此问题的修订版本,请参阅 Unable to import Python package universally
请您参考如下方法:
您有 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”的扩展名。您不是在导入文件,而是在导入模块(如果是文件夹,则为包),因此您不需要该文件的路径,您需要它姓名。
