ホームページ  >  記事  >  バックエンド開発  >  Pythonモジュールをパッケージ化して公開する方法の詳細な説明

Pythonモジュールをパッケージ化して公開する方法の詳細な説明

高洛峰
高洛峰オリジナル
2017-02-22 17:03:171671ブラウズ

前書き

昨日、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 モジュールを使用してマークダウンを自動的に変換することです。出版すること。

具体的な方法については、次を参照してください: Python モジュールで Markdown README を使用する


MANIFEST.in

このファイルは、パッケージ化するときにどの追加ファイルをパッケージ化する必要があるかを setuptools に指示します。たとえば、このファイルを のテスト データ ファイルに使用します。 VASPy に単体テストを含めます。もちろん、README と LICENSE を一緒にパッケージ化することもできます。

以下は私自身の MANIFEST.in の内容です:

include README.rst
include requirements.txt
include LICENSE
recursive-include scripts *
recursive-include tests *

特定の文法規則については、次を参照してください: MANIFEST.in テンプレート

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中文网!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。