欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用pip安装自己的程序——上传python程序到PyPi

程序员文章站 2022-05-07 23:14:28
...

0. 前言

昨天无聊写了一个小游戏,然后突然想到要是能使用 pip 安装不就很棒(可以更好的跟女朋友炫耀)。然后网上找了一下资料,发现还真可以,还挺容易的。

接下来就以我写的小游戏为例,做一个示范。

1. 注册账号

点此注册:Register Pypi

2. 安装 setuotools, wheel, twine

setuotoolswheel 用来构建你的项目,一般都会随 Python 安装,但是还是检查一下:

python -m pip install --user --upgrade setuptools wheel

twine 用来上传你的包到 PyPi

python -m pip install --user --upgrade twine

3. 添加文件

3.1 目录结构

我写的小游戏比较小巧,只有一个文件 life.py,但是 python 包需要一个 __init__.py 文件,由于我想直接运行包,所以加了一个 __main__.py 文件,但是这个文件非必需。所以,目录结构如下:

life_game\
    |---- __init__.py
    |---- __main__.py
    |---- life.py

接下来添加一些发布的必要文件,在上面的文件夹外层再创建一个文件夹,名字随意,我习惯使用一样的。如下:

life_game\
    |---- setup.py			
    |---- LICENSE
    |---- README.md
    |---- life_game\
            |---- __init__.py
            |---- __main__.py
            |---- life.py

3.2 setup.py

setup.py 是setuptools的构建脚本。它告诉setuptools你的包(例如名称和版本)以及要包含的代码文件。

我的 setup.py 如下:

#!/usr/bin/env python
from __future__ import print_function
from setuptools import setup, find_packages
import sys


setup(
    name="life_game",
    version="1.2.0",
    author="Memory",
    author_email="[email protected]",
    description="life game",
    long_description="life game written by pygame",
    license="MIT",
    url="https://github.com/MemoryD/life_game",
    packages=setuptools.find_packages(),
    install_requires=[
        "pygame <= 1.9.5",
        ],
    classifiers=[
        "Topic :: Games/Entertainment ",
        "Topic :: Software Development :: Libraries :: Python Modules",
        "Programming Language :: Python",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.5",
        "Programming Language :: Python :: 3.5",
        "Programming Language :: Python :: 3.6",
        "Programming Language :: Python :: 3.7",
    ],
)
  • name 是包名。发布之前请上 PyPi 搜索一下有没有同名的包,防止冲突。
  • version 是版本号,更新的时候会寻找比当前版本更高的版本号,所以不要乱写。
  • description是短描述,一般是一句话。
  • long_description是长描述,详细的介绍。但是我比较懒,也只写了一句话。
  • url是你项目的地址。一般会填 github 地址。
  • packages 是包列表。setuptools.find_packages() 可以自动找到目录下所有的包,在这个例子中是 “life_game”, 只有一个包。
  • install_requires是这个包的所需的依赖。
  • classifiers 是分类。根据 PyPi Classifiers 填写,至少要包含所用的 Python 版本。

3.3 LICENSE

上传到 PyPi 的每个包都要包含许可证。

选择许可证:Choose License

选择许可证后,打开 LICENSE 并输入许可证文本。选择了 MIT 许可证:

Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

4. 构建项目

以下的命令 ,都在在外层 life_game ,也就是 setup.py 所在的目录进行。

  • 检查一下 setup.py 文件是否有错误:

    python setup.py check
    

    没有错误才能进行构建。

  • 构建:

    python setup.py sdist bdist_wheel
    

如果没有错误,则文件夹下面会生成好几个目录,其中重要的是 dist 目录:

dist\
	|---- life_game-1.2.0.tar.gz
	|---- life_game-1.2.0-py3-none-any.whl

这两个文件是要上传到 PyPi 网站上供别人下载安装的。

5. 上传

5.1 方法一

twine upload --repository-url https://upload.pypi.org/legacy/ dist/*

然后输入你在 PyPi 注册的账号和密码就可以上传了。如下:

> twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Enter your username: [username]
Enter your password: [password]
Uploading life_game-1.2.0-py3-none-any.whl
100%|█████████████████████████████████████████████████████████████████████████████| 7.41k/7.41k [00:02<00:00, 3.19kB/s]
Uploading life_game-1.2.0.tar.gz
100%|█████████████████████████████████████████████████████████████████████████████| 7.12k/7.12k [00:00<00:00, 11.7kB/s]

5.2 方法二

方法一有时候这样子上传好像会失败,而且每次都要输入 用户名和密码。

这时候我们就可以创建一个配置文件,简化每次的上传流程。

创建一个文件 .pypric

  • window 下,将 .pypric 放在 C:\\User\用户名\ 下。如果不能直接创建,就用 cmd 输入命令:

    echo a 2>.pypric
    
  • linux 下,将.pypric 放在 ~/ 也就是 %HOME 目录下。

创建好后,编辑,输入以下内容保存:

[distutils]
index-servers=pypi

[pypi]
repository = https://upload.pypi.org/legacy/
username: [username]
password: [password]

这时候要上传项目只需:

twine upload dist/*

然后就可以使用 pip 安装你的包了。

5. 小结

感觉发布在 PyPi 上以后就变得高大上了(虽然自己还是很菜),不过看着别人(女朋友)使用 pip 直接安装自己的项目还是挺有成就感的。

有趣的的可以试一下这个 小游戏。经典的生命游戏。

安装

pip install life_game

运行

python -m life_game

如果看完了发现还有疑问的话, 可以查阅官方文档:Packaging Python Projects

相关标签: python pip pypi