找出指定包、平台、Python的最合适包版本
找出指定包、平台、Python的最合适包版本

找出指定包、平台、Python的最合适包版本

背景

一切的一切源于那万恶的CV2 not find DLL!!!

找遍千山万水,发现是py版本和opencv版本不匹配导致的

遂花了一些时间,写了如下php

原理:

去pypi找编译后的whl文件,有编译就是官方有适配,逆序取出最大版本号

<?php
require "simple_html_dom.php";
$name = isset($_GET['name']) ? $_GET['name'] : null;				//项目名
$version = isset($_GET['v']) ? $_GET['v'] : null;					//py版本
$machine = isset($_GET['m']) ? $_GET['m'] : null;					//设备名称

if (!$name && !$version && !$machine) {
    $msg="用法:</br>pypi.php?name=opencv-contrib-python&v=38&m=win_amd64</br></br>v为Py版本号</br>例如</br>310 39 38 37 27</br></br>m为设备名</br>例如</br>win32 win_amd64 linux macosx</br></br>成功返回pip命令:</br>例如</br>pip install opencv-contrib-python==4.5.4.60";
} elseif (!$name) {
    $msg="name(模块名)不能为空!";
} elseif (!$version) {
    $msg="v(Py版本号)不能为空!";
} elseif (!$machine) {
    $msg="m(设备名)不能为空!";
} else {
    $msg=check_version($name, $version, $machine);
}
echo $msg;


function check_version($name, $version, $machine)
{
    $html= file_get_html("http://mirrors.aliyun.com/pypi/simple/".$name);
    $rs = $html->find('a');
    for ($i=count($rs)-1; $i > 0; $i--) {
        $t = $rs[$i]->innertext();
        if (stripos($t, "cp".$version) && stripos($t, $machine)) {
            preg_match_all('#-([\d.]+)-cp'.$version.'#', $t, $match);
            if ($match[1][0]) {
                return "pip install ".$name."==".$match[1][0];
            }
        }
    }
    return "pypi上没有找到适合Py".$version."的".$name."版本";
}

具体用法如下

pypi.php?name=opencv-contrib-python&v=38&m=win_amd64

v为Py版本号

python版本v
py3.10.xxx310
py3.9.xxx39
py3.8.xxx38
py3.7.xxx37
py2.7.xxx27

m为设备名

m
win32
win_amd64
linux
macosx

成功返回pip命令:

pip install opencv-contrib-python==4.5.4.60