Python将自己的Py文件(或包)发布至pip上

开始

前几天本来是做了一个关于pgzero的模板文件,想发布到pip上面,但在CSDN上搜了114514年却没有任何成果。因为CSDN上只有关于上传python包的。最后是问了chatGPT才解决了问题,也算为CSDN补了个缺口吧!

只打包一个py文件

第一步在Pypi和Github上拥有自己的账号

上传一个py文件,首先需要在Pypi和Github上有账号。已经有了的同学可以直接去下一步
而本作者又比较懒,不想写这部分,所以请去其他博客康康。

第二步——有一个python库~

如果你想将自己的Python库发送至pip首先你得有个py文件
我的python库是长这样的:

/pgzero_template
----/pgzero_template.py
----/setup.py
----/README.md
----/LICENSE

其中pgzero_template文件夹只是一个单纯的目录,取任何名字皆可。只是用于区分其他文件。
pgzero_template.py是库,即你的库的核心文件(虽然也只有一个文件(bruh))
README.md是你库的长描述文件,后期我们对库的描述都在这里面
setup.py是将项目打包的文件
LICENSE(注:没有后缀名)是库的许可证书,可以在Pypi上获取

pgzero_template.py

接下来让我们挨个分析文件夹里面的文件。首先是pgzero_template.py。这是你的库文件。我的库文本如下:

"""
@author: xiaofengkz
@date: 2023-2-25
pgzero的template程序(模板文件)
pgzero本身就是pygame的简化版本,但是我——xiaofengkz又把他简化了一下
使用方法:
    :from template import * #必须得这样,否则无法运行
提供方法:
    :template_draw(screen, bg=(255, 255, 255)
    :template_update()
    :template_on_key_down(keys, key)
    :template_on_key_up(keys, key)
    :template_on_key_down_ESCAPE()
    :template_on_mouse_down(mouse, pos, button)
    :template_on_mouse_up(mouse, pos, button)
    :play_music(music_name='bg_music')
    :stop_music()
    :play_sound(sound_name)
How to use them:
    Some examples:
        :def draw():
            template_draw(screen)
        :def update():
            template_update()
        ...and so on

开源包,任何人都可以使用并修改!
"""
import sys
import os
from pgzrun import *
import re

__version__ = '2.4'

LETTERS = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
LETTERS.append('ESCAPE')
LETTERS.append('SPACE')
LETTERS.append('RIGHT')
LETTERS.append('LEFT')
LETTERS.append('UP')
LETTERS.append('DOWN')
# BG = (255, 255, 255)
WIDTH = 1200
HEIGHT = 800

def template_draw(screen, bg=(255, 255, 255)):
    screen.fill(bg)
    for var in mod.__dict__:
        if re.match('draw_.+',var):
            function = getattr(mod,var)
            function(screen)

def template_update():
    for var in mod.__dict__:
        if re.match('update_.+',var):
            function = getattr(mod,var)
            function()
            
def template_on_key_down(keys,key):
    for letter in LETTERS:
        if key == getattr(keys,letter):
            for var in mod.__dict__:
                if var == 'on_key_down_{}'.format(letter):
                    function = getattr(mod,var)
                    function()
                    
def template_on_key_up(keys,key):
    for letter in LETTERS:
        if key == getattr(keys,letter):
            for var in mod.__dict__:
                if var == 'on_key_up_{}'.format(letter):
                    function = getattr(mod,var)
                    function()
                    
def on_key_down_ESCAPE():
    sys.exit()
    
def _none(pos):pass
    
def template_on_mouse_down(mouse,pos,button):
    if button == mouse.LEFT:
        function = getattr(mod,'on_mouse_left_down',_none)
        function(pos)
    if button == mouse.RIGHT:
        function = getattr(mod,'on_mouse_right_down',_none)
        function(pos)
    if button == mouse.MIDDLE:
        function = getattr(mod,'on_mouse_middle_down',_none)
        function(pos)
    
def template_on_mouse_up(mouse,pos,button):
    if button == mouse.LEFT:
        function = getattr(mod,'on_mouse_left_up',_none)
        function(pos)
    if button == mouse.RIGHT:
        function = getattr(mod,'on_mouse_right_up',_none)
        function(pos)
    if button == mouse.MIDDLE:
        function = getattr(mod,'on_mouse_middle_up',_none)
        function(pos)

def play_music(music_name='bg_music'):
    getattr(mod, 'music').play(music_name)
def stop_music(): getattr(mod, 'music').stop()
def play_sound(sound_name):
    getattr(getattr(mod, 'sounds'), sound_name).play()

