打包發布Python模組的方法詳解_python

來源:互聯網
上載者:User

前言

昨天把自己的VASP檔案處理庫進行了打包並上傳到PyPI,現在可以直接通過pip和easy_install來安裝VASPy啦(同時歡迎使用VASP做計算化學的童鞋們加星和參與進來),

VASPy的GotHub地址:https://github.com/PytLab/VASPy
VASPy的PyPI地址:https://pypi.python.org/pypi/vaspy/

由於自己的記性真是不咋地,怕時間久了就忘了,於是在這裡趁熱打鐵以自己的VASPy程式為例對python的打包和上傳進行下總結。

VASPy包檔案結構

首先寫貼上來VASPy包的整個檔案結構, 後面的內容都是以此為例進行說明:

VASPy/├── LICENSE├── MANIFEST├── MANIFEST.in├── README.rst├── requirements.txt├── scripts│  ├── change_incar_parameters.py│  ├── create_inputs.py│  └── ...├── setup.cfg├── setup.py├── tests│  ├── incar_test.py│  ├── __init__.py│  ├── oszicar_test.py│  ├── outcar_test.py│  ├── testdata│  │  ├── CONTCAR│  │  ├── DOS_SUM│  │  ├── ELFCAR│  │  └── ...│  └── ...└── vaspy  ├── __init__.py  ├── iter.py  ├── matstudio.py  └── ... 4 directories, 54 files

打包和安裝第三方包的工具

這裡我們需要藉助setuptools和pip等工具進行自己包的打包和發布以及安裝,如果需要構建成wheel還需要安裝wheel模組。如果python版本>=2.7.9或者>=3.4,setuptools和pip是已經安裝好的,可能需要進行更新到最新版本

pip install -U pip setuptools

可以使用包管理工具,例如

yum install pipsudo apt-get install pip

通過get-pip.py指令碼安裝,如果檢測到沒有安裝wheel和setuptools也會自動安裝

python get-pip.py

具體的工具安裝和介紹就不多講了,可以請參考requirements for installing packages

包中不同檔案的作用

setup.py

這個檔案是打包整個項目最重要的檔案,它裡面提供了兩個主要的功能:

setup()函數,此函數的參數指定了如何配置自己的項目。
命令列工具,包括打包,測試,發布等。可以通過下面的命令查看;

python setup.py --help-commands

setup.cfg

此檔案包含了構建時候的一些預設參數例如構建bdist_wheel的時候的--universal參數

[bdist_wheel]universal=1

這樣每次打包的時候就會預設使用--universal參數了,效果類似:

python setup.py bdist_wheel --universal

README.rst

這個最初我是用markdown寫的,打包發布到PyPI之後發現PyPI不支援markdown的渲染,頁面上真是一片混亂,於是就用reStrutruedText的文法重新寫了一遍。畢竟標記語言文法基本上可以秒上手,實在不行找個模板比葫蘆畫瓢就行。
reStructureText的文法規則可參考官方文檔:Quick reStructuredText

其實還有一種方法就是使用pandoc將markdown轉換成rst格式,一種省事的方式就是使用pyandoc模組在發布的時候自動轉換。
具體方法可以參考:Use Markdown README's in Python modules

MANIFEST.in

此檔案在打包的時候告訴setuptools還需要額外打包那些檔案,例如我VASPy中的單元測試的測試資料檔案我就使用這個檔案將其包含進來。當然README,LICENSE這些也可以通過它來一起打包進來。
下面是我自己的MANIFEST.in的內容:

include README.rstinclude requirements.txtinclude LICENSErecursive-include scripts *recursive-include tests *

具體的文法規則可以參考:The MANIFEST.in template

vaspy/

此檔案夾就是vaspy原始碼所在的包。

tests/

此檔案夾也是一個子包,包含了單元測試指令碼,為了能使用python setup.py test進行單元測試,特地添加了__init__.pys使其成為一個包。

setup()的參數

這裡只介紹我使用的幾個參數,其他參數的具體使用可以參考:https://docs.python.org/3/distutils/setupscript.html

name

versions = "vaspy"

是整個項目的名字,打包後會使用此名字和版本號碼。

