在安装PyPI中没有的软件包依赖项时的最佳实践

5
我的Python包依赖于一个未在pypi中的私有包。您可以假设私有包的结构类似于这个样例
目标:以任何方式将第三方私有包存储在自己的包中,以便在运行pip install -r requirements.txt(或者更好的是pip install <my_pkg_name>)时安装第三方依赖项。这在Windows和Linux下都必须正常工作。
一个潜在的解决方法:不要安装第三方模块。相反,将它放在主包目录中,并import其模块。
/my_pkg
    /non_pypi_pkg
    /my_pkg
        module.py

module.py 可以在不安装 non_pypi_pkg 的情况下 import non_pypi_pkg

问题:如何实现这个目标的推荐做法?我们有没有比我之前尝试的方法更好的解决方案?


1
不确定上下文,但是可以设置自己的本地pypi镜像,并在那里提供自己的内容。也许可以参考https://dev59.com/RHM_5IYBdhLWcg3ww2Ob。 - Corley Brigman
好的,我已经在过去维护了一个本地的pypi镜像,但是在这种情况下,我想使用一个更简单的解决方案。 - MLguy
无论您选择哪个选项,都需要为私有软件包编写setup.py。然后,设置一个私有PyPI存储库是一种选择,另一种选择是通过 dependency_links 从URL安装,甚至可以直接从VCS安装,同样通过dependency_linkspip也可以处理VCS URL,例如pip install git+https://github.com/user/project@branch - hoefling
1个回答

2
当我使用第三方包时,我经常使用以下其中一种方法之一,使用setuptools
1. 直接在setup.py中指定URL路径进行安装。
具有以下结构:
/my_pkg
├── /my_pkg
│   ├── __init__.py
│   └── module.py
├── setup.py

setup.py

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

当存储库是私有的时候,我使用个人访问令牌(由GitHub提供),在同样的示例中可以使用pkg @ https://<token>@github.com/<user>/pkg/...。然后运行pip install -e my_pkg
2. 从具有多个包的monorepo中工作以强制执行Python分层。具体结构如下:
/
├── my_pkg
│   ├── my_pkg
│   │   ├── __init__.py
│   │   └── module.py
│   └── setup.py
├── non_pypi_pkg
│   ├── non_pypi_pkg
│   │   ├── __init__.py
│   │   └── module_b.py
│   └── setup.py

/non_pypi_pkg/setup.py

setup(
    name="non_pypi_pkg",
    version="0.0.1",
    packages=find_packages(),
    install_requires=[]
)

/my_pkg/setup.py

setup(
    name="my_pkg",
    version="0.0.0",
    packages=find_packages(),
    install_requires=['flask', 'non_pypi_pkg']
)
  • Here it is necessary to install in order of dependence. For example:

     pip install -e non_pypi_pkg; pip install -e my_pkg;
    
我更喜欢使用一个脚本作为这些任务的Makefile,但也可以使用bashpower-shell脚本,如下所示:
#!/bin/bash
libraries=(non_pypi_pkg my_pkg)

for dirname in $(ls); do
    if [ -d "$dirname" ] && [ -e "$dirname/setup.py" ]; then
        pip install -e $dirname
    fi
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接