Python1.6移行はDistutilsというパッケージが追加され(*1)、これに含まれるsetup()メソッドを使ったインストールスクリプトがsetup.py.
サンプルも載っていて分かりやすいので、直接Pythonドキュメントを参照した方が早い。Python 2.5, 2.6.1 共に "Distributing Python Modules" というトップレベルセクションで説明されている。
Pythonスクリプトファイル(=モジュール)をインストールするだけの簡単な例を示す。
C:\in_vitro\python\setup_pys\ex1\ foo.py bar.py setup.py
Pythonドキュメントの丸写しになるが、以下のスクリプトで最低限度事足りる。
setup.py:
from distutils.core import setup setup( name='foo', version='1.0', py_modules=['foo', 'bar'], )
py_modulesに、".py"を除いたファイル名をリストアップする。
通常はC言語で記述されたPython拡張モジュールをコンパイルする時に使う。今回はPythonスクリプトファイルしか含まれないので、単にbuildディレクトリの下にコピーされるだけ。
C:\in_vitro\python\setup_pys\ex1>python setup.py build running build running build_py creating build creating build\lib copying foo.py -> build\lib copying bar.py -> build\lib
→
C:\in_vitro\python\setup_pys\ex1 build\ lib\ foo.py bar.py
ソース配布用のzipファイルを生成する。
C:\in_vitro\python\setup_pys\ex1>python setup.py sdist running sdist warning: sdist: missing required meta-data: url warning: sdist: missing meta-data: either (author and author_email) or (maintainer and maintainer_email) must be supplied warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list) warning: sdist: standard file not found: should have one of README, README.txt writing manifest file 'MANIFEST' creating foo-1.0 copying files to foo-1.0... copying bar.py -> foo-1.0 copying foo.py -> foo-1.0 copying setup.py -> foo-1.0 creating dist creating 'dist\foo-1.0.zip' and adding 'foo-1.0' to it adding 'foo-1.0\bar.py' adding 'foo-1.0\foo.py' adding 'foo-1.0\PKG-INFO' adding 'foo-1.0\setup.py' removing 'foo-1.0' (and everything under it)
→
C:\in_vitro\python\setup_pys\ex1 dist\ foo-1.0.zip
RPMやWindowsインストーラEXEなど、各platform用の一般的なインストールパッケージを生成する。
以下の例では、"bdist_wininst"として明示的にWindowsインストーラEXEを生成させている。
C:\in_vitro\python\setup_pys\ex1>python setup.py bdist_wininst running bdist_wininst running build running build_py installing to build\bdist.win32\wininst running install_lib creating build\bdist.win32 creating build\bdist.win32\wininst creating build\bdist.win32\wininst\PURELIB copying build\lib\bar.py -> build\bdist.win32\wininst\PURELIB copying build\lib\foo.py -> build\bdist.win32\wininst\PURELIB running install_egg_info Writing build\bdist.win32\wininst\PURELIB\foo-1.0-py2.5.egg-info creating 'c:\docume~1\fengjing\locals~1\temp\tmpcpesih.zip' and adding '.' to it adding 'PURELIB\bar.py' adding 'PURELIB\foo-1.0-py2.5.egg-info' adding 'PURELIB\foo.py' removing 'build\bdist.win32\wininst' (and everything under it)
→
C:\in_vitro\python\setup_pys\ex1 dist\ foo-1.0.win32.exe
基本的にsite-packages以下にファイルをコピーする。但しhomeやprefixを指定することでかなり細かくインストール先を制御することもできる。
ディレクトリ指定のオプションだけでこれだけある。
Options for 'install' command: --prefix installation prefix --exec-prefix (Unix only) prefix for platform-specific files --home (Unix only) home directory to install under --install-base base installation directory (instead of --prefix or -- home) --install-platbase base installation directory for platform-specific files (instead of --exec-prefix or --home) --root install everything relative to this alternate root directory --install-purelib installation directory for pure Python module distributions --install-platlib installation directory for non-pure module distributions --install-lib installation directory for all module distributions (overrides --install-purelib and --install-platlib) --install-headers installation directory for C/C++ headers --install-scripts installation directory for Python scripts --install-data installation directory for data files
--dry-runまたは-nオプションを付けることで実際のファイルコピーの直前までをシミュレートできる。
C:\in_vitro\python\setup_pys\ex1>python setup.py --dry-run install running install running build running build_py running install_lib copying build\lib\bar.py -> C:\Python25\Lib\site-packages copying build\lib\foo.py -> C:\Python25\Lib\site-packages error: file 'C:\Python25\Lib\site-packages\bar.py' does not exist
通常のinstallコマンドではバイトコンパイルまで行ってくれる。
C:\in_vitro\python\setup_pys\ex1>python setup.py install running install running build running build_py running install_lib copying build\lib\bar.py -> C:\Python25\Lib\site-packages copying build\lib\foo.py -> C:\Python25\Lib\site-packages byte-compiling C:\Python25\Lib\site-packages\bar.py to bar.pyc byte-compiling C:\Python25\Lib\site-packages\foo.py to foo.pyc running install_egg_info Writing C:\Python25\Lib\site-packages\foo-1.0-py2.5.egg-info
"python setup.py uninstall" で検索すると分かるが、基本的にsetup.pyではアンインストール機能は提供していない。
但し、installコマンドのオプションで "--record ファイル名"を付けることで、"ファイル名"にコピーされたファイルの一覧が保存される。これを元にファイルを手動あるいはスクリプトを使って削除することができる。
> python setup.py install --record files.txt running install running build running build_py running install_lib copying build\lib\bar.py -> C:\Python25\Lib\site-packages copying build\lib\foo.py -> C:\Python25\Lib\site-packages byte-compiling C:\Python25\Lib\site-packages\bar.py to bar.pyc byte-compiling C:\Python25\Lib\site-packages\foo.py to foo.pyc running install_egg_info Writing C:\Python25\Lib\site-packages\foo-1.0-py2.5.egg-info writing list of installed files to 'files.txt'
files.txtの中身:
C:\Python25\Lib\site-packages\foo.py C:\Python25\Lib\site-packages\bar.py C:\Python25\Lib\site-packages\foo.pyc C:\Python25\Lib\site-packages\bar.pyc C:\Python25\Lib\site-packages\foo-1.0-py2.5.egg-info
see, "There is no setup.py uninstall « Motho ke motho ka botho",
http://kmandla.wordpress.com/2009/01/08/there-is-no-setuppy-uninstall/
"--force"オプションを付けることで、最新のファイルを強制的にコピーすることが出来る。
> python setup.py install --force running install running build running build_py running install_lib copying build\lib\bar.py -> C:\Python25\Lib\site-packages copying build\lib\baz.py -> C:\Python25\Lib\site-packages copying build\lib\foo.py -> C:\Python25\Lib\site-packages byte-compiling C:\Python25\Lib\site-packages\bar.py to bar.pyc byte-compiling C:\Python25\Lib\site-packages\baz.py to baz.pyc byte-compiling C:\Python25\Lib\site-packages\foo.py to foo.pyc running install_egg_info Removing C:\Python25\Lib\site-packages\foo-1.0-py2.5.egg-info Writing C:\Python25\Lib\site-packages\foo-1.0-py2.5.egg-info
Pythonスクリプトファイル(.py)だけで構成されたパッケージをインストールする場合のサンプルを載せる。
以下のようなソースツリーの場合、setup.pyから見たパッケージ名とディレクトリ名が一致しているので、"packages"にパッケージ名を指定するだけでよい。
C:\in_vitro\python\setup_pys\ex2 │ setup.py │ ├─testpkg1 │ foo.py │ __init__.py │ └─testpkg2 │ bar.py │ __init__.py │ └─sub baz.py __init__.py
setup.py :
from distutils.core import setup setup( name='foo', version='1.0', packages=['testpkg1', 'testpkg2', 'testpkg2.sub'], )
ex2> python setup.py install --record files.txt running install running build running build_py creating build creating build\lib creating build\lib\testpkg1 copying testpkg1\foo.py -> build\lib\testpkg1 copying testpkg1\__init__.py -> build\lib\testpkg1 creating build\lib\testpkg2 copying testpkg2\bar.py -> build\lib\testpkg2 copying testpkg2\__init__.py -> build\lib\testpkg2 creating build\lib\testpkg2\sub copying testpkg2\sub\baz.py -> build\lib\testpkg2\sub copying testpkg2\sub\__init__.py -> build\lib\testpkg2\sub running install_lib creating C:\Python25\Lib\site-packages\testpkg1 copying build\lib\testpkg1\foo.py -> C:\Python25\Lib\site-packages\testpkg1 copying build\lib\testpkg1\__init__.py -> C:\Python25\Lib\site-packages\testpkg1 creating C:\Python25\Lib\site-packages\testpkg2 copying build\lib\testpkg2\bar.py -> C:\Python25\Lib\site-packages\testpkg2 creating C:\Python25\Lib\site-packages\testpkg2\sub copying build\lib\testpkg2\sub\baz.py -> C:\Python25\Lib\site-packages\testpkg2\sub copying build\lib\testpkg2\sub\__init__.py -> C:\Python25\Lib\site-packages\testpkg2\sub copying build\lib\testpkg2\__init__.py -> C:\Python25\Lib\site-packages\testpkg2 byte-compiling C:\Python25\Lib\site-packages\testpkg1\foo.py to foo.pyc byte-compiling C:\Python25\Lib\site-packages\testpkg1\__init__.py to __init__.pyc byte-compiling C:\Python25\Lib\site-packages\testpkg2\bar.py to bar.pyc byte-compiling C:\Python25\Lib\site-packages\testpkg2\sub\baz.py to baz.pyc byte-compiling C:\Python25\Lib\site-packages\testpkg2\sub\__init__.py to __init__.pyc byte-compiling C:\Python25\Lib\site-packages\testpkg2\__init__.py to __init__.pyc running install_egg_info Writing C:\Python25\Lib\site-packages\foo-1.0-py2.5.egg-info writing list of installed files to 'files.txt'
files.txt :
C:\Python25\Lib\site-packages\testpkg1\foo.py C:\Python25\Lib\site-packages\testpkg1\__init__.py C:\Python25\Lib\site-packages\testpkg2\bar.py C:\Python25\Lib\site-packages\testpkg2\__init__.py C:\Python25\Lib\site-packages\testpkg2\sub\baz.py C:\Python25\Lib\site-packages\testpkg2\sub\__init__.py C:\Python25\Lib\site-packages\testpkg1\foo.pyc C:\Python25\Lib\site-packages\testpkg1\__init__.pyc C:\Python25\Lib\site-packages\testpkg2\bar.pyc C:\Python25\Lib\site-packages\testpkg2\__init__.pyc C:\Python25\Lib\site-packages\testpkg2\sub\baz.pyc C:\Python25\Lib\site-packages\testpkg2\sub\__init__.pyc C:\Python25\Lib\site-packages\foo-1.0-py2.5.egg-info
以下のような場合、setup.pyから見たソースディレクトリ名とパッケージ名が異なるため、別途"package_dir"オプションにてパッケージ名とディレクトリ名のマッチングを指定する。
C:\in_vitro\python\setup_pys\ex3 │ foo.py │ setup.py │ __init__.py │ └─src │ bar.py │ __init__.py │ └─abc baz.py __init__.py
setup.py :
from distutils.core import setup setup( name='foo', version='1.0', package_dir={'pkg1' : '', 'pkg2' : 'src', 'pkg2.sub' : 'src/abc'}, packages=['pkg1', 'pkg2', 'pkg2.sub'], )
package_dirにはパッケージ名をキーとして、setup.pyからの相対パスを値とする辞書を設定する。
上記例だとpkg1には空文字列を指定しているが、空文字列だとsetup.pyの置かれているディレクトリになる。
--prefixオプション付きで、異なるディレクトリにインストールしてみる。
> python setup.py install --prefix C:\in_vitro\tmp\python --record files.txt running install running build running build_py creating build creating build\lib creating build\lib\pkg1 copying foo.py -> build\lib\pkg1 copying __init__.py -> build\lib\pkg1 creating build\lib\pkg2 copying src\bar.py -> build\lib\pkg2 copying src\__init__.py -> build\lib\pkg2 creating build\lib\pkg2\sub copying src\abc\baz.py -> build\lib\pkg2\sub copying src\abc\__init__.py -> build\lib\pkg2\sub running install_lib creating C:\in_vitro\tmp\python\Lib creating C:\in_vitro\tmp\python\Lib\site-packages creating C:\in_vitro\tmp\python\Lib\site-packages\pkg1 copying build\lib\pkg1\foo.py -> C:\in_vitro\tmp\python\Lib\site-packages\pkg1 copying build\lib\pkg1\__init__.py -> C:\in_vitro\tmp\python\Lib\site-packages\pkg1 creating C:\in_vitro\tmp\python\Lib\site-packages\pkg2 copying build\lib\pkg2\bar.py -> C:\in_vitro\tmp\python\Lib\site-packages\pkg2 creating C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub copying build\lib\pkg2\sub\baz.py -> C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub copying build\lib\pkg2\sub\__init__.py -> C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub copying build\lib\pkg2\__init__.py -> C:\in_vitro\tmp\python\Lib\site-packages\pkg2 byte-compiling C:\in_vitro\tmp\python\Lib\site-packages\pkg1\foo.py to foo.pyc byte-compiling C:\in_vitro\tmp\python\Lib\site-packages\pkg1\__init__.py to __init__.pyc byte-compiling C:\in_vitro\tmp\python\Lib\site-packages\pkg2\bar.py to bar.pyc byte-compiling C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub\baz.py to baz.pyc byte-compiling C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub\__init__.py to __init__.pyc byte-compiling C:\in_vitro\tmp\python\Lib\site-packages\pkg2\__init__.py to __init__.pyc running install_egg_info Writing C:\in_vitro\tmp\python\Lib\site-packages\foo-1.0-py2.5.egg-info writing list of installed files to 'files.txt'
files.txt :
C:\in_vitro\tmp\python\Lib\site-packages\pkg1\foo.py C:\in_vitro\tmp\python\Lib\site-packages\pkg1\__init__.py C:\in_vitro\tmp\python\Lib\site-packages\pkg2\bar.py C:\in_vitro\tmp\python\Lib\site-packages\pkg2\__init__.py C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub\baz.py C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub\__init__.py C:\in_vitro\tmp\python\Lib\site-packages\pkg1\foo.pyc C:\in_vitro\tmp\python\Lib\site-packages\pkg1\__init__.pyc C:\in_vitro\tmp\python\Lib\site-packages\pkg2\bar.pyc C:\in_vitro\tmp\python\Lib\site-packages\pkg2\__init__.pyc C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub\baz.pyc C:\in_vitro\tmp\python\Lib\site-packages\pkg2\sub\__init__.pyc C:\in_vitro\tmp\python\Lib\site-packages\foo-1.0-py2.5.egg-info
パッケージの探索対象ディレクトリを調整するには、sys.pathを操作する。以下の調整で探索ディレクトリを操作できる。
1. と 3. の方法で、前掲の"C:\in_vitro\tmp\python"にインストールしたパッケージをimportしてみる。
単純にsys.path.append()で探索ディレクトリを末尾に追加してみる。
C:\in_vitro>python Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', 'C:\\WINDOWS\\system32\\python25.zip', ... , 'C:\\Python25\\lib\\site-packages'] >>> sys.path.append('C:\\in_vitro\\tmp\\python\\Lib\\site-packages') >>> sys.path ['', 'C:\\WINDOWS\\system32\\python25.zip', ..., 'C:\\Python25\\lib\\site-packages', 'C:\\in_vitro\\tmp\\python\\Lib\\site-packages'] >>> import pkg1 >>> import pkg2 >>> import pkg2.sub >>> pkg1.__file__ 'C:\\in_vitro\\tmp\\python\\Lib\\site-packages\\pkg1\\__init__.pyc'
PYTHONPATHで設定した場合、探索ディレクトリの頭に追加される。
C:\in_vitro>set PYTHONPATH=C:\in_vitro\tmp\python\Lib\site-packages C:\in_vitro>python Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', 'C:\\in_vitro\\tmp\\python\\Lib\\site-packages', 'C:\\WINDOWS\\system32\\python25.zip', ..., 'C:\\Python25\\lib\\site-packages'] >>> import pkg1 >>> import pkg2 >>> import pkg2.sub >>> pkg2.__file__ 'C:\\in_vitro\\tmp\\python\\Lib\\site-packages\\pkg2\\__init__.pyc'
コメント