關於我
編程界的一名小程序猿,目前在一個創業團隊任team lead,技術棧涉及Android、Python、Java和Go,這個也是咱們團隊的主要技術棧。 聯繫:hylinux1024@gmail.compython
當咱們開發了一個開源項目時,就但願把這個項目打包而後發佈到pypi.org
上,別人就能夠經過pip install
的命令進行安裝。本文的教程來自於Python
官方文檔,若有不正確的地方歡迎評論拍磚。linux
本文使用到的項目目錄爲git
➜ packaging-tutorial
.
└── bestpkg
└── __init__.py
複製代碼
接下來的全部操做都是在packing_tutorial
這個目錄下進行的。首先把bestpkg
這個目錄下的__init__.py
添加如下內容github
info='packaging demo'
複製代碼
這個信息主要用於打包成功後安裝測試用的。macos
一個待發布的項目還須要有如下這些文件:setup.py
、LICENSE
和README.md
編程
➜ packaging-tutorial
.
├── LICENSE
├── README.md
├── bestpkg
│ └── __init__.py
└── setup.py
複製代碼
setup.py
文件是給setuptools
工具的使用腳本,告訴setuptools
如何構建咱們的項目。打開編輯器,編輯setup.py
文件,輸入如下內容小程序
import setuptools
# 讀取項目的readme介紹
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="bestpkg",# 項目名稱,保證它的惟一性,不要跟已存在的包名衝突便可
version="0.0.1",
author="hylinux1024", # 項目做者
author_email="hylinux1024@gmail.com",
description="一個牛逼的程序", # 項目的一句話描述
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/hylinux1024/niubiproject",# 項目地址
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
)
複製代碼
find_packages()
便可Python
的兼容版本是Python3
,也指定了項目使用的開源協議。給項目添加詳細的README
bash
# Example Package
This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.
複製代碼
要發佈包到pypi
上,選擇一個合適的開源協議是很是重要的。若是不知道怎麼選能夠到choosealicense.com/這裏看看。markdown
項目須要打包後才能發佈,要打包項目需先安裝最新版本的setuptools
和wheel
編輯器
➜ python3 -m pip install --user --upgrade setuptools wheel
複製代碼
而後使用如下命令進行打包
➜ python3 setup.py sdist bdist_wheel
複製代碼
當看到如下信息,說明已經打包成功
...
...
...
adding license file "LICENSE" (matched pattern "LICEN[CS]E*")
creating build/bdist.macosx-10.14-x86_64/wheel/bestpkg-0.0.1.dist-info/WHEEL
creating 'dist/bestpkg-0.0.1-py3-none-any.whl' and adding 'build/bdist.macosx-10.14-x86_64/wheel' to it
adding 'bestpkg/__init__.py'
adding 'bestpkg-0.0.1.dist-info/LICENSE'
adding 'bestpkg-0.0.1.dist-info/METADATA'
adding 'bestpkg-0.0.1.dist-info/WHEEL'
adding 'bestpkg-0.0.1.dist-info/top_level.txt'
adding 'bestpkg-0.0.1.dist-info/RECORD'
removing build/bdist.macosx-10.14-x86_64/wheel
複製代碼
在項目目錄下會生成一個dist
和build
文件夾
➜ packaging-tutorial tree
.
├── LICENSE
├── README.md
├── bestpkg
│ └── __init__.py
├── bestpkg.egg-info
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ ├── dependency_links.txt
│ └── top_level.txt
├── build
│ ├── bdist.macosx-10.14-x86_64
│ ├── bdist.macosx-10.9-x86_64
│ └── lib
│ └── bestpkg
│ └── __init__.py
├── dist
│ ├── bestpkg-0.0.1-py3-none-any.whl
│ └── bestpkg-0.0.1.tar.gz
└── setup.py
8 directories, 11 files
複製代碼
在dist
文件中有兩個文件
dist
├── bestpkg-0.0.1-py3-none-any.whl
└── bestpkg-0.0.1.tar.gz
複製代碼
tar.gz
文件是源碼文件壓縮包,而.whl
就是打包後的文件。最新的pip
命令會安裝這個.whl
文件。
如今就能夠上傳到Python
索引庫了。咱們使用Test PyPI
,這個是測試用的Pypi
,本例子也是使用Test Pypi
。
首先要到test.pypi.org/account/reg…註冊帳號。本例中我註冊的帳號爲:hylinux1024。
而後使用twine
工具來上傳咱們的包。使用如下命令進行安裝:
➜ python3 -m pip install --user --upgrade twine
複製代碼
使用如下命令上傳dist
目錄下的文件
➜ python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
複製代碼
這個命令會提示輸入剛在test.pypi.org
上註冊帳號密碼,並出現相似如下信息後說明已經上傳成功。
Enter your username: hylinux1024
Enter your password:
Uploading distributions to https://test.pypi.org/legacy/
Uploading bestpkg-0.0.1-py3-none-any.whl
100%|██████████████████████████████████████| 4.57k/4.57k [00:00<00:00, 8.01kB/s]
Uploading bestpkg-0.0.1.tar.gz
100%|██████████████████████████████████████| 4.18k/4.18k [00:01<00:00, 3.23kB/s]
複製代碼
而後打開test.pypi.org/project/bes…這個地址就能夠看到咱們發佈的包。
發佈成功以後就可使用pip
來安裝來。咱們在虛擬環境中安裝,關於虛擬環境能夠看我前一篇文章。
這裏就使用pipenv
,這裏我直接進入到我昨天建立的那個項目中,也爲了更好演示安裝結果。
➜ pip install --index-url https://test.pypi.org/simple/ --no-deps bestpkg
複製代碼
在這裏我使用--index-url
參數是爲了指定從test.pypi.org
中安裝,而不是正式包索引庫中查找要安裝的包。還有使用了--no-deps
參數是由於本例中沒有使用到其它的依賴庫。
在終端會看到如下相似信息,說明安裝成功
Looking in indexes: https://test.pypi.org/simple/
Collecting bestpkg
Downloading https://test-files.pythonhosted.org/packages/5a/fc/c109b3872b6c06e7368c30b6e52501113846f90ca716a434766151093173/bestpkg-0.0.1-py3-none-any.whl
Installing collected packages: bestpkg
Successfully installed bestpkg-0.0.1
複製代碼
進入交互界面
(pipenvdemo) ➜ pipenvdemo python
>>> import bestpkg
>>> bestpkg.info
'packaging demo'
複製代碼
info
變量就是在__init__.py
文件中定義的變量。自此咱們的包發佈、安裝使用流程就走完了。
要在正式的Python
索引庫中發佈,只須要到pypi.org/註冊帳號,並上傳就能夠了。
經過一個簡單的例子展現Python
經過setuptools
工具進行打包,而後上傳到test.pypi.org
的流程。若是要上傳到正式的pypi.org
上,只須要註冊一個正式的帳號。一旦發佈成功就可使用pip install [your-package]
的命令進行安裝。