前書き
昨日、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 pip sudo apt-get install pip
get-pip.py スクリプトを通じてインストールされます。wheel と setuptools がインストールされていないことが検出された場合、自動的にインストールされます
python get-pip.py
詳細については説明しません。特定のツールのインストールと導入については、パッケージのインストールの要件を参照してください
setup.py
このファイルは、プロジェクト全体をパッケージ化するための最も重要なファイルです。関数:
setup() 関数、この関数のパラメータ 独自のプロジェクトを構成する方法を指定します。
パッケージ化、テスト、公開などを含むコマンドラインツール。次のコマンドで表示できます。
python setup.py --help-commands
setup.cfg
このファイルには、bdist_wheel
[bdist_wheel] universal=1
をビルドするときの --universal パラメーターなど、ビルド時のいくつかのデフォルト パラメーターが含まれています。 --universal パラメーターは、初めてパッケージ化するときにデフォルトで使用され、効果は同様です:
python setup.py bdist_wheel --universal
README.rst
私はもともとこれをマークダウンで書きましたが、パッケージ化して PyPI に公開した後に、PyPI がマークダウン レンダリングをサポートしていないことがわかり、ページが非常にわかりにくくなったので、reStrutruedText 構文を使用して書き直しました。結局のところ、マークアップ言語の構文は基本的に数秒で学ぶことができます。それが本当に不可能な場合は、テンプレートを見つけてひょうたんを描くだけです。
reStructureText の構文ルールについては、公式ドキュメントを参照してください: Quick reStructuredText
実際、別の方法は、pandoc を使用してマークダウンを rst 形式に変換することです。問題のない方法は、pyandoc モジュールを使用してマークダウンを自動的に変換することです。出版すること。
MANIFEST.in
このファイルは、パッケージ化するときにどの追加ファイルをパッケージ化する必要があるかを setuptools に指示します。たとえば、このファイルを のテスト データ ファイルに使用します。 VASPy に単体テストを含めます。もちろん、README と LICENSE を一緒にパッケージ化することもできます。
以下は私自身の MANIFEST.in の内容です:include README.rst include requirements.txt include LICENSE recursive-include scripts * recursive-include tests *
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
はプロジェクトの短い説明で、通常は 1 文だけで、pypi 上の名前の一番下に表示されます。
long_description
は、プロジェクトの簡潔な説明に相当する長い説明です。この文字列が最初の形式の場合、PyPI はそれを表示用に HTML に自動的にレンダリングします。 README.rst の内容はここから直接読むことができます。
url
パッケージへのリンク。通常は GitHub 上のリンクまたは readthedocs へのリンク。
パッケージ
Setuptools には、ルート パス内のパッケージを見つけるのに役立つ find_packages() が用意されており、この機能は distutil にはありません。
setup_requires
このパラメータは、VASPy のインストールとスムーズな操作に必要な他の依存関係 (最も基本的な) を定義します。これらの依存関係は、pip を使用してインストールするときにインストールされます。
このパラメータとrequirements.txtの違いについては、install_requiresとRequirementsファイルを参照してください
classifier
このパラメータは、プロジェクトを分類するためにPyPI上の異なるディレクトリに配置される一連の分類を提供します。
特定のカテゴリ名とルールのリファレンス: 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 test running test running egg_info creating vaspy.egg-info writing vaspy.egg-info/PKG-INFO writing top-level names to vaspy.egg-info/top_level.txt writing dependency_links to vaspy.egg-info/dependency_links.txt writing 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_ext test_compare (tests.incar_test.InCarTest) Make sure we can compare two InCar objects correctly. ... ok test_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:ShaoZhengjiang password:mypassword [pypitest] username:ShaoZhengjiang password:mypassword
3. 然后注册并上传自己的包到测试服务器
pypi提供了一个测试服务器,我们可以在这个测试服务器上做测试。
python setup.py register -r pypitest
然后
python setup.py sdist upload -r pypitest
若没有问题我们应该不会得到任何错误。
4. 上传至PyPI
若上面的测试成功,我们就可以按照相同的步骤将包注册并上传。
python setup.py register -r pypi python setup.py sdist upload -r pypi
Ok,之后我们就可以在PyPI(https://pypi.python.org/pypi/vaspy/)上看到我们自己的包了。
更多打包发布Python模块的方法详解相关文章请关注PHP中文网!