kenkovlog

Haskell, Python, Vim, ...

Python のライセンスと標準ライブラリ、サードパーティライブラリのimport について

Python のモジュールを公開するにあたって気になったことが あったので、ライセンスについて調べてみました。

まずは基本

そもそもPython のライセンスは PSF License (Python Software Foundation License) です。 これはBSD スタイルのGPL 互換のライセンス となっています。 BSD ライセンスとの主な違いは、「被許諾者はPython 2.7.3に加えた変更の要約を当該成果物に含めること」でしょうか。 バージョン番号は古いですが 翻訳 もあるので、参考にしてください。

標準ライブラリについても 一部を除いてPSF License となっているようです。

標準ライブラリをimport する

僕が疑問に思ったのは次のようなことです。
例えば、次のようなモジュールを作成した時、

#! /usr/bin/env python
# coding:utf-8
import datetime
def now():
    return datetime.datetime.now()

ライセンス条文にある

PSFのライセンス契約、およびPSFの著作権表示、「Copyright (c) 2001 Python Software Foundation; All Rights Reserved」を記載する

必要があるかどうか分かりませんでした。
これについては、詳しくPSF ライセンスの条文を見てみると

2. 本ライセンス契約に定める諸条件に従って、PSFは被許諾者に対し、
単体もしくは派生バージョンのPython 2.1.1を複製、解析、テスト、
公然と実行および/または表示、派生成果物の作成、頒布、その他の方法で使用する非独占的な、
権利使用料無料の、世界規模のライセンスを付与します。
ただし、単体または被許諾者が作成する派生バージョンのPython 2.1.1に、PSFのライセンス契約、
およびPSFの著作権表示、すなわち「Copyright (c) 2001 Python Software Foundation; All Rights Reserved」
を記載することを条件とします。

と書いてあります。 この

ただし、単体または被許諾者が作成する派生バージョンのPython 2.1.1に、

というところがポイントで、「単体または...派生バージョンの...」と書いてあります。
import しただけではPython 単体を使用しているわけではないので、派生バージョンかどうかを考えれば よいことになります。 派生バージョンのソフトウェアと考えられるものとしては

があり、 派生ソフトウェアと見なさない行為として

  • 単なる同梱
  • API を介した呼出
  • OSS による作業

があるということです。 (詳しくは 知る、読む、使う! オープンソースライセンス を参照のこと)
このことから、標準ライブラリをインポートして使うだけであればこれは単なるAPI 呼びだし(コンパイルしていないので静的、動的リンクはしない) なので

PSFのライセンス契約、およびPSFの著作権表示、すなわち「Copyright (c) 2001 Python Software Foundation; All Rights Reserved」を記載する

必要はないと考えられます。

僕ははじめ、import すると派生バージョンになるのかと思っていたのがそもそもの勘違いの元でした。

サードパーティライブラリをインポートする

サードパーティライブラリをインポートするようなモジュールを作成する時はどうでしょうか? 例えばMIT ライセンスのサードパーティライブラリをインポートする時を考えてみましょう。 ただし、サードパーティライブラリはインポートするのみで、同梱したりはせず、インストールするように README などに書いておくものとします。
MIT ライセンスの条文を読んでみると

以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべての人に対し、
ソフトウェアを無制限に扱うことを無償で許可します。これには、ソフトウェアの複製を使用、複写、変更、結合、掲載、頒布、
サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じことを許可する権利も無制限に含まれます。

上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。

と書いてあります。関連する箇所は

ソフトウェアの複製を使用、複写、変更、結合、掲載、頒布、
サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じことを許可する権利も無制限に含まれます。

ですね。
さて、ライブラリをインポートしただけでは上記のものにはあてはまらないと考えられます。 (掲載があやしいですが、英語ではpublish であり、おそらくソースコードの掲載、公開などを意味するのでしょう)

また、BSD ライセンス の場合も同様に 必要ないと考えられます。

ただ、MIT ライセンスとBSD ライセンスのライブラリをimport している実際のモジュールを見てみると、NOTICE ファイルに著作権表示と承諾許諾表示を書いているものが多いですね; 書いた方がよいのでしょうか?

GPL ライセンスの場合も同様にして、(この場合は)コピーレフトは適用されないと考えられます。 例えば、GPL ライセンスのサードパーティライブラリをimport のみ(同梱はしない)してMIT ライセンスのモジュールを作成することが可能です。 しかし、リンクしてバイナリコードに変換したり、サードパーティライブラリを同梱して頒布したりする場合には全体をGPL に適用しなくてはいけません。 つまりこの場合は

サードパーティライブラリ: GPL
自分のモジュール:         MIT
-------------------------------
まとめて頒布: GPL

という形になるでしょう。

py2exe を使うとき

py2exe を使うときは、実行可能なバイナリコードを作成するので、上記に述べたライセンスの話はあてはまりません。 なぜなら、import したライブラリのバイナリコードが複製されて頒布されるからです。 この場合は各ライセンス条項をしっかりと読んで対応しましょう。 (例えばGPL のライブラリを使用したらコピーレフトになるなど。)

まとめ

そもそもimport すると派生ソフトウェアになるのか? という疑問から今回ライセンスについて調べました。 結論からいうと、import しただけでは派生ソフトウェアにならず著作権表示やライセンス許諾表示を記載する必要 はないようです。(コピーレフトも同様)
もっと簡単に言えば、import したライブラリのソースコード(もしくはコンパイル済みであればバイナリコード) を少しでも含むか含まないかで判断したらよさそうです。もちろん、正確には条文を読まなければなりませんが;
import したソースコードを同梱(再頒布) したりpy2exe でバイナリコードに変換したりした場合には 再頒布となるため、 その限りではなく、各ライセンス条文を読んで理解する必要があります。