2. セットアップスクリプトの作成—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/distutils/setupscript
移動先:案内検索

2.2。 セットアップスクリプトの作成

ノート

このドキュメントは、 https://setuptools.readthedocs.io/en/latest/setuptools.htmlのsetuptoolsドキュメントが、現在ここに含まれているすべての関連情報を個別にカバーするまでのみ保持されます。


セットアップスクリプトは、Distutilsを使用してモジュールを構築、配布、およびインストールする際のすべてのアクティビティの中心です。 セットアップスクリプトの主な目的は、モジュールの配布をDistutilsに記述して、モジュールを操作するさまざまなコマンドが正しいことを実行できるようにすることです。 上記のセクション A Simple Example で見たように、セットアップスクリプトは主にsetup()の呼び出しで構成され、モジュール開発者によってDistutilsに提供されるほとんどの情報はへのキーワード引数として提供されます。 X218X] 。

これはもう少し複雑な例です。これについては、次の2つのセクションで説明します。Distutils独自のセットアップスクリプトです。 (DistutilsはPython 1.6以降に含まれていますが、Python 1.5.2ユーザーが他のモジュールディストリビューションをインストールするために使用できるように、独立した存在でもあることに注意してください。 ここに示すDistutils独自のセットアップスクリプトは、Python1.5.2にパッケージをインストールするために使用されます。)

#!/usr/bin/env python

from distutils.core import setup

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='[email protected]',
      url='https://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
     )

これと、セクション簡単な例に示されている簡単な1ファイル配布との違いは、メタデータの増加と、モジュールではなくパッケージごとの純粋なPythonモジュールの仕様の2つだけです。 Distutilsは(これまでのところ)2つのパッケージに分割された数十のモジュールで構成されているため、これは重要です。 すべてのモジュールの明示的なリストは、生成するのが面倒で、維持するのが困難です。 追加のメタデータの詳細については、セクション追加のメタデータを参照してください。

セットアップスクリプトで提供されるパス名(ファイルまたはディレクトリ)は、Unixの規則を使用して記述する必要があることに注意してください。 スラッシュ区切り。 Distutilsは、実際にパス名を使用する前に、このプラットフォームに依存しない表現を現在のプラットフォームで適切なものに変換します。 これにより、セットアップスクリプトがオペレーティングシステム間で移植可能になります。これはもちろん、Distutilsの主要な目標の1つです。 この精神では、このドキュメントのすべてのパス名はスラッシュで区切られています。

もちろん、これはDistutils関数に指定されたパス名にのみ適用されます。 たとえば、 glob.glob()os.listdir()などの標準のPython関数を使用してファイルを指定する場合は、ハードコーディングする代わりにポータブルコードを記述するように注意する必要があります。パスセパレータ:

glob.glob(os.path.join('mydir', 'subdir', '*.html'))
os.listdir(os.path.join('mydir', 'subdir'))

2.1。 パッケージ全体のリスト

packagesオプションは、packagesリストに記載されている各パッケージにあるすべての純粋なPythonモジュールを処理(ビルド、配布、インストールなど)するようにDistutilsに指示します。 もちろん、これを行うには、パッケージ名とファイルシステム内のディレクトリが対応している必要があります。 デフォルトの対応は最も明白なものです。 パッケージ distutils は、配布ルートに関連するディレクトリdistutilsにあります。 したがって、セットアップスクリプトでpackages = ['foo']と言うと、Distutilsが次のファイルfoo/__init__.py(システムではスペルが異なる場合がありますが、アイデアは得られます)を見つけることを約束します。セットアップスクリプトが存在するディレクトリ。 この約束を破ると、Distutilsは警告を発しますが、とにかく壊れたパッケージを処理します。

別の規則を使用してソースディレクトリをレイアウトする場合、それは問題ありません。package_dirオプションを指定するだけで、Distutilsに規則について通知できます。 たとえば、すべてのPythonソースをlibの下に置き、「ルートパッケージ」内のモジュール(つまり、パッケージにまったく含まれていない)がlibにあり、モジュールがfooパッケージはlib/fooなどに含まれています。 それからあなたは置くでしょう

