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