python - 无法通用导入Python包

标签 python

假设我有以下目录结构:

workspace/
  __init__.py
  ys_manage/
    __init__.py
    manage.py
  ys_utils/
    __init__.py
    project_dicts.py

现在,假设我需要访问 manage.py 中的 project_dicts.py。另外,我的 $PATH 包括 /home/rico/workspace/ys_manage

我需要能够从我机器上的任何目录运行 manage.py 并且仍然能够访问 project_dicts.py

我的$PYTHONPATH只有/home/rico/workspace

如果我在 manage.py 中包含以下内容,我可以从 ~/workspace/ys_manage 运行该文件,但不能在其他任何地方运行。

import sys
sys.path.append('..')
from ys_utils import project_dicts

似乎 '..' 给出了文件运行目录的相对路径,而不是文件所在的目录。这是正确的吗?

我想尝试使用 ys_manage/__init__.py 导入 project_dicts.py 以便它在 manage.py 中可用普遍地。这是个好主意吗?

我从未将 __init__.py 用于“程序包创建者”以外的任何用途。也就是说,我从未将它用于初始化目的。也许我做错了。

ys_manage/__init__.py 的内容:

import sys
sys.path.append('..')
from ys_utils import project_dicts

我是否应该在 manage.py 中包含一些东西来查找这个导入?

当我尝试运行 manage.py 时,出现以下错误:

NameError: global name 'project_dicts' is not defined

作为次要问题,我需要有 workspace/__init__.py 吗?我真的不想拥有它,因为 ys_manageys_utils(以及大约十几个其他包)都在版本控制下并被其他几个开发人员使用...工作区不是。

最佳答案

一般来说,我发现尝试使用相对路径进行导入很危险并且很容易出错。我建议只将工作区放在 PYTHONPATH 上(或以编程方式将其添加到 __init__.py 中)并导入与该静态位置相关的所有内容。它还将使您的代码更易于阅读,因为您将能够更快、更清楚地跟踪导入的来源。

关于python - 无法通用导入Python包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10637458/

相关文章:

python - 如何使用 Paramiko 从 SFTP 服务器下载最新文件?

python - xmlsec1 sign 在命令行上有效,但在 Python 代码上失败

python - Django 内联元素为多对多关系提供错误

python - 在 Python 中使用字典作为集合中的项目

python - 使用 SelectFromModel 和 MultiOutputRegressor 进行多步回归的特征选择。如何获取选定的特征及其特征重要性?

python - 将 for 循环与 .join 一起使用

python - 带整数的 Scipy 微分进化

python - 检查文本文件中是否存在字符串

python - 写入文件以便保留最后 N 行

python - 使用指标列的累计天数