我的 python 包依赖于一个不在 pypi 中的私有(private)包。可以假设私有(private)包的结构是this .
目标 :以任何方式将第 3 方私有(private)包存储在我自己包中的某个位置,以便在我运行 pip install -r requirements.txt
时(甚至更好的 pip install <my_pkg_name>
),安装了第 3 方依赖项。这必须在 Windows 和 Linux 中工作。
一个潜在的解决方法 : 不要安装第 3 方模块。相反,把它放在你的主包目录中,import
它的模块。
/my_pkg
/non_pypi_pkg
/my_pkg
module.py
在哪里
module.py
能够import non_pypi_pkg
不安装 non_pypi_pkg
.问题 :实现目标的推荐做法是什么?我们能比我的解决方法做得更好吗?
最佳答案
当我与 合作时第三方包 , 我经常使用下面的方法之一使用 setuptools
.
1.安装直接在setup.py
中指明URL路径.
具有以下结构:
/my_pkg
├── /my_pkg
│ ├── __init__.py
│ └── module.py
├── setup.py
安装程序.pysetup(
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',
]
)
When the repository is private I use a personal access token (by github), in the same example could be
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.pysetup(
name="non_pypi_pkg",
version="0.0.1",
packages=find_packages(),
install_requires=[]
)
/my_pkg/setup.pysetup(
name="my_pkg",
version="0.0.0",
packages=find_packages(),
install_requires=['flask', 'non_pypi_pkg']
)
pip install -e non_pypi_pkg; pip install -e my_pkg;
I prefer to use a script as a
Makefile
for these tasks but is possible too with abash
orpower-shell
script like as next:
#!/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
关于python - 安装包依赖项的最佳实践在 pypi 中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49515001/