我的python包取决于不在pypi中的私有包。您可以假设私有包的结构是this。
目标:将第三方私有软件包存储在我自己的软件包中的某个位置,以便当我运行pip install -r requirements.txt
(或更好pip install <my_pkg_name>
)时,第3个已安装派对依赖项。这必须适用于Windows和Linux。
潜在的解决方法:不要安装第三方模块。而是将其放在主包目录中,并将其import
放在其模块中。
/my_pkg
/non_pypi_pkg
/my_pkg
module.py
module.py
无需安装import non_pypi_pkg
就可以non_pypi_pkg
。
问题:实现目标的建议做法是什么?我们能比我的解决方案做得更好吗?
答案 0 :(得分:0)
使用第三方软件包时,我经常使用以下一种方法使用setuptools
。
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',
]
)
当存储库为私有存储库时,我使用个人访问令牌(by github),在同一示例中,可以为
pkg @ https://<token>@github.com/<user>/pkg/...
pip install -e my_pkg
具有以下结构:
/
├── 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']
)
在这里有必要按依赖顺序安装。例如:
pip install -e non_pypi_pkg; pip install -e my_pkg;
我更喜欢使用脚本作为
Makefile
来完成这些任务,但也可以使用bash
或power-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