version

from vaspy import __version__version = __version__

description

是一個簡短的對項目的描述,一般一句話就好,會顯示在pypi上名字下端。

long_description

是一個長的描述,相當於對項目的一個簡潔,如果此字串是rst格式的,PyPI會自動渲染成HTML顯示。這裡可以直接讀取README.rst中的內容。

url

包的串連,通常為GitHub上的連結或者readthedocs的連結。

packages

需要包含的子包列表,setuptools提供了find_packages()協助我們在根路徑下尋找包,這個函數distutil是沒有的。

setup_requires

這個參數定義了VASPy安裝和順利運行所需要的其他依賴項(最基本的),使用pip安裝的時候會對這些依賴項進行安裝。
關於這個參數與requirements.txt的區別可以參考:install_requires vs Requirements files

classifier

這個參數提供了一系列的分類,在PyPI上會將其放入不同的目錄中講項目進行歸類。
具體的categories的名稱和規則參考:https://pypi.python.org/pypi?%3Aaction=list_classifiers

test_suite

這個參數可以協助我們使用

python setup.py test

來跑單元測試,再也不需要單獨再寫一個指令碼例如run_tests.py這樣來跑單元測試了。
此參數的官方解釋:

A string naming a unittest.TestCase subclass (or a package or module containing one or more of them, or a method of such a subclass), or naming a function that can be called with no arguments and returns a unittest.TestSuite. If the named suite is a module, and the module has an additional_tests() function, it is called and the results are added to the tests to be run. If the named suite is a package, any submodules and subpackages are recursively added to the overall test suite.

也就是說這個參數可以接受多種類型的參數:

接收unittest.TestCase子類,我們可以講所有單元測試寫入一個測試案例中,然後import進來,再傳你給test_suite
接收函數對象,此函數對象沒有任何參數,且返回一個unittest.TestSuite.這樣我們就可以單獨寫一個函數,將多個測試案例合并成一個suite然後返回,然後再將函數import進來傳給test_suite。

模組和包名稱,我就是使用這種方式,之前自己的測試都是分開的多個指令碼,這樣我添加一個__init__.py就可以將其變成一個包,將包名傳給test_suite,setuptools就會神奇的將此包下的所有測試全部跑一邊,這樣我以後再加測試指令碼的時候直接就添加新的指令碼就好了,其他的都不需要改動了。

運行效果:

zjshao@SHAO-PC:/mnt/d/Dropbox/Code/CentOS_code/VASPy$ python setup.py testrunning testrunning egg_infocreating vaspy.egg-infowriting vaspy.egg-info/PKG-INFOwriting top-level names to vaspy.egg-info/top_level.txtwriting dependency_links to vaspy.egg-info/dependency_links.txtwriting manifest file 'vaspy.egg-info/SOURCES.txt'reading manifest file 'vaspy.egg-info/SOURCES.txt'reading manifest template 'MANIFEST.in'writing manifest file 'vaspy.egg-info/SOURCES.txt'running build_exttest_compare (tests.incar_test.InCarTest)Make sure we can compare two InCar objects correctly. ... oktest_eq (tests.incar_test.InCarTest)Test __eq__() function. ... ok...此處省略若干輸出 ----------------------------------------------------------------------Ran 22 tests in 3.574s OK

發布自己的python包

1. 首先先去PyPI註冊帳號

2. 配置~/.pypirc如下:

[distutils]index-servers =  pypi  pypitest [pypi]username:ShaoZhengjiangpassword:mypassword [pypitest]username:ShaoZhengjiangpassword:mypassword

3. 然後註冊並上傳自己的包到測試伺服器

pypi提供了一個測試伺服器,我們可以在這個測試伺服器上做測試。

python setup.py register -r pypitest

然後

python setup.py sdist upload -r pypitest

若沒有問題我們應該不會得到任何錯誤。

4. 上傳至PyPI

若上面的測試成功,我們就可以按照相同的步驟將包註冊並上傳。

python setup.py register -r pypipython setup.py sdist upload -r pypi

Ok,之後我們就可以在PyPI(https://pypi.python.org/pypi/vaspy/)上看到我們自己的包了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.