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

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

Feb 22, 2017 pm 05:03 PM

前書き

昨日、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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? 中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

See all articles