在文件中你必须要添加一个__version__变量,用于填写库的版本号,在后期如果要更新库,需要将__version__的值改为更高的版本号。

README.md

这里面只需要写一下库的详细描述即可。
这是我的:

A template for pgzero.
You can use it to type pgzero-file more quickly.
You only should type some like this:
"
from pgzero_template import *
"

LICENSE

LICENSE文件文本可以在这里挑选
这是我的LICENSE文件:

MIT License

Copyright (c) [year] [fullname]

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.

setup.py

setup.py文件如下:

#!python
# -*- coding:utf-8 -*-
from __future__ import print_function
from setuptools import setup, find_packages
import pgzero_template

with open("README.md", "r", encoding='utf-8') as fh:
    long_description = fh.read()

setup(
    name="pgzero_template",
    version=pgzero_template.__version__,
    author="xiaofengkz",
    author_email="xiaofengkz@163.com",
    description="a template for pgzero",
    long_description=long_description,
    long_description_content_type="text/markdown",
    license="MIT",
    url="https://github.com/zhec5hl01/python-games",
    py_modules=['pgzero_template'],
    install_requires=[
        "pgzero <= 1.2.1",
        "pygame <= 2.1.2"
        ],
    classifiers=[
        "Topic :: Games/Entertainment ",
        'Topic :: Games/Entertainment :: Puzzle Games',
        'Topic :: Games/Entertainment :: Board Games',
        "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",
        'Programming Language :: Python :: Implementation :: CPython',
    ],
)

name 是包名。发布之前请上 PyPi 搜索一下有没有同名的包,防止冲突。
version 是版本号,更新的时候会寻找比当前版本更高的版本号,所以不要乱写。
description是短描述,一般是一句话。
long_description是长描述,详细的介绍。我直接读入了 README.md.
url是你项目的地址。一般会填 github 地址。
py_modules是库名,在里面填写你的库文件名即可。
install_requires是这个包的所需的依赖。
classifiers 是分类。根据 PyPi Classifiers 填写,至少要包含所用的 Python 版本。

第三步——上传文件

最后的最后,用pip安装一下上传包的必要库:

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

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

说明一下:setuptoolswheel用于构建项目;twine用于上传文件至Pypi。
首先检查setup.py语法是否正确:

python setup.py check

若没有错误,就可以构建项目

python setup.py sdist bdist_wheel

结果应该生成三个文件夹

/pgzero_template
----/pgzero_template.egg-info
----/dist
----/build

其中最重要的是dist目录。
接下来就可以正式开始上传了

方法1

在cmd中输入如下代码:

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

输入Pypi的账户与密码即可

方法2

上个方法可能会报错,而且每次都要输入密码,很烦(大悲)
所以还有另个方法:
C:\Users\用户名创建文件.pypric
若无法创建,直接用cmd解决:

echo a 2>.pypric

在文件中写如下:

[distutils]
index-servers=pypi

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

这样就可以直接输入cmd

twine upload dist/*

过一段时间,就上传成功惹!!!

尝试导入自己的项目

可以用pip来尝试安装自己的库。

python -m pip install pgzero-template

在用python测试一下:

from pgzero_template import *

def draw():
	template_draw(screen)

def update():
	template_update()

def on_key_down(key):
	template_on_key_down(keys, key)

上传一个python包

很很很很很很简单~只需要稍加修改一下刚刚的文件即可

/pgzero_template
----/pgzero_template
--------/__init__.py
--------/和其他py文件……
----/以及我刚刚说过的文件……

同时setup.py也需要一些修改:

#!python
# -*- coding:utf-8 -*-
from __future__ import print_function
from setuptools import setup, find_packages
import pgzero_template

with open("README.md", "r", encoding='utf-8') as fh:
    long_description = fh.read()

setup(
    name="pgzero_template",
    version=pgzero_template.__version__,
    author="xiaofengkz",
    author_email="xiaofengkz@163.com",
    description="a template for pgzero",
    long_description=long_description,
    long_description_content_type="text/markdown",
    license="MIT",
    url="https://github.com/zhec5hl01/python-games",
    packages=find_packages(),
    install_requires=[
        "pgzero <= 1.2.1",
        "pygame <= 2.1.2"
        ],
    classifiers=[
        "Topic :: Games/Entertainment ",
        'Topic :: Games/Entertainment :: Puzzle Games',
        'Topic :: Games/Entertainment :: Board Games',
        "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",
        'Programming Language :: Python :: Implementation :: CPython',
    ],
)

只需要py_modules参数改为packages,值改为find_packages()函数。

结束语

咳咳……终于讲完了!这是我的第一个博客,可能有些不好,请谅解!希望本博客能为各位码农提供帮助!!!

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值