如何从同级目录导入python模块?

2024-04-23 15:45:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python(3.6.3)项目,它具有以下结构

setup.py
utils #python package
utils/constants.py
utils/name_reports.py
normalization #python package
normalization/resolve_name.py
categorization #python package
categorization/animal_categories.py

您可以在github-https://github.com/techmango-org/python-import-resolution上找到源代码

以下是utils/name_reports.py的源代码

^{pr2}$

当我运行python utils/name_reports.py时,我得到了以下异常

Traceback (most recent call last):
  File "utils/name_reports.py", line 1, in <module>
    import normalization.resolve_name as rn
ModuleNotFoundError: No module named 'normalization'

我试图通过运行pip install .将当前包安装到virtual env站点包中来解决这个问题,但这意味着对于每一个本地更改,我都必须运行pip install --upgrade .来将本地更改移动到站点包中。在

我一直在使用黑客来解决这个问题。检查这个屏幕截图

enter image description here

但我不明白这会产生什么不同。以下是确切的问题-

  1. 在这种情况下如何解决python导入问题?在
  2. 有没有更好的方法来构造python代码,这样我们就不会面对相对导入的问题了?在
  3. -m unittest在解决这个问题上有什么不同?在

Tags: installpipnamepyimportgithubpackage源代码
2条回答

使用导入语句:

from normalization import resolve_name
from categorization import animal_categories

您的代码:

^{pr2}$

既然已经有很多关于这个*的答案,我将集中讨论问题(2)。关于什么是更好的代码组织:

|- setup.py
|- top_pkg_name
    |- __init__.py
    |- pkg1
        |- __init__.py
    |- pkg2
        |- __init__.py

module_2内部执行(相对)导入:

^{pr2}$

或者,可以使用绝对名称来引用包:

from top_pkg_name.pkg1 import module1 as m1

在这样的组织中,当您想将任何模块作为脚本运行时,必须使用-m标志:

python -m top_pkg_name.pkg1.module1

对于问题(3),我不确定,但看起来unittest模块将文件夹添加到path,允许直接导入。在

*参考:

  1. How do I import a Python script from a sibling directory?
  2. Python import module from sibling folder

相关问题 更多 >