package_dir = {'': 'lib'}

セットアップスクリプトで。 この辞書のキーはパッケージ名であり、空のパッケージ名はルートパッケージを表します。 値は、配布ルートに関連するディレクトリ名です。 この場合、packages = ['foo']と言うと、ファイルlib/foo/__init__.pyが存在することを約束しています。

もう1つの可能な規則は、fooパッケージをlibに、foo.barパッケージをlib/barに配置することです。 これは、セットアップスクリプトで次のように記述されます。

package_dir = {'foo': 'lib'}

package_dirディクショナリのpackage: dirエントリは、パッケージの下のすべてのパッケージに暗黙的に適用されるため、foo.barの場合はここで自動的に処理されます。 この例では、packages = ['foo', 'foo.bar']があると、Distutilsはlib/__init__.pylib/bar/__init__.pyを探すように指示されます。 (package_dirは再帰的に適用されますが、packages内のすべてのパッケージを明示的にリストする必要があることに注意してください。Distutilsはではなくソースツリーを再帰的にスキャンして、 __init__.pyファイル。)


2.2。 個々のモジュールの一覧表示

小規模なモジュール配布の場合、パッケージを一覧表示するのではなく、すべてのモジュールを一覧表示することをお勧めします。特に、「ルートパッケージ」に含まれる単一のモジュールの場合(つまり、パッケージがまったくない場合)。 この最も単純なケースは、セクション簡単な例に示されています。 これはもう少し複雑な例です:

py_modules = ['mod1', 'pkg.mod2']

これは、2つのモジュールについて説明しています。1つは「ルート」パッケージにあり、もう1つはpkgパッケージにあります。 この場合も、デフォルトのパッケージ/ディレクトリレイアウトは、これら2つのモジュールがmod1.pypkg/mod2.pyにあり、pkg/__init__.pyも存在することを意味します。 また、package_dirオプションを使用して、パッケージ/ディレクトリの対応を上書きできます。


2.3。 拡張モジュールの説明

Python拡張モジュールの作成が純粋なPythonモジュールの作成よりも少し複雑であるように、それらをDistutilsに記述することも少し複雑です。 純粋なモジュールとは異なり、モジュールまたはパッケージをリストして、Distutilsが出て適切なファイルを見つけることを期待するだけでは十分ではありません。 拡張名、ソースファイル、およびコンパイル/リンクの要件(ディレクトリ、リンク先のライブラリなど)を指定する必要があります。

これはすべて、setup()への別のキーワード引数であるext_modulesオプションを介して行われます。 ext_modulesは、 Extension インスタンスの単なるリストであり、それぞれが単一の拡張モジュールを記述しています。 ディストリビューションにfooと呼ばれ、foo.cによって実装された単一の拡張機能が含まれているとします。 コンパイラ/リンカへの追加の命令が必要ない場合、この拡張機能の説明は非常に簡単です。

Extension('foo', ['foo.c'])

Extensionクラスは、setup()とともに distutils.core からインポートできます。 したがって、この1つの拡張機能のみを含み、他には何も含まないモジュール配布のセットアップスクリプトは次のようになります。

from distutils.core import setup, Extension
setup(name='foo',
      version='1.0',
      ext_modules=[Extension('foo', ['foo.c'])],
      )

Extensionクラス(実際には、 build_ext コマンドによって実装される基盤となる拡張機能構築機構)は、Python拡張機能を記述する際に非常に柔軟性があります。これについては、次のセクションで説明します。

2.3.1。 拡張機能の名前とパッケージ

Extension コンストラクターの最初の引数は、パッケージ名を含め、常に拡張機能の名前です。 例えば、

Extension('foo', ['src/foo1.c', 'src/foo2.c'])

ルートパッケージに存在する拡張機能について説明しますが、

Extension('pkg.foo', ['src/foo1.c', 'src/foo2.c'])

