不确定我是不是应该使用相对导入或将父目录添加到 sys.path [重复]

Posted

技术标签:

【中文标题】不确定我是不是应该使用相对导入或将父目录添加到 sys.path [重复]【英文标题】:Not sure if I should use relative imports or add parent dir to sys.path [duplicate]不确定我是否应该使用相对导入或将父目录添加到 sys.path [重复] 【发布时间】:2016-08-18 02:52:28 【问题描述】:

我有一个具有以下层次结构的包

my_package/__init__.py
           script_a.py
           scripts_dir/__init__.py
                       script_b.py
           my_package/__init__.py
                      module_a.py
                      module_b.py

module_a 和 module_b 包含我在 script_a 和 script_b 中使用的函数和类定义(它们是独立的脚本并包含一个 main)

当我从 script_a.py 中的 module_a.py 导入一些东西时,一切都很好。

我的问题是

我不知道如何使用相对导入将某些内容从 module_a 或 module_b 导入 script_b.py

我不确定是否应该使用相对导入,或者将 my_package 添加到 sys.path 然后使用类似的东西是否更有意义 from my_package.module_a import the_funky_func

我想避免使用 -m 参数调用解释器

更新

从到目前为止我在 SO 中找到的答案中,我得出的结论是我有 3 个选项

编写设置以将包包含到我的 PYTHONPATH 中,以便所有脚本(无论它们在哪里)都可以调用模块

调用解释器时使用-m参数

做一些 sys.path hack

还有其他我不知道的选项吗?

【问题讨论】:

对于最后一部分,您可以查看我的解决方案:how-to-use-relative-import-without-doing-python-m 【参考方案1】:
myproject/
        |--package1
              |--\__init__.py
              |--script_a.py
              |--script_b.py
        |--package2
              |--module_a.py
              |--module_b.py

您可以使用以下 2 行将 myproject 路径附加到 sys 路径。可以避免相对导入,避免命令行中的-m

import sys
import sys.path.append("/absolute/path/to/your/myproject")

myproject 文件script_a.py 中,如果你导入module_a.py 它看起来像

import sys
import sys.path.append("/absolute/path/to/your/myproject")
import package2.module_a as ma

【讨论】:

你会建议将包路径添加到 PYTHONPATH 吗? 是的。范围是项目本身,而不是整个系统

以上是关于不确定我是不是应该使用相对导入或将父目录添加到 sys.path [重复]的主要内容,如果未能解决你的问题,请参考以下文章

导入 JavaScript 时如何在 QML 中使用绝对路径?

将父分支合并到子分支

使用 JSONModel 将父值映射到嵌套字典中的属性

DBI dbWriteTable

尝试相对导入超出***包 python

如何一次隐藏多个视图?