避免导入“sys.path.append(..)”

Nai*_*ain 10 python python-import importerror python-3.x

这不是我第一次imports对 Python 感到畏缩。但我想这是一个有趣的用例,所以我想在这里询问它以获得更好的见解。我的项目结构如下:

sample_project
   - src
        - __init__.py
        - module1
           - __init__.py
           -  utils.py
        - module2
           - __init__.py 
           - models.py
        - app.py
Run Code Online (Sandbox Code Playgroud)

module1从所有其他导入方法和module2app所有其他导入方法。另外,当您运行时,app它需要创建一个名为“文件夹logs外部”的文件夹src。现在有以下几种方法可以运行该应用程序:

  1. 从内部src文件夹flask run app
  2. src文件夹外部flask run src.app

为了确保我不会import errors因为启动应用程序的顶级模块的更改而出现这种情况,我这样做:

import sys
sys.path.append("..")
Run Code Online (Sandbox Code Playgroud)

对于这个问题有更好的解决办法吗?

Pet*_*ter 14

导入问题的pythonic 解决方案不要将 sys.path(或间接 PYTHONPATH)hack添加到任何可能充当顶级脚本(包括单元测试)的文件,因为这使得您的代码库难以更改并维护。假设您必须重新组织项目结构或重命名文件夹。

相反,这就是editable installs我们的目的。它们可以通过两种方式实现:

  1. pip install --editable <path>(需要基本的 setup.py)
  2. conda 开发<path>(需要conda-build包)

无论哪种方式都会将符号链接添加到您的站点包文件夹中,并使您的本地项目表现得就像已完全安装一样,同时您可以继续编辑。

永远记住:让事情易于改变


Len*_*mju 0

查看Python 导入系统文档PYTHONPATH 环境变量

当您的代码执行此操作时import X.Y,Python 运行时会在您列出的每个文件夹中查找PYTHONPATH包含包的包X(包只是包含文件的文件夹__init__.pyY

大多数时候,附加到sys.path是一个糟糕的解决方案。最好注意你的 PYTHONPATH 设置:检查它是否包含你的目录(其中包含你的顶级包)并且没有其他内容(除了site-packagesi 之外)。然后,无论您在哪里运行命令,它都会以相同的方式工作(至少对于导入来说,这os.cwd是另一个问题)。

根据运行 Python 脚本的方式,.可能是其中唯一相关的路径,因此它取决于您当前的目录,..如果您从顶级包之一运行它,则需要附加。

也许您不应该从不是项目根目录的目录运行脚本?

TL;DR:一个好的PYTHONPATH方法可以减少导入错误。


归档时间:

查看次数:

17006 次

最近记录:

3 年,10 月 前