【问题标题】:Is adding project root directory to sys.path a good practice?将项目根目录添加到 sys.path 是一个好习惯吗?
【发布时间】:2018-07-03 04:33:39
【问题描述】:

我有一个关于将项目路径添加到 python 的问题,以促进import 的工作。

情况

当我在 Python 中编写代码时,我通常使用

添加必要的路径到sys.path
import sys
sys.path.append("/path/to/dir/") # almost every `.py` need this

有时,当我的项目变得更大,包含许多级别的目录时,这种方法看起来很庞大且容易出错(尤其是当我重新组织我的文件时)

最近,我开始使用 bash 脚本(位于项目根目录),将带有项目根参数的 sys.path.append 添加到项目中的 .py 文件中。使用这种方法,我几乎不必手动关心导入模块。

问题

我的问题是:这是一个好习惯吗?与我的旧方法相比,我发现它对自己来说很方便,但由于 bash 脚本是一个单独的文件,我需要 2 个命令来运行我的项目中的任何脚本(一个用于 bash,一个用于 .py)。我可以在 bash 中包含调用 .py 的命令,但它远不如直接从终端调用它灵活。

真的很想听听一些建议!提前致谢。任何建议将不胜感激!

【问题讨论】:

  • 这通常不是好的做法。一般不需要,因为脚本的路径已经自动添加到sys.path。但同时,对于分发/部署,您几乎总是希望创建一个带有setuptoolspip install-able 包、一个可分发的virtualenv、一个通过PyInstaller/等的安装程序包、一个预装了您的应用程序的Docker 映像,或者别的东西,而对于本地开发,如果你不想安装--inplace,你可能想要一个设置路径的virtualenv。
  • 另外,您通常不应该将脚本分散在整个项目中——绝对不是在包中,但通常即使它们不是。如果您需要大量脚本,您应该考虑创建-m-runnable 模块或setuptools-生成的入口点脚本。
  • 感谢您的回答。看来你误解了我的问题。我要问的不是将多个不同的sys.path.append 添加到不同的.py,而是将 project root 添加到sys.path 到几乎每个.py 并导入与添加的模块相对应的模块项目根目录。请注意,我不熟悉分发/部署包,所以也许我是在这里误解的人:D
  • 如果几乎​​每个.py 文件都需要这个,那么你可能做错了什么。 (可能是非常错误,比如将脚本放在包的中间,但可能不是。)最好的答案通常是重新安排你的项目,这样你就不需要了。这并非总是正确,但如果没有任何细节,就不可能知道您是否面临该一般规则的例外情况。

标签: python bash coding-style


【解决方案1】:

在 python 库或程序中使用操作 sys.path 通常不是一个好习惯。您应该在python程序的调用环境中将相关路径添加到PYTHONPATH

PYTHONPATH="/path/to/other/projects/directory:$PYTHONPATH" python ...

export PYTHONPATH="/path/to/other/projects/directory:$PYTHONPATH"
python ...

这使您可以轻松地操作您的程序或库将搜索依赖项的路径,而无需修改您的代码。

在您的个人开发环境中通过修改您的bashrc 或在您的init 脚本(或其他包装脚本)中的生产环境中进行管理也很容易,并且每次您都可以在一个地方进行更新添加或修改您的项目路径。

鉴于您提到每个.py 文件几乎都有一个目录,您还应该考虑如何将您的代码组织到packages 中以进一步简化您的设置。

【讨论】:

  • 实际上,我上面提到的bash 方式是(某种)init 脚本。我通常在调用python 进程之前使用exportsource bashrc(我正在通过与服务器的ssh 连接进行开发,不能如我所愿关闭)。到了这个时候,虽然每个人都说这不是好的做法(我确实有这种感觉,不知道为什么,所以我在这里提出来澄清一下),但我仍然看不到对我的项目有任何不良影响。虽然,由于我没有提到bashrc,这实际上是一种非常简单有效的方法,但您的回答值得接受:D 非常感谢
【解决方案2】:

这不是一个特别好的做法,尽管您可以侥幸逃脱。最好研究 virtualenv(或 pipenv)以获得更顺畅的工作流程。

【讨论】:

  • 我的每个项目都使用 virtualenv,我的意思不是 import 一个 pypi 包,而是我自己的来自其他目录(但同一个项目)的包。
  • 无论你是使用 pypi 的包,还是你自己的包,都是一样的。正确安装它们(如果它们不是软件包,它们应该是!)。
猜你喜欢
  • 1970-01-01
  • 2013-04-13
  • 2021-04-22
  • 1970-01-01
  • 2016-01-03
  • 2015-12-18
  • 2021-10-26
  • 2014-12-22
相关资源
最近更新 更多