venv --- 仮想環境の作成

Added in version 3.3.

ソースコード: Lib/venv/


venv モジュールは、軽量な「仮想環境」の作成に対応しています。 各仮想環境は、それぞれの site ディレクトリに独立した Python パッケージ群を持ちます。 仮想環境は、インストール済みの Python を土台に作成されます。 これを仮想環境の「ベース」の Python と呼びます。 デフォルトではベース環境のパッケージから隔離され、仮想環境に明示的にインストールしたパッケージだけが利用できます。 詳細は 仮想環境 と site の 仮想環境のドキュメント を参照してください。

仮想環境の中から使われると、 pip のような一般的なインストールツールは明示的に指定しなくても仮想環境に Python パッケージをインストールします。

仮想環境には、以下のような特徴があります:

  • プロジェクト (ライブラリやアプリケーション) に必要な、特定の Python インタープリタ、ソフトウェアライブラリ、バイナリを格納します。 デフォルトでは、他の仮想環境のソフトウェアや、オペレーティングシステムにインストールされた Python インタープリタやライブラリから隔離されます。

  • 1 つのディレクトリに格納されます。 慣習的には、プロジェクト内の .venv や venv という名前のディレクトリ、 または ~/.virtualenvs など、多数の仮想環境をまとめるディレクトリの下に作成します。

  • Git などのソース管理システムには登録しません。

  • 使い捨て可能なものとして扱います。 削除して最初から簡単に作り直せるようにすべきです。 プロジェクトのコードは環境内に置きません。

  • 移動やコピーをするものとは考えません。 目的の場所に同じ環境を作り直します。

Python仮想環境の背景についてより詳しくは PEP 405 を参照してください。

利用可能な環境: not Android, not iOS, not WASI.

このモジュールは モバイルプラットフォーム と WebAssemblyプラットフォーム をサポートしません。

仮想環境の作成

仮想環境 は、venv モジュールを実行して作成します:

python -m venv /path/to/new/virtual/environment

これにより、対象のディレクトリ (必要であれば親ディレクトリも) が作成され、 コマンドを実行した Python のインストール先を指す home キーを持つ pyvenv.cfg ファイルが配置されます。 また、Python 実行ファイルのコピーまたはシンボリックリンクを格納する bin サブディレクトリ (Windows では Scripts) を作成します。 コピーとシンボリックリンクのどちらを使うかは、プラットフォームや環境作成時の引数に応じて決まります。 lib/pythonX.Y/site-packages サブディレクトリも作成します (Windows では Lib\site-packages)。 既存のディレクトリを指定した場合は、そのディレクトリを再利用します。

バージョン 3.5 で変更: 仮想環境の作成には、 venv の使用が今は推奨されています。

バージョン 3.6 で非推奨、バージョン 3.8 で削除: Python 3.3 と 3.4 では、仮想環境の作成に pyvenv が推奨されていました。 3.5 では、代わりに venv を直接実行する方法になりました。

Windows では、 venv コマンドは次のように実行します:

PS> python -m venv C:\path\to\new\virtual\environment

このコマンドを -h をつけて実行すると利用できるオプションが表示されます:

usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]
            [--without-scm-ignore-files]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.
ENV_DIR

環境を作成するディレクトリを指定する必須の引数です。

--system-site-packages

仮想環境からシステムの site-packages ディレクトリを利用できるようにします。

プラットフォームのデフォルトがシンボリックリンクでない場合でも、コピーではなくシンボリックリンクの使用を試みます。

--copies

プラットフォームのデフォルトがシンボリックリンクである場合でも、シンボリックリンクではなくコピーの使用を試みます。

--clear

環境のディレクトリがすでに存在する場合、環境を作成する前にその内容を削除します。

--upgrade

Python が同じ場所で更新されたことを前提に、環境のディレクトリをこのバージョンの Python を使うように更新します。

--without-pip

仮想環境への pip のインストールや更新を行いません (デフォルトでは pip がインストールされます)。

--prompt <PROMPT>

この環境のプロンプトに使う別の接頭辞を指定します。

--upgrade-deps

中核となる依存パッケージ (pip) を PyPI の最新バージョンに更新します。

--without-scm-ignore-files

環境のディレクトリにソース管理システム (SCM) の除外ファイルを追加しません (デフォルトでは Git に対応しています)。

