"venv" --- 仮想環境の作成
*************************

Added in version 3.3.

**ソースコード:** Lib/venv/

======================================================================

"venv" モジュールは、軽量な仮想環境の作成を行います。それぞれの仮想環
境は、"site" ディレクトリに独立した Python パッケージの集合を持ってい
ます。仮想環境は、ベース Python とも呼ばれる、すでにインストールされて
いる Python の上に作成され、明示的にインストールしたパッケージのみが利
用可能となるよう、ベース Python から隔離することもできます。

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

A virtual environment is (amongst other things):

* Used to contain a specific Python interpreter and software libraries
  and binaries which are needed to support a project (library or
  application). These are by default isolated from software in other
  virtual environments and Python interpreters and libraries installed
  in the operating system.

* Contained in a directory, conventionally named ".venv" or "venv" in
  the project directory, or under a container directory for lots of
  virtual environments, such as "~/.virtualenvs".

* Not checked into source control systems such as Git.

* Considered as disposable -- it should be simple to delete and
  recreate it from scratch. You don't place any project code in the
  environment.

* Not considered as movable or copyable -- you just recreate the same
  environment in the target location.

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

参考:

  Python Packaging User Guide: Creating and using virtual environments

Availability: not Emscripten, not WASI.

This module does not work or is not available on WebAssembly platforms
"wasm32-emscripten" and "wasm32-wasi". See WebAssembly プラットフォー
ム for more information.


仮想環境の作成
==============

Virtual environments are created by executing the "venv" module:

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

This creates the target directory (including parent directories as
needed) and places a "pyvenv.cfg" file in it with a "home" key
pointing to the Python installation from which the command was run. It
also creates a "bin" (or "Scripts" on Windows) subdirectory containing
a copy or symlink of the Python executable (as appropriate for the
platform or arguments used at environment creation time). It also
creates a "lib/pythonX.Y/site-packages" subdirectory (on Windows, this
is "Libsite-packages"). If an existing directory is specified, it will
be re-used.

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

Deprecated since version 3.6, removed in version 3.8: **pyvenv** was
the recommended tool for creating virtual environments for Python 3.3
and 3.4, and replaced in 3.5 by executing "venv" directly.

On Windows, invoke the "venv" command as follows:

   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]
               ENV_DIR [ENV_DIR ...]

   Creates virtual Python environments in one or more target directories.

   positional arguments:
     ENV_DIR               A directory to create the environment in.

   options:
     -h, --help            show this help message and exit
     --system-site-packages
                           Give the virtual environment access to the system
                           site-packages dir.
     --symlinks            Try to use symlinks rather than copies, when
                           symlinks are not the default for the platform.
     --copies              Try to use copies rather than symlinks, even when
                           symlinks are the default for the platform.
     --clear               Delete the contents of the environment directory
                           if it already exists, before environment creation.
     --upgrade             Upgrade the environment directory to use this
                           version of Python, assuming Python has been
                           upgraded in-place.
     --without-pip         Skips installing or upgrading pip in the virtual
                           environment (pip is bootstrapped by default)
     --prompt PROMPT       Provides an alternative prompt prefix for this
                           environment.
     --upgrade-deps        Upgrade core dependencies (pip) to the latest
                           version in PyPI

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

バージョン 3.4 で変更: Installs pip by default, added the "--without-
pip"  and "--copies" options.

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

バージョン 3.9 で変更: Add "--upgrade-deps" option to upgrade pip +
setuptools to the latest on PyPI.

バージョン 3.12 で変更: "setuptools" is no longer a core venv
dependency.

注釈:

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

注釈:

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

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

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

The created "pyvenv.cfg" file also includes the "include-system-site-
packages" key, set to "true" if "venv" is run with the "--system-site-
packages" option, "false" otherwise.

"--without-pip" オプションが与えられない限り、"pip" を仮想環境でブート
するために "ensurepip" が呼ばれます。

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


仮想環境のしくみ
================

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

