使用pip發(fā)布Python程序的方法步驟
寫(xiě)過(guò) Python 程序的小伙伴們都知道,需要 import 個(gè)非 Python 自帶的軟件包時(shí),都要用到 pip 這個(gè)程序。平時(shí)我們都是用 pip,如果我們寫(xiě)好了一個(gè)程序,想讓大家都能用的到,那么是不是也可以通過(guò) pip 發(fā)布出去呢?
答案當(dāng)然是可以了,這篇文章我們就來(lái)看看如何用 pip 發(fā)布一個(gè) python 程序。
1. 環(huán)境準(zhǔn)備
要用 pip 發(fā)布 python 程序,首先當(dāng)然是要安裝 Python 和 pip 這兩個(gè)軟件了,以 Ubuntu 16.04 為例:
$ sudo apt update $ sudo apt install -y python python-pip
CentOS 和 RedHat 因?yàn)?RPM 體系需要依賴(lài)于 python,更是默認(rèn)就安裝好了。
另外發(fā)布 Pypi,還需要安裝一個(gè)發(fā)布工具, twine ,以及其所依賴(lài)的 setuptools、wheel:
$ sudo pip install --upgrade twine setuptools wheel
好,到這環(huán)境就已經(jīng)就緒了。
2. 注冊(cè)帳號(hào)
pip 上傳代碼包是最終保存在 https://pypi.org 這個(gè)網(wǎng)站上的,所以要用 pip 發(fā)布程序,就需要在這個(gè)網(wǎng)站上注冊(cè)一個(gè)帳號(hào)。
訪問(wèn)該網(wǎng)址進(jìn)行注冊(cè): https://pypi.org/account/register/