バージョン 3.4 で変更: デフォルトで pip をインストールします。--without-pip と --copies オプションを追加しました。

バージョン 3.4 で変更: 以前のバージョンでは、対象となるディレクトリが既に存在していた場合は、 --clear オプションや --upgrade オプションを付けない限りはエラーを送出していました。

バージョン 3.9 で変更: pip と setuptools を PyPI の最新版に更新する --upgrade-deps オプションを追加しました。

バージョン 3.12 で変更: setuptools は venv の中核となる依存パッケージではなくなりました。

バージョン 3.13 で変更: --without-scm-ignore-files オプションが追加されました。

バージョン 3.13 で変更: venv はデフォルトで Git 用の .gitignore ファイルを作成するようになりました。

注釈

Windows でもシンボリックリンクはサポートされていますが、シンボリックリンクを使うのは推奨されません。 特に注目すべきなのは、ファイルエクスプローラ上で python.exe をダブルクリックすると、シンボリックリンクを貪欲に解決し仮想環境を無視するということです。

注釈

Microsoft Windows では、ユーザー向けの実行ポリシーを設定して Activate.ps1 スクリプトが使えるようにする必要があるかもしれません。 この設定は次の PowerShell コマンドでできます:

PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

さらに詳しくは About Execution Policies を参照してください。

作成された pyvenv.cfg ファイルには、include-system-site-packages キーも含まれます。これは venv が --system-site-packages オプションをつけて実行されたなら true で、そうでなければ false です。

--without-pip オプションを指定しない限り、仮想環境に pip をインストールするために ensurepip が呼び出されます。

venv には複数のパスを渡すことができ、その場合はそれぞれのパスに同一の仮想環境が作成されます。

仮想環境のしくみ

Python インタプリタが仮想環境で実行しているとき、sys.prefix と sys.exec_prefix は仮想環境のディレクトリを指し示し、 sys.base_prefix と sys.base_exec_prefix は仮想環境の作成に使われたベース Python のディレクトリを指し示します。sys.prefix != sys.base_prefix を調べれば、現在のインタプリタが仮想環境で実行しているかを判定できます。

仮想環境は、そのバイナリディレクトリ (POSIX では bin、Windows では Scripts) 内のスクリプトで「有効化」できます。 この操作は、ディレクトリを PATH の先頭に追加します。 その結果、python を実行するとその環境の Python インタープリタが起動し、インストール済みのスクリプトもフルパスを指定せずに実行できます。 有効化スクリプトの呼び出し方法はプラットフォームによって異なります (<venv> は仮想環境のディレクトリのパスに置き換えてください):

プラットフォーム

シェル

仮想環境を有効化するためのコマンド

POSIX

bash/zsh

$ source <venv>/bin/activate

fish

$ source <venv>/bin/activate.fish

csh/tcsh

$ source <venv>/bin/activate.csh

pwsh

$ <venv>/bin/Activate.ps1

Windows

cmd.exe

C:\> <venv>\Scripts\activate.bat

PowerShell

PS C:\> <venv>\Scripts\Activate.ps1

Added in version 3.4: fish および csh の有効化スクリプト。

Added in version 3.8: PowerShell Core のサポートのために POSIX 環境にインストールされた、PowerShell 有効化スクリプト。

Python を呼び出すときに仮想環境の Python インタプリタへのフルパスを指定すれば良いだけなので、仮想環境をアクティベートする 必要 はありません。さらに、仮想環境にインストールされたすべてのスクリプトはアクティベートせずとも実行可能なはずです。

これを達成するため、仮想環境にインストールされたスクリプトは、仮想環境の Python インタープリターを指し示す "shebang" の行 #!/<path-to-venv>/bin/python を含みます。つまり、PATH の値に関係なくそのスクリプトはそのインタープリターを使って実行されます。Windows では、"shebang" の行の処理は Python インストールマネージャ がインストールされていれば可能です。したがって、Windows のエクスプローラのウィンドウで、インストールされたスクリプトをダブルクリックすると、仮想環境をアクティベートしたり PATH を編集したりしなくても、正しいインタープリターでスクリプトが実行されるはずです。

