home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Python/setup.pyによるインストール

Python/setup.pyによるインストール

Python / setup.pyによるインストール
id: 373 所有者: msakamoto-sf    作成日: 2009-04-30 23:11:36
カテゴリ: Python 

Python1.6移行はDistutilsというパッケージが追加され*1、これに含まれるsetup()メソッドを使ったインストールスクリプトがsetup.py.

サンプルも載っていて分かりやすいので、直接Pythonドキュメントを参照した方が早い。Python 2.5, 2.6.1 共に "Distributing Python Modules" というトップレベルセクションで説明されている。


モジュール(.py)をインストールするだけの単純な例

Pythonスクリプトファイル(=モジュール)をインストールするだけの簡単な例を示す。

C:\in_vitro\python\setup_pys\ex1\
    foo.py
    bar.py
    setup.py

setup.pyの中身

Pythonドキュメントの丸写しになるが、以下のスクリプトで最低限度事足りる。
setup.py:

from distutils.core import setup
setup(
    name='foo',
    version='1.0',
    py_modules=['foo', 'bar'],
    )

py_modulesに、".py"を除いたファイル名をリストアップする。

buildコマンド

通常は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

sdistコマンド

ソース配布用の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

bdistコマンド

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

installコマンド

基本的に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

アンインストールと"install --record ファイル名"オプション

"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/

"install --force"による上書きインストール

"--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

パッケージをインストールするサンプル2種

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. Pythonスクリプト中で直接sys.pathの要素を操作する。
  2. PYTHONHOME環境変数を編集し、プレフィクスを操作する。
  3. PYTHONPATH環境変数を編集し、探索ディレクトリを追加する。

1. と 3. の方法で、前掲の"C:\in_vitro\tmp\python"にインストールしたパッケージをimportしてみる。

Pythonスクリプト中で直接sys.pathの要素を操作する

単純に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環境変数を編集し、探索ディレクトリを追加する

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'

*1: 1.5.2までは独立したパッケージだった

プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2009-05-01 00:26:49
md5:c321b30e5274cf5063c50930c2285675
sha1:8f5de6947320587ec20f8d7a34d75059c566bfb4
コメント
コメントを投稿するにはログインして下さい。