pkgパッケージの同じ拡張機能について説明します。 ソースファイルと結果のオブジェクトコードはどちらの場合も同じです。 唯一の違いは、ファイルシステムのどこにあるか(したがって、Pythonの名前空間階層のどこにあるか)、結果の拡張機能が存在することです。

すべて同じパッケージに(またはすべて同じ基本パッケージに)多数の拡張機能がある場合は、ext_packageキーワード引数をsetup()に使用します。 例えば、

setup(...,
      ext_package='pkg',
      ext_modules=[Extension('foo', ['foo.c']),
                   Extension('subpkg.bar', ['bar.c'])],
     )

foo.cを拡張子pkg.fooにコンパイルし、bar.cpkg.subpkg.barにコンパイルします。


2.3.2。 拡張ソースファイル

Extension コンストラクターの2番目の引数は、ソースファイルのリストです。 Distutilsは現在C、C ++、およびObjective-C拡張機能のみをサポートしているため、これらは通常C / C ++ / Objective-Cソースファイルです。 (C ++ソースファイルを区別するために、必ず適切な拡張子を使用してください。.cc.cppは、UnixコンパイラとWindowsコンパイラの両方で認識されるようです。)

ただし、SWIGインターフェイス(.i)ファイルをリストに含めることもできます。 build_ext コマンドは、SWIG拡張機能の処理方法を知っています。インターフェイスファイルでSWIGを実行し、結果のC / C ++ファイルを拡張機能にコンパイルします。

この警告にもかかわらず、SWIGへのオプションは現在次のように渡すことができます。

setup(...,
      ext_modules=[Extension('_foo', ['foo.i'],
                             swig_opts=['-modern', '-I../include'])],
      py_modules=['foo'],
     )

または、次のようなコマンドラインで:

> python setup.py build_ext --swig-opts="-modern -I../include"

一部のプラットフォームでは、コンパイラによって処理され、拡張機能に含まれる非ソースファイルを含めることができます。 現在、これは、Visual C ++のWindowsメッセージテキスト(.mc)ファイルとリソース定義(.rc)ファイルを意味します。 これらはバイナリリソース(.res)ファイルにコンパイルされ、実行可能ファイルにリンクされます。


2.3.3。 プリプロセッサオプション

Extension への3つのオプションの引数は、検索するインクルードディレクトリ、または定義/定義解除するプリプロセッサマクロを指定する必要がある場合に役立ちます:include_dirsdefine_macros、および [X183X ]。

たとえば、拡張機能で配布ルートの下のincludeディレクトリにヘッダーファイルが必要な場合は、include_dirsオプションを使用します。

Extension('foo', ['foo.c'], include_dirs=['include'])

そこで絶対ディレクトリを指定できます。 拡張機能が/usrにインストールされたX11R6を備えたUnixシステムでのみ構築されることがわかっている場合は、

Extension('foo', ['foo.c'], include_dirs=['/usr/include/X11'])

コードを配布する予定がある場合は、このような移植性のない使用法を避ける必要があります。次のようなCコードを作成することをお勧めします。

#include <X11/Xlib.h>

他のPython拡張機能からのヘッダーファイルをインクルードする必要がある場合は、Distutils install_headers コマンドによってヘッダーファイルが一貫した方法でインストールされるという事実を利用できます。 たとえば、数値Pythonヘッダーファイルは(標準のUnixインストールで)/usr/local/include/python1.5/Numericalにインストールされます。 (正確な場所は、プラットフォームとPythonのインストールによって異なります。)Pythonインクルードディレクトリ(この場合は/usr/local/include/python1.5)は、Python拡張機能を構築するときに常に検索パスに含まれるため、Cを記述するのが最善の方法です。次のようなコード

#include <Numerical/arrayobject.h>

ただし、Numericalインクルードディレクトリをヘッダー検索パスに直接配置する必要がある場合は、Distutils distutils.sysconfig モジュールを使用してそのディレクトリを見つけることができます。

