有没有一种快速下载所有可用的Python软件包的方法?

12 浏览
0 Comments

有没有一种快速下载所有可用的Python软件包的方法?

因为我的机器无法访问互联网,所以我需要尽可能多地下载Python包。目前,我已经下载了常用的包,如pandas、matplotlib、numpy、xlrd、xlwt等。我担心以后可能还需要其他包。有没有一种快速安装尽可能多包的方法呢?

我正在使用已经预装了一些包的PyCharm和Anaconda。我下载包的方式是进入设置/项目/Python解释器,然后点击加号。

0
0 Comments

有没有一种快速的方法来下载所有可用的Python包?这是一个常见的问题,原因如下:

1. 在PyPi上有大量的Python包可用,作为大多数包的托管地。截至我写这篇文章时,有278,688个项目可用。

2. 仅仅下载每个包的最新版本是不够的,因为某些包依赖于其他包的特定版本。因此,您还需要下载这些依赖包。例如,pandas 1.1.5依赖于NumPy 1.15.4等其他依赖项。

3. 并非所有的包都与您的Python版本兼容(例如,某些包仅适用于Python 2,而您正在使用Python 3),或者与您的操作系统版本兼容(例如,需要Windows API或Linux API),或者与其他特定环境配置兼容(例如,需要gcc进行编译)。因此,您可能需要下载其他内容才能使每个包正常工作。

4. 您还需要每个下载的包的文档,作为包使用的参考和解决任何问题/错误的参考。您只能希望包的API具有适当的`__doc__`,以便您可以使用`help(module.function)`或者您的IDE可以通过智能感知向您显示。

考虑到这些因素,有一种方法可以尝试从PyPi上“全部下载”,假设您有时间、网络带宽和磁盘容量来将它们全部存储在您的计算机上。您可以:

1. 向PyPi索引发送GET请求:https://pypi.python.org/simple/。

2. 解析每个包的链接。

3. 从链接中解析出包名。

4. 使用pip(或conda或您使用的其他软件包管理器)进行安装。

以下是一个示例的Python脚本:

# 依赖项:pip install requests beautifulsoup4
# 在Python3.8.6、beautifulsoup4==4.9.3、requests==2.25.1上测试通过
import random
import requests
import subprocess
from bs4 import BeautifulSoup
pypi_index = 'https://pypi.python.org/simple/'
print(f'GET list of packages from {pypi_index}')
try:
    resp = requests.get(pypi_index, timeout=5)
except requests.exceptions.RequestException:
    print('ERROR: Could not GET the pypi index. Check your internet connection.')
    exit(1)
print(f'NOW parsing the HTML (this could take a couple of seconds...)')
try:
    soup = BeautifulSoup(resp.text, 'html.parser')
    body = soup.find('body')
    links = (pkg for pkg in body.find_all('a'))
except:
    print('ERROR: Could not parse pypi HTML.')
    exit(1)
# 作为演示,我只安装5个随机包
# 如果您真的想要全部安装,删除这个限制和'list(links)'的抽样
install_limit = 5
some_of_the_links = random.sample(list(links), install_limit)
for link in some_of_the_links:
    pkg_name = link['href'].split('/')[-2]
    cmd = f'pip install {pkg_name}'  # Replace with `conda` for Anaconda
    print("=" * 30)
    print(f'NOW installing "{pkg_name}"')
    try:
        subprocess.run(cmd.split(), check=True)
    except subprocess.CalledProcessError:
        print(f'ERROR: Failed to install {pkg_name}')
        continue

请注意,我将脚本限制为仅安装5个随机包。删除`install_limit`以真正安装全部包,但请注意,并非每个安装都会成功,因为正如我在开头所说的,有些包是损坏的或与您的系统不兼容,或者它们彼此之间不兼容。

除了“全部下载”之外,其他的替代方法有:

选项1:您必须为您正在/将要处理的Python项目做出适当的规划。虽然我们无法预测未来,但我们可以对可能需要的东西进行研究。例如,如果您计划处理Excel文件,请搜索“在Python中读取Excel文件”,然后下载常见提到的包。如果您计划在机器学习模型上工作,请查找教程并注意在那里使用的包。

选项2:您可以在此处查询从PyPi下载的最多的包:https://pypistats.org/top。如果您对该列表不满意,可以尝试使用PyPi统计API获取一个更精细调整的列表。

选项3:您可以获取预安装了Python包的预构建Docker镜像(请参考上面的示例)。例如,有这个datascience-notebook,它“包括来自Julia、Python和R社区的用于数据分析的库”。对于Web应用程序,有这个使用Uvicorn-Gunicorn-FastAPI堆栈构建Web应用程序的tiangolo/uvicorn-gunicorn-fastapi。根据用例,还有许多其他镜像。您可以将这些镜像用作您所需的Python包的参考,或直接将它们用作您的开发环境。

总结起来,虽然有一种方法可以尝试从PyPi上“全部下载”包,但这并不是一个可行和实际的解决方案。根据您的需求和项目要求,您可以选择合适的方法来下载和安装所需的Python包。

0