1. 目的:
解决公司内部不允许访问外网直接安装python第三方包尴尬问题。
2. 说明:
在生产中,往往会面对这样的问题,公司的私有网络,处于安全的考虑,不允许内网中的电脑直接访问外部网络,并下载安装包,这样在生产的过程中有大量的时间浪费在了搭建开发环境上,得不偿失。要想干活干的爽,干的快,这个问题还必须得解决,在公司内网中搭建一套和外网一样的环境,可以使用直接使用pip命令来进行python包安装。
3. 搭建过程:
第一步:爬虫得到所需的数据包,一劳永逸的做法就是将所有的安装包全部爬下来:
代码如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :pip_bank
@File :download_pip_packages.py
@Author :Zong xiaobing
@Date :2023/6/13 11:07
'''
import requests
import bs4
import re
import wget
import os
a = requests.get("<https://pypi.tuna.tsinghua.edu.cn/simple>").text
b = bs4.BeautifulSoup(a, "html.parser")
s = b.find_all("a")
count = len(os.listdir("F:/KunLun_AI/pip_bank/whl/")) // 统计当前的下载个数
with open("F:/KunLun_AI/pip_bank/whl/pypi.txt", "w") as f:
for i in range(len(os.listdir("F:/KunLun_AI/pip_bank/whl/")), len(s)):
tree = requests.get("<https://pypi.tuna.tsinghua.edu.cn/simple/>" + s[i].text).text
tree_parser = bs4.BeautifulSoup(tree, "html.parser")
real_name = tree_parser.find_all("a")
// 追加下载,避免从头开始解析
for j in range(len(real_name)):
print(str(count) + " ---->> " + str(real_name[j].text))
count += 1
whlname = real_name[j].text
# 以下载python3.10为例,需要其他的可以自己调整代码
if not os.path.exists("F:/KunLun_AI/pip_bank/whl/" + real_name[j].text):
if (re.findall(r'cp310', whlname) or re.findall(r'none-any', whlname)) and re.findall(r'.*\\.whl', whlname):
# print(real_name[i].text+" URL:<https://pypi.tuna.tsinghua.edu.cn/simple/"+real_name[i].attrs['href']+"\\n>")
f.write(real_name[j].text + " URL:<https://pypi.tuna.tsinghua.edu.cn/simple/>" + real_name[j].attrs['href'] + "\\n")
# print(real_name[j].text)
wget.download("<https://pypi.tuna.tsinghua.edu.cn/simple/s[i].text/>" + real_name[j].attrs['href'],
"F:/KunLun_AI/pip_bank/whl/" + real_name[j].text)
将爬虫获得的所有数据包打包上传到公司内部的服务器,文件比较大,慢慢上传。我上传的地址为/opt/pypi/Packages/
第二步:建立索引
先安装pip2pi用来给python包所在的路径建立索引。
方式1:本地在线安装pip2pi:pip install pip2pi
方式2:离线安装pip2pi:
pip2pi下载地址:<https://pypi.doubanio.com/packages/9d/ad/47acabb00573eb0694fc8f9f1ca12d1d59220d35eb9f4d499ad445a66f17/pip2pi-0.8.1.tar.gz#sha256=135426f29a61d79e65ce27cd8b0eb2d738baeb8a9fb688f7fceb4878af878981>
pip install --no-index --find-links=/home/ pip2pi
查看/usr/local/python3/bin
pip2pi pip2tgz dir2pi
pip2tgz 用来同步官方网站软件包到本地
dir2pi 用来对本地的软件包创建索引
然后命令行切换到下载的 .whl文件夹,建立索引(自动生成了index.html)
dir2pi -S /opt/pypi/Packages/
此处的路径为.whl文件所在的包的位置,我的是/opt/pypi/Packages/
根据自己情况替换。此时文件夹内就出现了一个simple文件夹,这里的内容就和阿里、清华、豆瓣的源差别没那么大了。
第三步:搭建http文件服务器
- 在Ubuntu中通过
apt-get install apache2
安装apache2 CentOS7中通过yum install httpd
安装httpd - apache2的配置文件是
/etc/apache2/apache2.conf
httpd的配置文件是/etc/httpd/conf/httpd.conf
- 配置文件里面的内容大同小异,两者默认的访问端口都是80端口,当然这是可以在配置文件中进行修改的。在配置文件中可以发现,服务器默认的访问路径在
/var/www/html
目录下。只是为了简单实现一台http文件服务器,因此可以在此目录下创建一个软连接来连接文件目录。- 192.168.1.10这个节点作为安装包文件目录是
/opt/pypi/Packages/
,然后通过命令ln -s /opt/pypi/Packages/simple/ simple
在/var/www/html/
目录下创建了一个软连接。
- 192.168.1.10这个节点作为安装包文件目录是
第四步:配置pip源
首先打开浏览器http://你的IP/simple
测试能正常打开后
配置pip源
创建pip的配置文件:mkdir -p ~/.pip/pip.conf
然后:vim ~/.pip/pip.conf 进入配置文件
将以下内容复制到pip.conf文件中保存退出
[global]
timeout = 6000
index-url = http://{yourIP}/simple // 去掉{}
trusted-host = {yourIP} // 去掉{}
使用pip命令安装包,和在外网环境下一模一样,再也不用内外网来回切换下载、上传、安装重复的浪费时间了。生产效率蹭蹭往上提!!!