1. 程式人生 > 程式設計 >將python包釋出到PyPI和製作whl檔案方式

將python包釋出到PyPI和製作whl檔案方式

wheel檔案

Wheel和Egg都是python的打包格式,目的是支援不需要編譯或製作的安裝過程,實際上也是一種壓縮檔案,將.whl的字尾改為.zip即可可看到壓縮包裡面的內容。按照官網說法,wheels是發行版Python的新標準並且要取代.egg。 Egg格式是由setuptools在2004年引入,而Wheel格式是由PEP427在2012年定義。 Wheel現在被認為是Python的二進位制包的標準格式。

以下是Wheel和Egg的主要的不同點:

Wheel有一個官方的PEP427來定義,而Egg沒有PEP定義。

Wheel是一種分發格式,即打包格式。而Egg既是一種分發格式,也是一種 執行時安裝的格式,並且是可以被import的。

Wheel檔案不會包含.pyc檔案

Wheel使用和PEP376相容的.dist-info目錄,而Egg使用.egg-info目錄。

Wheel有著更豐富的命名規則。

Wheel是有版本的,每個Wheel檔案都包含wheel規格的版本和打包它的實現。

Wheel在內部被sysconfig path type管理,因此轉向其他格式也更容易。

distutils和setuptools工具

用來Python環境中構建和安裝額外的模組,模組可以基於Python,也可以C/C++寫的擴充套件模組,可以是python包,包中包含了C和Python編寫的模組。setuptools是 Python Enterprise Application Kit(PEAK)的一個副專案,它是一組Python的 distutilsde工具的增強版(適用於 Python 2.3.5 以上的版本,64 位平臺則適用於 Python 2.4 以上的版本),可以讓程式設計師更方便的建立和釋出 Python 包,特別是那些對其它包具有依賴性的狀況。

setuptools重點在於setup.py檔案編寫:

setup.py引數介紹:

name : 打包起來的包的檔名

version : 版本號,新增為打包檔案的字尾名

author : 作者

author_email : 作者的郵箱

py_modules : 打包的.py檔案

packages: 打包的python資料夾

include_package_data : 專案裡會有一些非py檔案,比如html和js等,這時候就要靠include_package_data 和 package_data 來指定了。package_data:一般寫成{‘your_package_name': [“files”]},include_package_data還沒完,還需要修改MANIFEST.in檔案.MANIFEST.in檔案的語法為: include xxx/xxx/xxx/.ini/(所有以.ini結尾的檔案,也可以直接指定檔名)

license : 支援的開源協議

description : 對專案簡短的一個形容

ext_modules : 是一個包含Extension例項的列表,Extension的定義也有一些引數。

ext_package : 定義extension的相對路徑

requires : 定義依賴哪些模組

provides : 定義可以為哪些模組提供依賴

data_files :指定其他的一些檔案(如配置檔案),規定了哪些檔案被安裝到哪些目錄中。如果目錄名是相對路徑,則是相對於

sys.prefix或sys.exec_prefix的路徑。如果沒有提供模板,會被新增到MANIFEST檔案中。

將python檔案(.py)封裝成可安裝使用的模組

參考:https://docs.python.org/3.6/distutils/introduction.html#distutils-simple-example

printtest.py

def test():
 print('print test')

將以上.py檔案做成python模組,需要在相同目錄下建立setup.py檔案,setup.py中輸入配置資訊:

from setuptools import setup
setup(name='printtest',version='1.0',py_modules=['printtest'],)

開啟終端,定位到該資料夾下,輸入:

python setup.py sdist

此時在目錄中生成dist資料夾,資料夾中有testpg-1.0.tar.gz檔案,使用者安裝的話只需要testpg-1.0.tar.gz檔案即可。將此檔案解壓得到testpg-1.0資料夾,會發現該資料夾有我們剛剛書寫的3個py檔案,還有一個PKG-INFO,開啟該檔案,會顯示該模組的具體資訊:由於我們沒有設定,所以為UNKOWN

Metadata-Version: 1.0
Name: printtest
Version: 1.0
Summary: UNKNOWN
Home-page: UNKNOWN
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Description: UNKNOWN
Platform: UNKNOWN

終端定位到此資料夾下,輸入以下命令,模組將會被安裝到直譯器對應的Lib/site-packages目錄下:

python setup.py install

安裝後,會發現Lib/site-packages目錄下存在printtest.py檔案和printtest-1.0-py3.6.egg-info 應用:

import printtest

printtest.test()

輸出:

print test

封裝Python包

匯入單個Python檔案時成為Python模組,而包含多個Python檔案的資料夾成為一個Python包。本節主要講述怎樣封裝一個Python包。

1.建立一個資料夾,將需要封裝的pagtest資料夾(裡面為.py檔案,需要包括一個__init__.py檔案,內容可以為空)放到該資料夾中,然後建立setup.py檔案對包進行配置:

from setuptools import setup

setup(name='pagtest',version='1.0.0',description='A print test for PyPI',author='winycg',author_email='[email protected]',url='https://www.python.org/',license='MIT',keywords='ga nn',project_urls={
   'Documentation': 'https://packaging.python.org/tutorials/distributing-packages/','Funding': 'https://donate.pypi.org','Source': 'https://github.com/pypa/sampleproject/','Tracker': 'https://github.com/pypa/sampleproject/issues',},packages=['pagtest'],install_requires=['numpy>=1.14','tensorflow>=1.7'],python_requires='>=3'
  )

2.建立README.txt檔案用於對檔案的安裝以及使用資訊做描述

3.目前資料夾的目錄的架構為:

pagtest/
 __init__.py
 print1.py
 print2.py
setup.py
README.txt

輸入以下命令進行打包,製作source distribution(原始碼釋出包),此命令將會把所有內容在dist/目錄打包為pagtest-1.0.0.tar.gz

python setup.py sdist

4.上傳到PyPI上。上傳時,可以建立一個賬戶驗證檔案~/.pypirc(Windows不可以,因為檔案命名中含有非法字元),也可以在上傳時輸入賬戶和密碼。

[distutils]
index-servers=pypi

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

5.將命令列定位到此資料夾下,輸入命令對dist目錄下的pagtest-1.0.0.tar.gzt包進行上傳,twine為Python包需要安裝:

twine upload dist/*

製作python包為wheel檔案

wheel是一個已經編譯好的包,在安裝時不需要編譯過程,安裝whl檔案時要比釋出的原始檔安裝要快。

在如上第2步後,輸入如下命令即可在生成.whl

python setup.py bdist_wheel

.whl檔案在dist目錄下,上傳到PyPI:

twine upload dist/*

更新Python包

修改setup.py中的版本號,然後直接上傳即可

以上這篇將python包釋出到PyPI和製作whl檔案方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。