仮想環境がアクティベートされると、VIRTUAL_ENV 環境変数の値が仮想環境へのパスに設定されます。アクティベートしなくても仮想環境を使うことは可能なため、仮想環境が使われているか否かの判断を VIRTUAL_ENV に頼ることはできません。

警告

仮想環境にインストールされたスクリプトは仮想環境がアクティベートされていることを前提とすべきではないため、shebang の行は仮想環境のインタプリタへの絶対パスを含みます。このため、本質的に、仮想環境は一般の場合ポータブルではありません。いつでも仮想環境を再作成できる簡単な方法を持っておくべきです(例えば、requirements.txt という requirements ファイルがあれば、仮想環境の pip を用いて、pip install -r requirements.txt を呼び出すことで、仮想環境が必要とするすべてのパッケージをインストールできます)。何らかの理由で仮想環境を別の場所に移動する必要がある場合は、新しい場所で仮想環境を再作成し、古い場所にある仮想環境を削除してください。仮想環境の親ディレクトリを移動したため仮想環境も移動された場合は、新しい場所で仮想環境を再作成する必要があります。さもなくば、仮想環境にインストールされたソフトウェアが想定通りに動作しない可能性があります。

シェルで deactivate と入力することで仮想環境を無効化できます。 厳密な仕組みはプラットフォーム固有であり、内部の実装詳細です (たいていはスクリプトかシェル関数が使われます)。

API

上述の高水準のメソッドは、サードパーティの仮想環境の作成者が環境の作成を必要に応じてカスタマイズするための機構を提供する簡素な API を利用します。それが EnvBuilder クラスです。

class venv.EnvBuilder(system_site_packages=False, clear=False, symlinks=False, upgrade=False, with_pip=False, prompt=None, upgrade_deps=False, *, scm_ignore_files=frozenset())

EnvBuilder クラスを実体化するときに、以下のキーワード引数を受け取ります:

  • system_site_packages -- 真偽値で、システムの Python の site-packages を仮想環境から利用できるかどうかを示します (デフォルト: False)。

  • clear -- 真偽値で、真の場合環境を作成する前に既存の対象ディレクトリの中身を削除します。

  • symlinks -- 真偽値で、Python のバイナリをコピーせずにシンボリックの作成を試みるかどうかを示します。

  • upgrade -- 真偽値で、真の場合実行中の Python で既存の環境をアップグレードします。その Python がインプレースでアップグレードされたときに用います。デフォルトは False です。

  • with_pip -- 真偽値で、真の場合仮想環境に pip がインストールされていることを保証します。--default-pip オプションで ensurepip を使用します。

  • prompt -- 仮想環境がアクティベートされたときに使う文字列(デフォルトは None のため、仮想環境のディレクトリ名が使われます)。もし特殊な文字列 "." が渡された場合、カレントディレクトリのベース名がプロンプトとして用いられます。

  • upgrade_deps -- venv のベースのモジュールを PyPI での最新版にアップデートします。

  • scm_ignore_files -- イテラブルで指定されたソース管理システム (SCM) の除外ファイルを作成します。 create_{scm}_ignore_file という名前のメソッドを定義すると、対応する SCM を扱えるようになります。 デフォルトで対応している値は create_git_ignore_file() による "git" だけです。

バージョン 3.4 で変更: with_pip 引数が追加されました。

バージョン 3.6 で変更: prompt 引数が追加されました。

バージョン 3.9 で変更: upgrade_deps 引数が追加されました。

バージョン 3.13 で変更: scm_ignore_files 引数が追加されました。

EnvBuilder は基底クラスとして使えます。

create(env_dir)

仮想環境を持つことになるターゲットディレクトリ (絶対パスあるいは現在のディレクトリからの相対パス) を指定し、仮想環境を作成します。 create メソッドは、指定されたディレクトリに仮想環境を構築するか、適切な例外を送出します。

EnvBuilder クラスの create メソッドは、サブクラスのカスタマイズに使えるフックを説明します:

def create(self, env_dir):
    """
    ディレクトリに Python 仮想環境を作成する。
    env_dir は環境を作成する対象ディレクトリ。
    """
    env_dir = os.path.abspath(env_dir)
    context = self.ensure_directories(env_dir)
    self.create_configuration(context)
    self.setup_python(context)
    self.setup_scripts(context)
    self.post_setup(context)

