我已经构建了一个Python包,并准备使用
twine
使用python setup.py sdist bdist_wheel
制作一个可分发的包。这在dist
目录中创建了两个文件:
PACKAGENAME-0.1.1-py3-none-any.whl
PACKAGENAME-0.1.1.tar.gz
setup.py
脚本已配置为:
from setuptools import setup, find_packages
setup(
name='PACKAGE NAME',
version='0.1.1',
author='blackthorne18',
description='Testing package',
url='GITHUBURL', #This URL links to a public repository on github of the package directory
py_modules=['entrypoint', 'runscript'],
packages=find_packages(),
install_requires=[requirements],
python_requires='>=3.10',
classifiers=[
"Programming Language :: Python :: 3.10",
"Operating System :: OS Independent",
],
entry_points='''
[console_scripts]
PACKAGE=entrypoint:main
'''
)
我的 pypi 帐户的身份验证已使用基于令牌的身份验证在
$HOME/.pypirc
中设置。我可以毫无问题地创建包并将其上传到 test.pypi。
$ twine upload --repository testpypi dist/* --verbose
Uploading PACKAGENAME-0.1.1.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 27.8/27.8 kB • 00:00 • 29.3 MB/s
INFO Response from https://test.pypi.org/legacy/:
200 OK
INFO <html>
<head>
<title>200 OK</title>
</head>
<body>
<h1>200 OK</h1>
<br/><br/>
</body>
</html>
View at:
https://test.pypi.org/project/PACKAGENAME/0.1.1/
如果我尝试将相同的发行版上传到 pypi 存储库,则会收到以下错误:
$ twine upload dist/* --verbose
Uploading PACKAGENAME-0.1.1-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 27.9/27.9 kB • 00:00 • 16.0 MB/s
INFO Response from https://upload.pypi.org/legacy/:
400 Bad Request
INFO <html>
<head>
<title>400 Bad Request</title>
</head>
<body>
<h1>400 Bad Request</h1>
The server could not comply with the request since it is either malformed or otherwise incorrect.<br/><br/>
POST body may not contain duplicate keys
</body>
</html>
ERROR HTTPError: 400 Bad Request from https://upload.pypi.org/legacy/
Bad Request
如果我在包上运行twine check dist/*
,它会说
dist/
中的两个文件都已通过检查。我认为主要的错误消息是
POST正文可能不包含重复的键但我真的不知道这意味着什么。我该如何解决这个问题?
版本:
python version 3.10
twine version 4.0.1 (importlib-metadata: 5.0.0, keyring: 23.11.0, pkginfo: 1.8.3, requests: 2.28.1, requests-toolbelt: 0.10.1,
urllib3: 1.26.12)
确保您之前尚未使用当前版本上传包。即使您删除了包,pypi 也会存储元数据以避免潜在的冲突。
解决方案是升级版本,只是为了确保这不是您所看到的错误的原因。