from distutils.sysconfig import get_python_inc
incdir = os.path.join(get_python_inc(plat_specific=1), 'Numerical')
setup(...,
      Extension(..., include_dirs=[incdir]),
      )

これは非常に移植性が高く、プラットフォームに関係なく、どのPythonインストールでも機能しますが、Cコードを適切な方法で記述する方がおそらく簡単です。

define_macrosおよびundef_macrosオプションを使用して、プリプロセッサマクロを定義および定義解除できます。 define_macros(name, value)タプルのリストを取ります。ここで、nameは定義するマクロの名前(文字列)であり、valueはその値です。文字列またはNone。 (マクロFOONoneに定義することは、Cソースの裸の#define FOOと同等です。ほとんどのコンパイラでは、これによりFOOが文字列[ X154X] 。)undef_macrosは、定義を解除するマクロの単なるリストです。

例えば:

Extension(...,
          define_macros=[('NDEBUG', '1'),
                         ('HAVE_STRFTIME', None)],
          undef_macros=['HAVE_FOO', 'HAVE_BAR'])

これは、すべてのCソースファイルの先頭にあるのと同じです。

#define NDEBUG 1
#define HAVE_STRFTIME
#undef HAVE_FOO
#undef HAVE_BAR

2.3.4。 ライブラリオプション

拡張機能を構築するときにリンクするライブラリと、それらのライブラリを検索するディレクトリを指定することもできます。 librariesオプションはリンク先のライブラリのリスト、library_dirsはリンク時にライブラリを検索するディレクトリのリスト、runtime_library_dirsはリンク先のディレクトリのリストです。実行時に共有(動的にロードされる)ライブラリを検索します。

たとえば、ターゲットシステムの標準ライブラリ検索パスにあることがわかっているライブラリに対してリンクする必要がある場合

Extension(...,
          libraries=['gdbm', 'readline'])

非標準の場所にあるライブラリとリンクする必要がある場合は、その場所をlibrary_dirsに含める必要があります。

Extension(...,
          library_dirs=['/usr/X11R6/lib'],
          libraries=['X11', 'Xt'])

(繰り返しになりますが、コードを配布する場合は、この種の移植性のない構造は避ける必要があります。)


2.3.5。 別のオプション

特別な場合を処理するために使用できる他のいくつかのオプションがまだあります。

optionalオプションはブール値です。 trueの場合、拡張機能でビルドが失敗してもビルドプロセスは中止されませんが、失敗した拡張機能はインストールされません。

extra_objectsオプションは、リンカに渡されるオブジェクトファイルのリストです。 コンパイラのデフォルトの拡張子が使用されるため、これらのファイルには拡張子を付けないでください。

extra_compile_argsおよびextra_link_argsを使用して、それぞれのコンパイラおよびリンカコマンドラインに追加のコマンドラインオプションを指定できます。

export_symbolsはWindowsでのみ役立ちます。 エクスポートするシンボル(関数または変数)のリストを含めることができます。 コンパイルされた拡張機能を構築する場合、このオプションは必要ありません。Distutilsは、エクスポートされたシンボルのリストにinitmoduleを自動的に追加します。

dependsオプションは、拡張子が依存するファイル(ヘッダーファイルなど)のリストです。 ビルドコマンドは、ソースのコンパイラを呼び出して、このファイルのいずれかが前回のビルド以降に変更されている場合、拡張子を再構築します。


2.4。 ディストリビューションとパッケージの関係

ディストリビューションは、次の3つの特定の方法でパッケージに関連する場合があります。

  1. パッケージまたはモジュールが必要になる場合があります。
  2. パッケージまたはモジュールを提供できます。
  3. パッケージやモジュールを廃止する可能性があります。

これらの関係は、 distutils.core.setup()関数のキーワード引数を使用して指定できます。

他のPythonモジュールおよびパッケージへの依存関係は、 require キーワード引数をsetup()に指定することで指定できます。 値は文字列のリストである必要があります。 各文字列は、必要なパッケージと、オプションで十分なバージョンを指定します。

モジュールまたはパッケージの任意のバージョンが必要であることを指定するには、文字列は完全にモジュールまたはパッケージ名で構成されている必要があります。 例としては、'mymodule'および'xml.parsers.expat'があります。

特定のバージョンが必要な場合は、括弧内に一連の修飾子を指定できます。 各修飾子は、比較演算子とバージョン番号で構成されます。 受け入れられる比較演算子は次のとおりです。

<    >    ==
<=   >=   !=

これらは、コンマ(およびオプションの空白)で区切られた複数の修飾子を使用して組み合わせることができます。 この場合、すべての修飾子が一致している必要があります。 論理積は、評価を組み合わせるために使用されます。

たくさんの例を見てみましょう:

式が必要 説明
==1.0 バージョン1.0のみが互換性があります
>1.0, !=1.5.1, <2.0 1.0より前の2.0より前のバージョンは、1.5.1を除いて互換性があります。

依存関係を指定できるようになったので、他のディストリビューションが必要とする可能性のあるものを指定できるようにする必要もあります。 これは、setup()への provides キーワード引数を使用して行われます。 このキーワードの値は文字列のリストであり、各文字列はPythonモジュールまたはパッケージに名前を付け、オプションでバージョンを識別します。 バージョンが指定されていない場合は、ディストリビューションのバージョンと一致すると見なされます。

いくつかの例:

式を提供します 説明
mypkg 配布バージョンを使用して、mypkgを提供します
mypkg (1.1) 配布バージョンに関係なく、mypkgバージョン1.1を提供します

パッケージは、 obsoletes キーワード引数を使用して、他のパッケージを廃止することを宣言できます。 この値は、 require キーワードの値と似ています。つまり、モジュールまたはパッケージの指定子を指定する文字列のリストです。 各指定子は、モジュール名またはパッケージ名と、それに続く1つ以上のバージョン修飾子で構成されます。 バージョン修飾子は、モジュール名またはパッケージ名の後に括弧で囲まれて示されています。

修飾子によって識別されるバージョンは、説明されているディストリビューションによって廃止されたバージョンです。 修飾子が指定されていない場合、指定されたモジュールまたはパッケージのすべてのバージョンが廃止されたと見なされます。


2.5。 スクリプトのインストール

これまで、純粋なPythonモジュールと純粋でないPythonモジュールを扱ってきました。これらは通常、単独では実行されず、スクリプトによってインポートされます。

スクリプトは、コマンドラインから開始することを目的としたPythonソースコードを含むファイルです。 スクリプトでは、Distutilsが非常に複雑なことを行う必要はありません。 唯一の巧妙な機能は、スクリプトの最初の行が#!で始まり、「python」という単語が含まれている場合、Distutilsが最初の行を調整して現在のインタープリターの場所を参照することです。 デフォルトでは、現在のインタプリタの場所に置き換えられます。 --executable(または-e)オプションを使用すると、インタープリターパスを明示的にオーバーライドできます。

scriptsオプションは、単にこの方法で処理されるファイルのリストです。 PyXMLセットアップスクリプトから:

setup(...,
      scripts=['scripts/xmlproc_parse', 'scripts/xmlproc_val']
      )

バージョン3.1で変更:テンプレートが提供されていない場合、すべてのスクリプトもMANIFESTファイルに追加されます。 配布するファイルの指定を参照してください。


2.6。 パッケージデータのインストール

多くの場合、追加のファイルをパッケージにインストールする必要があります。 これらのファイルは、多くの場合、パッケージの実装に密接に関連するデータ、またはパッケージを使用するプログラマーが関心を持つ可能性のあるドキュメントを含むテキストファイルです。 これらのファイルはパッケージデータと呼ばれます。

パッケージデータは、setup()関数のpackage_dataキーワード引数を使用してパッケージに追加できます。 値は、パッケージ名からパッケージにコピーする必要のある相対パス名のリストへのマッピングである必要があります。 パスは、パッケージを含むディレクトリからの相対パスとして解釈されます(package_dirマッピングからの情報が適切な場合に使用されます)。 つまり、ファイルはソースディレクトリのパッケージの一部であることが期待されます。 それらにはグロブパターンも含まれる場合があります。

パス名にはディレクトリ部分が含まれる場合があります。 必要なディレクトリはすべてインストール時に作成されます。

たとえば、パッケージに複数のデータファイルを含むサブディレクトリが含まれている必要がある場合、ファイルはソースツリーで次のように配置できます。

setup.py
src/
    mypkg/
        __init__.py
        module.py
        data/
            tables.dat
            spoons.dat
            forks.dat

setup()への対応する呼び出しは次のようになります。

setup(...,
      packages=['mypkg'],
      package_dir={'mypkg': 'src/mypkg'},
      package_data={'mypkg': ['data/*.dat']},
      )

バージョン3.1で変更:テンプレートが提供されていない場合、package_dataに一致するすべてのファイルがMANIFESTファイルに追加されます。 配布するファイルの指定を参照してください。


2.7。 追加ファイルのインストール

data_filesオプションを使用して、モジュール配布に必要な追加ファイル(構成ファイル、メッセージカタログ、データファイル、前のカテゴリに当てはまらないもの)を指定できます。

data_filesは、(ディレクトリファイル)ペアのシーケンスを次のように指定します。

setup(...,
      data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
                  ('config', ['cfg/data.cfg'])],
     )

