安装pypi中不可用的包依赖项的最佳实践

MLg*_*guy 5 python pip requirements.txt python-packaging

我的 python 包依赖于不在 pypi 中的私有包。你可以假设私有包的结构是这样的

目标:以任何方式将 3rd 方私有包存储在我自己的包中的某个位置,以便在我运行时pip install -r requirements.txt(甚至更好pip install <my_pkg_name>)安装 3rd 方依赖项。这必须适用于 Windows 和 Linux。

一个潜在的解决方法:不要安装第 3 方模块。相反,将其按原样放置在主包目录import及其模块中。

/my_pkg
    /non_pypi_pkg
    /my_pkg
        module.py
Run Code Online (Sandbox Code Playgroud)

哪里module.py可以import non_pypi_pkg不用安装non_pypi_pkg

问题:实现目标的推荐做法是什么?我们可以做得比我的解决方法更好吗?

Hen*_*ios 2

当我使用第三方包时,我经常使用以下方法之一setuptools

\n

1. 直接安装,指定URL路径setup.py

\n

具有以下结构:

\n
/my_pkg\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 /my_pkg\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n

安装程序.py

\n
setup(\n    name="my_pkg",\n    version="0.0.0",\n    packages=find_packages(),\n    install_requires=[\'flask\', \n        \'non_pypi_pkg @ https://github.com/<user>/non_pypi_pkg/archive/main.zip#egg=non_pypi_pkg-0.0.1\',\n        ]\n)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

当存储库是私有的时,我使用个人访问令牌由 github 提供),在同一个示例中可以是pkg @ https://<token>@github.com/<user>/pkg/...

\n
\n
    \n
  • 然后pip install -e my_pkg
  • \n
\n

2. 使用具有多个包的 monorepo 来强制执行 python 分离层。

\n

具有以下结构:

\n
/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_pkg\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_pkg\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 non_pypi_pkg\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 non_pypi_pkg\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module_b.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n

/non_pypi_pkg/setup.py

\n
setup(\n    name="non_pypi_pkg",\n    version="0.0.1",\n    packages=find_packages(),\n    install_requires=[]\n)\n
Run Code Online (Sandbox Code Playgroud)\n

/my_pkg/setup.py

\n
setup(\n    name="my_pkg",\n    version="0.0.0",\n    packages=find_packages(),\n    install_requires=[\'flask\', \'non_pypi_pkg\']\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

我更喜欢使用脚本来Makefile完成这些任务,但也可以使用 abashpower-shell脚本,如下所示:

\n
\n
 pip install -e non_pypi_pkg; pip install -e my_pkg;\n
Run Code Online (Sandbox Code Playgroud)\n