python - 在 Python 中设置我的应用程序路径的正确方法

标签 python pythonpath python-packaging

我对如何在 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 路径设置不正确。

我想具体问的问题是:

  1. 像这样创建我自己的项目时,我应该在哪里运行我的主要代码?根就像python src/myapp/do_something.py ?或者,转到 src/myapp 目录并运行 python do_something.py
  2. 一旦确定了我应该执行程序的目录,从其他py文件导入模块的正确方法是什么?可以用from src.myapp.do_something_else import do_it吗(这意味着我必须从 src 目录添加路径)?或者,不同的导入方式?
  3. 有哪些方法可以让我的 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/

相关文章:

python - Azure 路径中日期为字符串的正则表达式

python - Mac Swampy(Python学习模块)安装

python-2.7 - PYTHONPATH 在 ubuntu 13.04 中显示为空

python - 为什么Python会选择这个意想不到的模块来导入

python - 来自一个源代码树的多个分布

python - 如何将 setup.py console_script 与 native 命名空间包一起使用

python - 文件处理程序的日志级别与记录器的日志级别

python - 如何从多索引数据框中返回多个级别/组的值?

python - p.stdout.read() 在我的 Python 3 代码中不起作用

python - 使用 PyCharm,为什么运行 Django 项目时的 PYTHONPATH 与运行 manage.pysyncdb 任务时不同?