メソッド ensure_directories(), create_configuration(), setup_python(), setup_scripts(), post_setup() はそれぞれオーバーライドできます。

ensure_directories(env_dir)

仮想環境のディレクトリとすべての必要なサブディレクトリのうちまだ存在しないものを作成し、コンテキストオブジェクトを返します。このコンテキストオブジェクトは他のメソッドで使うために(パスなどの)属性を保持しているだけです。もし EnvBuilder が clear=True の引数で作成された場合、仮想環境のディレクトリの中身は消去され、すべての必要なサブディレクトリが再作成されます。

返されるコンテキストオブジェクトは以下の属性を持った types.SimpleNamespace です:

  • env_dir - 仮想環境の場所。アクティベートスクリプトの中の __VENV_DIR__ で使われます(install_scripts() を参照してください)。

  • env_name - 仮想環境の名前。アクティベートスクリプトの中の __VENV_NAME__ で使われます(install_scripts() を参照してください)。

  • prompt - アクティベートスクリプトで使われるプロンプト。アクティベートスクリプトの中の __VENV_PROMPT__ で使われます(install_scripts() を参照してください)。

  • executable - 仮想環境の元になっている Python 実行可能ファイル。これは仮想環境が別の仮想環境から作られた場合も考慮に入れます。

  • inc_path - 仮想環境の include パス。

  • lib_path - 仮想環境の purelib パス。

  • platlib_path - 仮想環境の platlib パス。

  • bin_path - 仮想環境のスクリプトのパス。

  • bin_name - 仮想環境の場所に相対的な、スクリプトのパス。アクティベートスクリプトの中の __VENV_BIN_NAME__ で使われます(install_scripts() を参照してください)。

  • env_exe - 仮想環境の中の Python インタプリタの名前。アクティベートスクリプトの中の __VENV_PYTHON__ で使われます(install_scripts() を参照してください)。

  • env_exec_cmd - ファイルシステムのリダイレクトを考慮に入れた、Python インタプリタの名前。これは仮想環境の中で Python を実行するのに使えます。

バージョン 3.11 で変更: venv システム構成インストールスキーム は作成されたディレクトリのパスを構築するために使われます。

バージョン 3.12 で変更: コンテキストに lib_path 属性が追加され、コンテキストオブジェクトがドキュメントに追加されました。

バージョン 3.15 で変更: コンテキストに platlib_path 属性を追加しました。

create_configuration(context)

仮想環境に pyvenv.cfg 設定ファイルを作成します。

setup_python(context)

Python 実行ファイルのコピーまたはシンボリックリンクを仮想環境に作成します。 POSIX システムで、特定の python3.x 実行ファイルが使われている場合、同じ名前のファイルが既に存在していない限り、 python および python3 へのシンボリックリンクがその実行ファイルを指すように作成されます。

setup_scripts(context)

プラットフォームに対応した有効化スクリプトを仮想環境にインストールします。

upgrade_dependencies(context)

仮想環境内で、venv の中核となる依存パッケージ (現在は pip) を更新します。 この処理は、環境内の pip 実行ファイルを外部コマンドとして呼び出して行います。

Added in version 3.9.

バージョン 3.12 で変更: setuptools は venv の中核となる依存パッケージではなくなりました。

post_setup(context)

サードパーティーライブラリがオーバーライドするための空のメソッドです。このメソッドをオーバーライドして、仮想環境構築後にパッケージのプリインストールなどのステップを実装できます。

install_scripts(context, path)

サブクラスの setup_scripts() や post_setup() からこのメソッドを呼び出すと、仮想環境への独自スクリプトのインストールに役立ちます。

path は common, posix, nt ディレクトリを格納したディレクトリへのパスです。各サブディレクトリには仮想環境の bin ディレクトリにインストールするスクリプトを格納します。 common の中身と、 os.name に一致するディレクトリの中身を、以下の置換処理を行いながらコピーします:

  • __VENV_DIR__ は仮想環境ディレクトリの絶対パスに置換されます。

  • __VENV_NAME__ は仮想環境の名前 (仮想環境ディレクトリのパスの最後の部分) に置換されます。

  • __VENV_PROMPT__ はプロンプトに置換されます (括弧で囲まれ空白が続く環境名)。

  • __VENV_BIN_NAME__ は bin ディレクトリ名 (bin か Scripts) に置換されます。

  • __VENV_PYTHON__ は仮想環境の Python 実行ファイルの絶対パスに置換されます。

