搭建自己的pip源
https://www.jianshu.com/p/799b3490ad6d
基础环境:
Ananconda 3 版本5.1以上,python3.6环境
外部机器:
pip download bandersnatch
下载了一堆包,安装pip install bandersnatch-3.6.0-py3-none-any.whl
发现又download了三个包,所以这三个包也重新下载了下,放在同一目录下。后续在其他机子上该目录下执行上述命令即可。
发现只能使用官方源下载,具体原因在下面文章中:
http://blog.sina.com.cn/s/blog_82fefc100102y1xx.html
参考了 https://blog.csdn.net/gaisylly/article/details/50910677 原来官网的源是用xml rpc接口获取包信息,三方源不开放这个接口,所以没法玩。
(后面部分转载)
因此,通过修改配置文件中的master源的方法看来是不行了。那就尝试一下能不能在下载环节进行加速,包列表还是向官网获取,下载地址指向国内地址也行,毕竟,同步的大部分时间是花在下载过程中的。
经过对比发现,豆瓣网的pypi源存储地址和官方源的结构是一样的只是域名部分的差别,让从官方下载的包,改为从豆瓣网下载。
试着从bandersnatch源码入手看看能不能解决这个问题。
发现bandersnatch源码的master.py第39行get函数是作用下载文件:
该函数被多个地方调用,因此,复制该函数,再建立一个cn_get函数,修改该函数,替换包下载地址的域名部分,实现从douban下载。修改后的部分源码为:
在package.py的309行附近,修改调用master.get方法为cn_get。(老版本在197行附近,加密方式hashlib.md5())
新版本中代码位置有所调整,以下是新版本中修改:
master.py 中,拷贝get文件为get_aliyun,内容修改为
def get_aliyun(self, path, required_serial, **kw):
logger.debug(f"Getting {path} (serial {required_serial})")
# print('self.url=',self.url, 'path=',path)
aliyun_url = "https://mirrors.aliyun.com/pypi"
if not path.startswith(("https://", "http://")):
path = os.path.join(aliyun_url, path)
else:
idx = path.find('/packages/')
if idx < 0:
raise Exception("Invalid Url!")
path = aliyun_url + path[idx:]
package.py文件中(约375行左右),修改为:
r = self.mirror.master.get_aliyun(url, required_serial=None, stream=True)
开始拉文件了
bandersnatch -c /etc/bandersnatch.conf mirror
除去失败的,居然要850G空间,丧心病狂啊!
===================================
因为阿里云可能与官网实际不同步,有时间差。所以我们这边同步的时候,某些包更新会失败。建议先去 https://developer.aliyun.com/mirror
看看,是否已经同步,已经同步的话,我们就执行同步。
后面就是搭http服务,提供下载服务了。