如何製作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中的版本號,然後直接上傳即可

參考:

wheel和egg的不同 
怎樣將自己寫的包傳達到PyPi 
發佈你自己的輪子 - PyPI打包上傳實踐 
PyPI官網上傳包教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章