(既存環境のアップグレード中は) ディレクトリは存在しても構いません。

create_git_ignore_file(context)

仮想環境内に .gitignore ファイルを作成し、そのディレクトリ全体がソース管理システムの Git で無視されるようにします。

Added in version 3.13.

バージョン 3.7.2 で変更: Windows では、実際のバイナリをコピーする代わりに、python[w].exe としてリダイレクト用スクリプトを使うようになりました。 3.7.2 に限り、ソースツリー内でビルドした Python を実行している場合を除き、setup_python() は何もしません。

バージョン 3.7.3 で変更: Windows では、 setup_scripts() の代わりに setup_python() の一部としてリダイレクトを行うスクリプトをコピーします。 これは 3.7.2 には当てはまりません。 シンボリックリンクを使ったときは、元の実行ファイルへのリンクを作成します。

モジュールレベルの簡易関数もあります:

venv.create(env_dir, system_site_packages=False, clear=False, symlinks=False, with_pip=False, prompt=None, upgrade_deps=False, *, scm_ignore_files=frozenset())

EnvBuilder を指定されたキーワード引数を使って作成し、その create() メソッドに env_dir 引数を渡して実行します。

Added in version 3.3.

バージョン 3.4 で変更: with_pip 引数が追加されました。

バージョン 3.6 で変更: prompt 引数が追加されました。

バージョン 3.9 で変更: upgrade_deps 引数が追加されました。

バージョン 3.13 で変更: scm_ignore_files 引数が追加されました。

EnvBuilder を拡張する例

次のスクリプトで、作成された仮想環境に setuptools と pip をインストールするサブクラスを実装して EnvBuilder を拡張する方法を示します:

import os
import os.path
from subprocess import Popen, PIPE
import sys
from threading import Thread
from urllib.parse import urlsplit
from urllib.request import urlretrieve
import venv

class ExtendedEnvBuilder(venv.EnvBuilder):
    """
    This builder installs setuptools and pip so that you can pip or
    easy_install other packages into the created virtual environment.

    :param nodist: If true, setuptools and pip are not installed into the
                   created virtual environment.
    :param nopip: If true, pip is not installed into the created
                  virtual environment.
    :param progress: If setuptools or pip are installed, the progress of the
                     installation can be monitored by passing a progress
                     callable. If specified, it is called with two
                     arguments: a string indicating some progress, and a
                     context indicating where the string is coming from.
                     The context argument can have one of three values:
                     'main', indicating that it is called from virtualize()
                     itself, and 'stdout' and 'stderr', which are obtained
                     by reading lines from the output streams of a subprocess
                     which is used to install the app.

                     If a callable is not specified, default progress
                     information is output to sys.stderr.
    """

    def __init__(self, *args, **kwargs):
        self.nodist = kwargs.pop('nodist', False)
        self.nopip = kwargs.pop('nopip', False)
        self.progress = kwargs.pop('progress', None)
        self.verbose = kwargs.pop('verbose', False)
        super().__init__(*args, **kwargs)

    def post_setup(self, context):
        """
        Set up any packages which need to be pre-installed into the
        virtual environment being created.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        os.environ['VIRTUAL_ENV'] = context.env_dir
        if not self.nodist:
            self.install_setuptools(context)
        # Can't install pip without setuptools
        if not self.nopip and not self.nodist:
            self.install_pip(context)

    def reader(self, stream, context):
        """
        Read lines from a subprocess' output stream and either pass to a progress
        callable (if specified) or write progress information to sys.stderr.
        """
        progress = self.progress
        while True:
            s = stream.readline()
            if not s:
                break
            if progress is not None:
                progress(s, context)
            else:
                if not self.verbose:
                    sys.stderr.write('.')
                else:
                    sys.stderr.write(s.decode('utf-8'))
                sys.stderr.flush()
        stream.close()

    def install_script(self, context, name, url):
        _, _, path, _, _ = urlsplit(url)
        fn = os.path.split(path)[-1]
        binpath = context.bin_path
        distpath = os.path.join(binpath, fn)
        # Download script into the virtual environment's binaries folder
        urlretrieve(url, distpath)
        progress = self.progress
        if self.verbose:
            term = '\n'
        else:
            term = ''
        if progress is not None:
            progress('Installing %s ...%s' % (name, term), 'main')
        else:
            sys.stderr.write('Installing %s ...%s' % (name, term))
            sys.stderr.flush()
        # Install in the virtual environment
        args = [context.env_exe, fn]
        p = Popen(args, stdout=PIPE, stderr=PIPE, cwd=binpath)
        t1 = Thread(target=self.reader, args=(p.stdout, 'stdout'))
        t1.start()
        t2 = Thread(target=self.reader, args=(p.stderr, 'stderr'))
        t2.start()
        p.wait()
        t1.join()
        t2.join()
        if progress is not None:
            progress('done.', 'main')
        else:
            sys.stderr.write('done.\n')
        # Clean up - no longer needed
        os.unlink(distpath)

    def install_setuptools(self, context):
        """
        Install setuptools in the virtual environment.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        url = "https://bootstrap.pypa.io/ez_setup.py"
        self.install_script(context, 'setuptools', url)
        # clear up the setuptools archive which gets downloaded
        pred = lambda o: o.startswith('setuptools-') and o.endswith('.tar.gz')
        files = filter(pred, os.listdir(context.bin_path))
        for f in files:
            f = os.path.join(context.bin_path, f)
            os.unlink(f)

    def install_pip(self, context):
        """
        Install pip in the virtual environment.

        :param context: The information for the virtual environment
                        creation request being processed.
        """
        url = 'https://bootstrap.pypa.io/get-pip.py'
        self.install_script(context, 'pip', url)