シーケンス内の各(ディレクトリファイル)ペアは、インストールディレクトリとそこにインストールするファイルを指定します。

files の各ファイル名は、パッケージソースディストリビューションの上部にあるsetup.pyスクリプトに関連して解釈されます。 データファイルがインストールされるディレクトリを指定することはできますが、データファイル自体の名前を変更することはできないことに注意してください。

ディレクトリは相対パスである必要があります。 これは、インストールプレフィックス(システムインストールの場合はPythonのsys.prefix、ユーザーインストールの場合はsite.USER_BASE)に関連して解釈されます。 Distutilsでは、ディレクトリを絶対インストールパスにすることができますが、ホイールパッケージ形式と互換性がないため、これはお勧めしません。 ファイルのディレクトリ情報は、インストールされたファイルの最終的な場所を決定するために使用されません。 ファイルの名前のみが使用されます。

data_filesオプションは、ターゲットディレクトリを指定せずにファイルの単純なシーケンスとして指定できますが、これはお勧めできません。この場合、 install コマンドは警告を出力します。 データファイルをターゲットディレクトリに直接インストールするには、ディレクトリとして空の文字列を指定する必要があります。

バージョン3.1で変更:テンプレートが提供されていない場合、data_filesに一致するすべてのファイルがMANIFESTファイルに追加されます。 配布するファイルの指定を参照してください。


