python36.lib如何区分release debug_如何获取到特定日期之前发布的python包的版本号列表?...

从您的问题来看,如果我做得对,您希望使用以下命令安装依赖项:

pip install -r requirements.txt --before 2018-06-21

需要修补的

pip

为了增加

--before

提供目标日期的选项。

下面的代码是第二好的东西。目前它只是一个粗略的草图,但它几乎可以满足您的需要,而不是生成

requirements.txt

,它将最新版本的软件包输出到控制台,格式为:

$ pipenv run python .py django click --before 2018-06-21

pip install django==2.0.6 click==6.7

这不完全是你想的,但非常接近。你可以根据自己的需要随意更改,添加(或不添加)

-r

选项并输出新行上的每个依赖项,然后使用重定向输出,它看起来像这样:

$ pipenv run python .py django click --before 2018-06-21 >> requirements.txt

代码(或使用链接

gist

):

import sys

import requests

from bs4 import BeautifulSoup

from datetime import datetime

import click

PYPI_URL = "https://pypi.org/project/{project_name}/#history"

def get_releases(request):

soup = BeautifulSoup(request, 'html.parser')

releases = list()

for release in soup.find_all('div', class_='release'):

release_version = release.find('p', class_='release__version').text.strip()

if not is_numeric(release_version):

continue

release_date = try_parsing_date(release.find('time').text.strip())

releases.append({'version': release_version, 'date': release_date})

sorted_packages = sorted(releases, key=lambda s: list(map(int, s['version'].split('.'))))

return sorted_packages

def is_numeric(s):

for char in s:

if not char.isdigit() and char not in [" ", ".", ","]:

return False

return True

def try_parsing_date(text):

for fmt in ('%d.%m.%Y', '%d/%m/%Y', '%b %d, %Y', '%Y-%m-%d'):

try:

return datetime.strptime(text, fmt)

except ValueError:

pass

click.echo('Not valid date format. Try to use one of this: <31.12.2018>, <31/12/2019> or <2018-12-31>')

sys.exit(0)

@click.command(context_settings=dict(help_option_names=['-h', '--help']))

@click.option('-b', '--before', help='Get latest package before specified date')

@click.argument('packages', nargs=-1, type=click.UNPROCESSED)

def cli(before, packages):

target_date = try_parsing_date(before) if before else datetime.today()

required_packages = list()

not_found = list()

for package in packages:

project_url = PYPI_URL.format(project_name=package)

r = requests.get(project_url)

if r.status_code is not 200:

not_found.append(package)

continue

releases = get_releases(r.text)

last_release = None

for idx, release in enumerate(releases):

release_date = release['date']

if release_date > target_date:

if last_release and last_release['date'] <= release_date:

continue

last_release = release

required_packages.append({'package': package,

'release_date': last_release['date'],

'release_version': last_release['version']})

print('pip install ' + ' '.join('{}=={}'.format(p['package'], str(p['release_version'])) for p in required_packages))

if len(not_found) > 0:

print('\nCould not find the following packages: {}'.format(' '.join(p for p in not_found)))

if __name__ == '__main__':

cli()

必需的依赖项(Python3):

beautifulsoup4==4.7.1

Click==7.0

requests==2.21.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值