def main(args=None):
    import argparse

    parser = argparse.ArgumentParser(prog=__name__,
                                     description='Creates virtual Python '
                                                 'environments in one or '
                                                 'more target '
                                                 'directories.')
    parser.add_argument('dirs', metavar='ENV_DIR', nargs='+',
                        help='A directory in which to create the '
                             'virtual environment.')
    parser.add_argument('--no-setuptools', default=False,
                        action='store_true', dest='nodist',
                        help="Don't install setuptools or pip in the "
                             "virtual environment.")
    parser.add_argument('--no-pip', default=False,
                        action='store_true', dest='nopip',
                        help="Don't install pip in the virtual "
                             "environment.")
    parser.add_argument('--system-site-packages', default=False,
                        action='store_true', dest='system_site',
                        help='Give the virtual environment access to the '
                             'system site-packages dir.')
    if os.name == 'nt':
        use_symlinks = False
    else:
        use_symlinks = True
    parser.add_argument('--symlinks', default=use_symlinks,
                        action='store_true', dest='symlinks',
                        help='Try to use symlinks rather than copies, '
                             'when symlinks are not the default for '
                             'the platform.')
    parser.add_argument('--clear', default=False, action='store_true',
                        dest='clear', help='Delete the contents of the '
                                           'virtual environment '
                                           'directory if it already '
                                           'exists, before virtual '
                                           'environment creation.')
    parser.add_argument('--upgrade', default=False, action='store_true',
                        dest='upgrade', help='Upgrade the virtual '
                                             'environment directory to '
                                             'use this version of '
                                             'Python, assuming Python '
                                             'has been upgraded '
                                             'in-place.')
    parser.add_argument('--verbose', default=False, action='store_true',
                        dest='verbose', help='Display the output '
                                             'from the scripts which '
                                             'install setuptools and pip.')
    options = parser.parse_args(args)
    if options.upgrade and options.clear:
        raise ValueError('you cannot supply --upgrade and --clear together.')
    builder = ExtendedEnvBuilder(system_site_packages=options.system_site,
                                   clear=options.clear,
                                   symlinks=options.symlinks,
                                   upgrade=options.upgrade,
                                   nodist=options.nodist,
                                   nopip=options.nopip,
                                   verbose=options.verbose)
    for d in options.dirs:
        builder.create(d)

if __name__ == '__main__':
    rc = 1
    try:
        main()
        rc = 0
    except Exception as e:
        print('Error: %s' % e, file=sys.stderr)
    sys.exit(rc)

このスクリプトは オンライン よりダウンロードすることも可能です。