2.8。 追加のメタデータ

セットアップスクリプトには、名前とバージョン以外の追加のメタデータが含まれる場合があります。 この情報には次のものが含まれます。

メタデータ 説明 価値 ノート
name パッケージの名前 短い文字列 (1)
version このリリースのバージョン 短い文字列 (1)(2)
author パッケージの作者の名前 短い文字列 (3)
author_email パッケージ作成者のメールアドレス 電子メールアドレス (3)
maintainer パッケージメンテナの名前 短い文字列 (3)
maintainer_email パッケージメンテナのメールアドレス 電子メールアドレス (3)
url パッケージのホームページ URL (1)
description パッケージの短い要約説明 短い文字列
long_description パッケージの詳細説明 長い文字列 (4)
download_url パッケージをダウンロードできる場所 URL
classifiers 分類子のリスト 文字列のリスト (6)(7)
platforms プラットフォームのリスト 文字列のリスト (6)(8)
keywords キーワードのリスト 文字列のリスト (6)(8)
license パッケージのライセンス 短い文字列 (5)

ノート:

  1. これらのフィールドは必須です。
  2. バージョンは major.minor [.patch [.sub]] の形式にすることをお勧めします。
  3. 作成者またはメンテナのいずれかを特定する必要があります。 メンテナが提供されている場合、distutilsはそれをPKG-INFOの作成者としてリストします。
  4. long_descriptionフィールドは、パッケージを公開するときにPyPIがプロジェクトページを構築するために使用します。
  5. licenseフィールドは、パッケージをカバーするライセンスを示すテキストであり、ライセンスは「ライセンス」Trove分類子からの選択ではありません。 Classifierフィールドを参照してください。 licence配布オプションが廃止されましたが、licenseのエイリアスとして機能することに注意してください。
  6. このフィールドはリストである必要があります。
  7. 有効な分類子は PyPI にリストされています。
  8. 下位互換性を維持するために、このフィールドは文字列も受け入れます。 カンマ区切りの文字列'foo, bar'を渡すと、['foo', 'bar']に変換されます。それ以外の場合は、1つの文字列のリストに変換されます。
