gpt4 book ai didi

python - 如何使用依赖项维护 python 应用程序,包括我自己的自定义库?

转载 作者:可可西里 更新时间:2023-11-01 09:32:45 25 4
gpt4 key购买 nike

我正在使用 Python 开发一些特定于公司的应用程序。有一个自定义共享模块(“库”)来描述一些数据和算法,并且有几十个 Python 脚本与这个库一起工作。这些文件很多,所以它们被组织在子文件夹中

myproject
apps
main_apps
app1.py
app2.py
...
utils
util1.py
util2.py
...
library
__init__.py
submodule1
__init__.py
file1.py
...
submodule2
...

用户希望通过简单地进入 myproject\utils 并启动“py util2.py some_params”来运行这些脚本。这些用户中有许多是开发人员,因此他们经常希望编辑库并立即使用更新的代码重新运行脚本。该项目还使用了一些 3rd 方库,我想确保每个人都使用这些库的相同版本。

现在,我遇到了两个关键问题:
  • 如何从(应用程序)引用(库)?
  • 如何管理第 3 方依赖项?

  • 第一个问题对于许多 Python 开发人员来说非常熟悉,并且在 SO 上被问过很多次:指示 Python 从“....\library”导入包非常困难。我测试了几种不同的方法,但似乎 python 不愿意在任何地方搜索包,而是在标准库位置或脚本本身的文件夹中。
  • 相对导入不起作用,因为脚本不是库的一部分(即使是,这在直接执行脚本时仍然不起作用,除非它被放置在我想避免的“根”项目文件夹中)
  • 将 .pth 文件(从阅读 this document 可能会想到)到脚本文件夹显然没有任何影响

  • 当然直接干预 sys.path 工作,但是每个脚本文件中像这样的样板代码看起来很糟糕
    import sys, os.path
    here = os.path.dirname(os.path.realpath(__file__))
    module_root = os.path.abspath(os.path.join(here, '../..'))
    sys.path.append(python_root)
    import my_library

    我意识到发生这种情况是因为 Python 希望我的库被正确“安装”,这确实是将这个库与使用它的脚本分开开发的唯一正确方法。但不幸的是,情况并非如此,我认为每次更改库时都重新“安装”它会非常不方便并且容易出错。

    第二个问题很简单。有人在我们的 app/lib 中添加了一个新的 3rd 方模块,其他人一旦更新他们的应用程序就会开始看到导入问题。几个开发分支,用户安装 pip 的不同时刻,很少回滚 - 每个人最终都使用不同版本的 3rd 方模块。在我的情况下,由于许多开发人员使用较旧的 Python 2.x 代码进行大量工作而我想继续使用 Python 3.x,因此事情变得更加复杂

    在为我的问题寻找可能的解决方案时,我在 Python 中发现了一个真正出色的虚拟环境功能。事情看起来很光明:
  • 为我的项目创建一个 venv
  • 分发一个Requirements.txt 文件作为应用程序的一部分,并提供一个相应地填充venv 的脚本
  • 将我自己的库符号链接(symbolic link)到 venv site_packages 文件夹,以便 Python 始终检测到它

  • 这个解决方案看起来非常自然和健壮。我明确地为我的项目设置了我自己的环境,并将我需要的任何东西放入这个 venv,包括我自己的库,我仍然可以即时编辑。它确实有效。但是调用 activate.bat 来激活这个 python 环境并调用另一个批处理文件来停用它是一团糟,尤其是在 Windows 平台上。正在编辑 sys.path 的样板代码看起来很糟糕,但至少它不会像这个潜在的修复程序那样干扰 UX。

    所以我想问一个问题。
  • 有没有办法将特定的 python venv 绑定(bind)到特定的文件夹,以便 python 启动器会自动将此 venv 用于这些文件夹中的脚本?
  • 有没有更好的替代方法来处理我错过的这种情况?

  • 我的项目的环境是在 Windows 10 上运行的 Python 3.6。

    最佳答案

    我想我终于找到了一个合理的答案。在venv中添加指向python解释器的shebang行就足够了,例如

    #!../../venv/Scripts/python

    完整的项目结构将如下所示
    myproject
    apps
    main_apps
    app1.py (with shebang)
    app2.py (with shebang)
    ...
    utils
    util1.py (with shebang)
    util2.py (with shebang)
    ...
    library
    __init__.py
    submodule1
    __init__.py
    file1.py
    ...
    submodule2
    ...
    venv
    (python interpreter, 3rd party modules)
    (symlink to library)
    requirements.txt
    init_environment.bat

    事情是这样的:
  • venv 是一个虚拟的 python 环境,包含项目所需的一切
  • init_environment.bat 是一个脚本,它根据 requirements.txt 填充 venv 并将指向我的库的符号链接(symbolic link)放入 venv 站点模块
  • 所有脚本都以指向 venv 解释器的 shebang 行(带有相对路径)开头

  • 有一个完整的自定义环境,包括我自己的所有库和使用它的脚本都将具有非常自然的导入。每当我的项目中的任何面向用户的脚本从控制台或 Windows 资源管理器启动时,Python 启动器也会自动选择 Python 3.6 作为解释器并加载相关模块。

    缺点:
  • 如果从其他文件夹调用脚本,则相对 shebang 将不起作用
  • 用户仍然需要手动运行 init_environment.bat 来根据 requirements.txt 更新虚拟环境
  • Windows 上的 init_environment 脚本需要提升权限才能创建符号链接(symbolic link)(但希望 MS 奇怪的决定将在 17 年 4 月即将发布的 Win10 更新中得到解决)

  • 但是,我可以忍受这些限制。希望这会帮助其他人寻找类似的问题。

    仍然很高兴听到其他选项(作为答案)和批评者(作为评论)。

    关于python - 如何使用依赖项维护 python 应用程序,包括我自己的自定义库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42630253/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com