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

2023-05-16

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

  • 开始
  • 只打包一个py文件
    • 第一步在Pypi和Github上拥有自己的账号
    • 第二步——有一个python库~
      • pgzero_template.py
      • README.md
      • LICENSE
      • setup.py
    • 第三步——上传文件
      • 方法1
      • 方法2
    • 尝试导入自己的项目
  • 上传一个python包
  • 结束语

开始

前几天本来是做了一个关于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()函数。

结束语

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Sonar代码质量管理服务搭建并导入java项目

    1 软件下载 7 4 2 软件配置 打开解压后文件conf sonar properties mysql版本必须大于5 6小于8 0 MySQL gt 61 5 6 amp amp lt 8 0 sonar jdbc url 61 mysq
  • java join方法实现线程的串行

    java实现多线程之间串行执行 xff0c 网上也有很多的教程 在这里我主要说的是 xff1a java Thread类的join函数 xff0c 先贴代码吧 xff1a package cn com fhz thread Created
  • Windows上Rust所依赖的msvc到底怎么装?

    在Windows上面安装Rust的开发环境 xff0c 看起来颇具挑战性 我们会被告知需要安装一个名叫Microsoft Visual Studio C 43 43 build tools的编译工具 xff0c 并被给到一个官方链接 然而
  • Word 转 Markdown

    1 Pandoc 工具将 Word 文档转为 Markdown 可以借助 Pandoc 工具将 Word 文档转为 Markdown xff0c 例如 xff0c 此处将 README docx 转成 README md xff0c 命令如
  • c语言现代方法 chapter20自学笔记

    如果编写程序需要用到数据在内存中如何存储 xff0c 那么除非必要 xff0c 否则不用 xff0c 如果用 xff0c 那么集中在程序中的某个模块 xff0c 不要分散在各处 20 1 移位运算符 c语言提供了6个位运算符 这些运算符可以
  • 查看python源码之jieba安装

    Python 2 x 下的安装 全自动安装 xff1a easy install jieba 或者 pip install jieba 半自动安装 xff1a 先下载http pypi python org pypi jieba xff0c
  • 在Ubuntu Linux上搭建go语言环境

    一 安装VMware Tools 1 在刚装好的ubuntu linux上 xff0c 如果没有安装VMware Tools xff0c 那么我们就要先安装它 打开我们的ubuntu linux xff0c 然后点击左上角的虚拟机 xff0
  • Linux nohup实现后台运行程序及查看(nohup与&)

    1 后台执行 一般运行linux上的程序都是执行 sh 文件 xff08 sh文件 xff09 xff0c 那如果不影响当前CMD窗口的操作 xff0c 需要后台运行怎么办呢 xff1f 这时就需要借助 nohup 和 amp 命令来实现
  • CA 认证过程及 https 实现方法

    CA 认证过程 CA 概述 xff1a Certificate Authority 的缩写 xff0c 通常翻译成认证权威或者认证中心 xff0c 主要用途是为用户发放数字证书 CA 认证的流程和公安局派出所颁发身份证的流程一样 认证中心
  • C++代码详解:string的赋值与C风格字符串转换

    C 43 43 代码详解 string的赋值与C风格字符串转换 61 61 61 61 61 string简介 61 61 61 61 61 string是C 43 43 里默认的字符串容器 xff0c 用于代替C风格的字符串指针与字符串数
  • nginx 基本配置

    一篇比较好的参考文 https www digitalocean com community tutorials how to install nginx on ubuntu 18 04 1 在 Ubuntu 上安装 Nginx sudo
  • 解决[[NSFileManager defaultManager] contentsOfDirectoryAtPath 方法获取不到数据的bug

    在说这个问题之前 必须先解释一下 我们在引入工程的时候 xcode会给我们3个选项 1 Copy items if needed 主要是说明 xff0c 是否要将文件拷贝到工程所在目录 如果不选中 xff0c 而且该库文件不在工程目录下 x
  • GitLab+Jenkins集群+docker CICD集成

    前言 最近部门进行CICD架构升级将引入k8s编排docker容器 借此机会梳理下目前应用部署发布方式 当前架构是我刚到公司时基于gitlab 43 jenkins 43 docker 43 nexus搭建 引入K8S后将调整pod yam
  • 10个轻松上手制作的Arduino项目

    创建Arduino项目可以给您带来很大的满足感 xff0c 但很多时候初学者不知道从哪里开始 启动创建项目时需要考虑很多事情 xff0c 如果您没有制作的经验 xff0c 那可能会令人困惑 正是因为这个原因 xff0c 我们为初学者收集到1
  • 7个基于Arduino的神奇项目!

    创客人数的规模正在增加 xff0c 从当地的超市到大城市繁忙的办公室 xff0c 到处都可以找到他们 xff0c 这些地方可能会有一个或两个创客 xff0c 或许更多 xff0c 在制定他们的下一个设计 xff0c 或者可能渴望找到一个前现
  • 用if语句如何检测一个变量是否存在。

    例如我们用if语句检测一下num这个变量是否存在 若我们直接写 xff1a var night 61 34 34 if num night 61 34 yes 34 console log night 注意 xff01 xff01 1 如果
  • nodejs中的__filename和__dirname的使用说明

    在node js开发中 xff0c 有时候需要获取一些环境变量 xff0c 其中 filename和 dirname 是两个有用的环境变量 dirname 获取的是调用 dirname的脚本文件本身的绝对路径 xff0c 不是启动脚本文件的
  • LPC1768 -- RTC实时时钟

    RTC是当下设备中比较普遍的一个部件 xff0c 很多设备都需要查看时间 RTC实时时钟已经在很多的单片机中集成 xff0c 以前还要专门的时钟芯片 xff0c 现在Cortex M3内核都包括了这个部件了 和以前NXP的ARM7内核不同的
  • Ubuntu Apache2配置SSL证书

    一 Ubuntu下的Apache2 1 安装Apache2 sudo apt get install apache2 默认站点在 var www 配置文件在 etc apache2 日志在 var log apache 启动脚本是 etc
  • 时间机器

    让我们回到过去的是回忆 让我们勇敢前行的是期望 致我最爱的电影 时间机器

随机推荐