A virtual environment may be "activated" using a script in its binary
directory ("bin" on POSIX; "Scripts" on Windows). This will prepend
that directory to your "PATH", so that running **python** will invoke
the environment's Python interpreter and you can run installed scripts
without having to use their full path. The invocation of the
activation script is platform-specific ("*<venv>*" must be replaced by
the path to the directory containing the virtual environment):

+---------------+--------------+----------------------------------------------------+
| プラットフォ  | シェル       | 仮想環境を有効化するためのコマンド                 |
| ーム          |              |                                                    |
|===============|==============|====================================================|
| 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 インタプリタへのフルパスを指
定すれば良いだけなので、仮想環境をアクティベートする *必要* はありませ
ん。さらに、仮想環境にインストールされたすべてのスクリプトはアクティベ
ートせずとも実行可能なはずです。

In order to achieve this, scripts installed into virtual environments
have a "shebang" line which points to the environment's Python
interpreter, "#!/*<path-to-venv>*/bin/python". This means that the
script will run with that interpreter regardless of the value of
"PATH". On Windows, "shebang" line processing is supported if you have
the Windows の Python ランチャ installed. Thus, double-clicking an
installed script in a Windows Explorer window should run it with the
correct interpreter without the environment needing to be activated or
on the "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)

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

   * *system_site_packages* -- a boolean value indicating that the
     system Python site-packages should be available to the
     environment (defaults to "False").

   * *clear* -- a boolean value which, if true, will delete the
     contents of any existing target directory, before creating the
     environment.

   * *symlinks* -- a boolean value indicating whether to attempt to
     symlink the Python binary rather than copying.

   * *upgrade* -- a boolean value which, if true, will upgrade an
     existing environment with the running Python - for use when that
     Python has been upgraded in-place (defaults to "False").

   * *with_pip* -- a boolean value which, if true, ensures pip is
     installed in the virtual environment. This uses "ensurepip" with
     the "--default-pip" option.

   * *prompt* -- a string to be used after virtual environment is
     activated (defaults to "None" which means directory name of the
     environment would be used). If the special string ""."" is
     provided, the basename of the current directory is used as the
     prompt.

   * *upgrade_deps* -- Update the base venv modules to the latest on
     PyPI

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

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

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

   "EnvBuilder" may be used as a base class.

   create(env_dir)

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

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

         def create(self, env_dir):
             """
             Create a virtualized Python environment in a directory.
             env_dir is the target directory to create an environment in.
             """
             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 パス。

      * "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" 属性が追加され
      、コンテキストオブジェクトがドキュメントに追加されました。

   create_configuration(context)

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

   setup_python(context)

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

   setup_scripts(context)

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

   upgrade_dependencies(context)

      Upgrades the core venv dependency packages (currently pip) in
      the environment. This is done by shelling out to the "pip"
      executable in the environment.

      Added in version 3.9.

      バージョン 3.12 で変更: setuptools is no longer a core venv
      dependency.

   post_setup(context)

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

   install_scripts(context, path)

      This method can be called from "setup_scripts()" or
      "post_setup()" in subclasses to assist in installing custom
      scripts into the virtual environment.

      *path* is the path to a directory that should contain
      subdirectories "common", "posix", "nt"; each containing scripts
      destined for the "bin" directory in the environment.  The
      contents of "common" and the directory corresponding to
      "os.name" are copied after some text replacement of
      placeholders:

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

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

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

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

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

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

   バージョン 3.7.2 で変更: Windows では、バイナリそのものをコピーする
   のではなく、"python[w].exe" にリダイレクトを行うスクリプトを使うよ
   うになりました。 3.7.2 でのみ、ソース群でビルドを実行しているのでな
   ければ  "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)

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

   Added in version 3.3.

   バージョン 3.4 で変更: Added the *with_pip* parameter

   バージョン 3.6 で変更: Added the *prompt* parameter

   バージョン 3.9 で変更: Added the *upgrade_deps* parameter


"EnvBuilder" を拡張する例
=========================

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

   import os
   import os.path
   from subprocess import Popen, PIPE
   import sys
   from threading import Thread
   from urllib.parse import urlparse
   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, _, _, _ = urlparse(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)

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