「短い文字列」
200文字以下の1行のテキスト。
「長い文字列」
reStructuredText形式のプレーンテキストの複数行( http://docutils.sourceforge.net/ を参照)。
「文字列のリスト」
下記参照。

バージョン情報のエンコードはそれ自体が芸術です。 Pythonパッケージは通常、バージョン形式 major.minor [.patch] [sub] に準拠しています。 ソフトウェアの初期の実験的なリリースのメジャー番号は0です。 パッケージ内の主要なマイルストーンを表すリリースに対して増分されます。 重要な新機能がパッケージに追加されると、マイナー番号が増加します。 パッチ番号は、バグ修正リリースが行われると増加します。 追加の後続バージョン情報は、サブリリースを示すために使用されることがあります。 これらは、「a1、a2、…、aN」(機能とAPIが変更される可能性のあるアルファリリースの場合)、「b1、b2、…、bN」(バグを修正するだけのベータリリースの場合)、および「pr1、pr2、… 、prN」(最終的なプレリリースリリーステスト用)。 いくつかの例:

0.1.0
パッケージの最初の実験的なリリース
1.0.1a2
1.0の最初のパッチバージョンの2番目のアルファリリース

classifiersはリストで指定する必要があります。

setup(...,
      classifiers=[
          'Development Status :: 4 - Beta',
          'Environment :: Console',
          'Environment :: Web Environment',
          'Intended Audience :: End Users/Desktop',
          'Intended Audience :: Developers',
          'Intended Audience :: System Administrators',
          'License :: OSI Approved :: Python Software Foundation License',
          'Operating System :: MacOS :: MacOS X',
          'Operating System :: Microsoft :: Windows',
          'Operating System :: POSIX',
          'Programming Language :: Python',
          'Topic :: Communications :: Email',
          'Topic :: Office/Business',
          'Topic :: Software Development :: Bug Tracking',
          ],
      )

バージョン3.7で変更: setup は、classifierskeywords、またはplatformsフィールドがリストまたはストリング。


2.9。 セットアップスクリプトのデバッグ

時々物事がうまくいかず、セットアップスクリプトが開発者が望むことをしません。

Distutilsは、セットアップスクリプトの実行時に例外をキャッチし、スクリプトが終了する前に簡単なエラーメッセージを出力します。 この動作の動機は、Pythonについてあまり詳しくなく、パッケージをインストールしようとしている管理者を混乱させないことです。 彼らがDistutilsの内臓の奥深くから大きく長いトレースバックを取得した場合、パッケージまたはPythonのインストールが壊れていると考える可能性があります。これは、最後まで読んでおらず、アクセス許可の問題であることがわかっているためです。

一方、これは開発者が失敗の原因を見つけるのに役立ちません。 この目的のために、 DISTUTILS_DEBUG環境変数は空の文字列以外に設定でき、distutilsは実行内容に関する詳細情報を出力し、例外が発生したときに完全なトレースバックをダンプします。 、および外部プログラム(Cコンパイラなど)が失敗したときにコマンドライン全体を出力します。