如何在Python中正确设置导入?

unftdfkk  于 2022-12-30  发布在  Python
关注(0)|答案(1)|浏览(124)

我的python项目有以下目录结构。

.
├── AUTHORS.rst
├── CONTRIBUTING.rst
├── HISTORY.rst
├── MANIFEST.in
├── Makefile
├── README.rst
├── __pycache__
│   └── test.cpython-310.pyc
├── docs
├── logs
├── python_server_copy
│   ├── __init__.py
│   ├── cli.py
│   ├── copy.py
│   ├── python_server_copy.py
│   ├── test.py
│   └── utils.py
├── requirements_dev.txt
├── setup.cfg
├── setup.py
├── tests
└── tox.ini

这是一个基于click的命令行应用程序。我在文件中定义了包名的导入。例如:
copy.py中:

from python_server_copy.utils import get_project_root

然而,这些导入不工作时,我正在测试。我得到ModuleNotFound错误时,运行文件作为一个脚本直接。我必须删除python_server_copy包名,每次我正在测试。一切工作正常,如果它是作为命令行点击应用程序运行。
我需要如何正确测试和处理进口的建议. TIA
我使用python 3.7.11,如果有用的话。

mlnl4t2r

mlnl4t2r1#

当你在Python中运行一个脚本时,它的目录会被添加到sys.path(Python在这里查找模块/包)。现在当你直接运行你的copy.py时,Parents.../python_server_copy被添加,加上一些站点包的默认路径等等。
因此,* Parents.../python_server_copy目录(或任何其他路径)中没有python_server_copy模块/包 *。
相反,您需要添加“its”父目录,它恰好是您项目的根目录,这样它就可以找到您的python_server_copy包。
您有几个选择:

import sys
sys.path.insert(0, <Path to root>)

或者直接导入utils,因为它已经可以找到了:

from utils import get_project_root

最后,由于您只是在进行测试,请使用PYTHONPATH环境变量运行脚本:

PYTHONPATH="abs-path-to-root" python copy.py

相关问题