我对如何在 Python (Python 3.x) 中正确创建路径有疑问。
我使用以下目录结构用 Python 开发了一个小型抓取应用程序。
root
├── Dockerfile
├── README.md
├── tox.ini
├── src
│ └── myapp
│ ├── __init__.py
│ ├── do_something.py
│ └── do_something_else.py
└── tests
├── __init__.py
├── test_do_something.py
└── test_do_something_else.py
当我想运行我的代码时,我可以转到 src 目录并使用
python do_something.py
但是,因为 do_something.py 有一个来自 do_something_else.py 的导入语句,所以它失败了:
Traceback (most recent call last):
File "src/myapp/do_something.py", line 1, in <module>
from src.myapp.do_something_else import do_it
ModuleNotFoundError: No module named 'src'
所以,我最终决定使用下面的命令来指定python路径:
PYTHONPATH=../../ python do_something.py
以确保看到该路径。
但是,提供路径以便我的应用程序可以运行的更好方法是什么?
我想知道这一点,因为当我通过 tox 运行 pytest 时,我将运行命令 tox
的目录将位于根目录,以便 tox 包可以看到 tox.ini。如果我这样做,那么我很可能会遇到类似的问题,因为 Python 路径设置不正确。
我想具体问的问题是:
- 像这样创建我自己的项目时,我应该在哪里运行我的主要代码?根就像
python src/myapp/do_something.py
?或者,转到 src/myapp 目录并运行python do_something.py
? - 一旦确定了我应该执行程序的目录,从其他py文件导入模块的正确方法是什么?可以用
from src.myapp.do_something_else import do_it
吗(这意味着我必须从 src 目录添加路径)?或者,不同的导入方式? 有哪些方法可以让我的 Python 识别路径?我知道有几种方法可以访问通行证,如下所示:
一个。写
export PYTHONPATH=<path_of_my_choice>:$PYTHONPATH
使 临时访问的路径,或者在我的 .bashrc 中写入该行以使其永久化(但是当我想通过 ansible 或其他自动化工具自动创建 Python 环境时很难重现)写
import sys; sys.path.append(<root>)
将根作为可访问路径使用 pytest-pythonpath 包(但这并不是一个通用的答案)
非常感谢您的意见!
我的环境
OS: MacOS and Amazon Linux 2
Python Version: 3.7
Dependency in Python: pytest, tox
最佳答案
我建议使用 setup.py
将它变成一个 python 包。然后你可以在开发模式下安装它python setup.py develop
。这样,它将在您的 python 环境中可用,而无需指定 PYTHONPATH。
为了测试,您可以简单地安装包 python setup.py install
。
希望对您有所帮助。
关于python - 在 Python 中设置我的应用程序路径的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60239891/