注冊(cè)后還需要進(jìn)行郵箱驗(yàn)證,流程和普通網(wǎng)站沒(méi)有任何區(qū)別,所以具體步驟就不在這里詳細(xì)介紹了。
3. 代碼結(jié)構(gòu)
要發(fā)布 Python 程序,程序的結(jié)構(gòu)必須符合特定的要求,假設(shè)要發(fā)布的程序名為 example-pkg,基本的目錄結(jié)構(gòu)如下:
/example-pkg /example-pkg __init__.py setup.py LICENSE README.md
說(shuō)一下目錄和文件的含義:
- 首先最外層要建立一個(gè)和發(fā)出程序同名的文件夾: /example-pkg
- 該文件夾下還要再簡(jiǎn)歷一個(gè)同名文件夾,用來(lái)存放程序代碼: /example-pkg/example-pkg
- Python 的老規(guī)矩,example-pkg/example-pkg 目錄下當(dāng)然要有一個(gè)
__init__.py文件。 - /example-pkg 目錄下要有一個(gè)叫 setup.py 的文件,如果下載過(guò) Python 代碼包,應(yīng)該都知道這個(gè)文件,需要通過(guò)這個(gè)文件進(jìn)行 Python 代碼的編譯(可能會(huì)有依賴(lài)的其他代碼包或者依賴(lài)的 C 文件)和安裝。
- LICENSE 文件:這個(gè)文件就是用來(lái)保存代碼所使用的開(kāi)源許可證。
- README.md:這個(gè)是軟件行業(yè)的慣例了,幫助文檔。
對(duì)于 setup.py 文件,還有必要好好說(shuō)說(shuō),先貼個(gè)例子,下面這個(gè)例子中,主要是實(shí)現(xiàn)了從 /example-pkg/example-pkg/__init__.py 文件中讀取 version 參數(shù),來(lái)配置當(dāng)前軟件的版本,并指定了代碼包名(name)、作者(author)、郵箱(author_email)、描述信息(long_description、long_description_content_type)、依賴(lài)(install_requires),以及哪些文件不會(huì)被打包到程序中(exclude_package_data)。
另外需要提醒大家一點(diǎn), 給程序起名字不要帶下劃線(_) ,python import 代碼包時(shí),是不支持下劃線包名的,出現(xiàn)這種情況就比較尷尬,代碼裝上了,還是用不了。
#!/usr/bin/env python
import re
import setuptools
version = ""
with open('example-pkg/__init__.py', 'r') as fd:
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]',
fd.read(), re.MULTILINE).group(1)
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="example-pkg",
version=version,
author="example",
author_email="author@example.com",
description="This is the SDK for example.",
long_description=long_description,
long_description_content_type="text/markdown",
url="http://example.com",
install_requires=[
'requests!=2.9.0',
'lxml>=4.2.3',
'monotonic>=1.5',
],
packages=setuptools.find_packages(exclude=("test")),
classifiers=(
"License :: OSI Approved :: MIT License",
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5"
),
exclude_package_data={'': ["example-pkg/test.py", "example-pkg/config.txt"]},
)
4. 上傳和檢查
一切準(zhǔn)備就緒,下面就可以執(zhí)行打包命令,產(chǎn)生要上傳的代碼包了:
$ python setup.py sdist bdist_wheel
執(zhí)行結(jié)束后,會(huì)產(chǎn)生如下目錄和文件:
/example-pkg/dist/ example-pkg-0.0.1-py3-none-any.whl example-pkg-0.0.1.tar.gz
包有了,就差上傳了,執(zhí)行第一步中安裝的 twine 命令:
$ twine upload dist/* Uploading distributions to https://upload.pypi.org/legacy/ Enter your username: <your pypi.org username> Enter your password: <your pypi.org password> Uploading example-pkg-0.0.1-py3-none-any.whl 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 45.0k/45.0k [00:01<00:00, 24.0kB/s] Uploading example-pkg-0.0.1.tar.gz 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 43.8k/43.8k [00:00<00:00, 46.2kB/s]
上傳完畢!不過(guò)這里有一點(diǎn)需要注意,上傳新版本后,很可能 pip search 還沒(méi)法查到版本的更新,這是正常的,我理解是
pip search 命令依賴(lài)于緩存,所以不會(huì)立刻生效。
接下來(lái)就讓我們下載自己剛剛上傳的 python 試試吧:
$ pip install example-pkg $ python >>> import example-pkg >>> example-pkg.name 'example-pkg'
最后再補(bǔ)充一點(diǎn),上傳可能會(huì)失敗,提示無(wú)法上傳指定的代碼包,此時(shí)很大的可能是 pypi 中已經(jīng)有了相同的代碼包,所以建議在上傳之前,先搜索一下是否有重名的代碼包,選擇一個(gè)不沖突的名字,再上傳。
例如下面這個(gè)例子,example-pkg 已經(jīng)存在了,如果要再上傳,那當(dāng)然會(huì)失敗,換個(gè)名字就解決了。
$ pip search example-pkg example-pkg (0.0.7) - A small example package ......
5. 參考文檔
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python判斷一個(gè)集合是否包含了另外一個(gè)集合中所有項(xiàng)的方法
這篇文章主要介紹了python判斷一個(gè)集合是否包含了另外一個(gè)集合中所有項(xiàng)的方法,涉及Python集合操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06
Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)讓字典保持有序的方法
這篇文章主要介紹了Python讓字典保持有序的方法,涉及Python基于collections模塊中的OrderedDict類(lèi)實(shí)現(xiàn)控制字典順序的相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
使用PyTorch常見(jiàn)4個(gè)錯(cuò)誤解決示例詳解
這篇文章主要為大家介紹了使用PyTorch常見(jiàn)4個(gè)錯(cuò)誤解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
基于Python開(kāi)發(fā)一個(gè)文件快速搜索工具
這篇文章主要為大家詳細(xì)介紹了如何基于Python開(kāi)發(fā)一個(gè)文件快速搜索工具,可以實(shí)現(xiàn)多條件文件搜索并實(shí)時(shí)搜索狀態(tài)反饋,需要的可以參考一下2025-03-03
SpringMVC和SpringBoot接收參數(shù)的幾種方式詳解
這篇文章主要介紹了SpringMVC和SpringBoot接收參數(shù)的幾種方式詳解,Spring是分層的JavaSE/EE應(yīng)用輕量級(jí)開(kāi)源框架,以IoC和AOP為內(nèi)核,提供了展現(xiàn)層 Spring MVC和持久層Spring JDBC以及業(yè)務(wù)層事務(wù)管理等眾多的企業(yè)級(jí)應(yīng)用技術(shù),需要的朋友可以參考下2023-07-07
使用Python實(shí)現(xiàn)為PDF文件添加圖章
在日常工作中,我們經(jīng)常需要給PDF文檔添加一些標(biāo)識(shí),比如公司的圖章或水印圖章,所以本文就來(lái)為大家詳細(xì)介紹一下如何使用Python實(shí)現(xiàn)為PDF文件添加圖章,需要的可以參考下2023-11-11
python切片復(fù)制列表的知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python切片復(fù)制列表的知識(shí)點(diǎn)相關(guān)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。2021-10-10

