753 lines
78 KiB
HTML
753 lines
78 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
||
|
||
<title>venv --- 创建虚拟环境 — Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
|
||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||
|
||
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
||
<script src="../_static/jquery.js"></script>
|
||
<script src="../_static/underscore.js"></script>
|
||
<script src="../_static/doctools.js"></script>
|
||
<script src="../_static/language_data.js"></script>
|
||
<script src="../_static/translations.js"></script>
|
||
|
||
<script src="../_static/sidebar.js"></script>
|
||
|
||
<link rel="search" type="application/opensearchdescription+xml"
|
||
title="在 Python 3.8.20 文档 中搜索"
|
||
href="../_static/opensearch.xml"/>
|
||
<link rel="author" title="关于这些文档" href="../about.html" />
|
||
<link rel="index" title="索引" href="../genindex.html" />
|
||
<link rel="search" title="搜索" href="../search.html" />
|
||
<link rel="copyright" title="版权所有" href="../copyright.html" />
|
||
<link rel="next" title="zipapp —— 管理可执行的 Python zip 打包文件" href="zipapp.html" />
|
||
<link rel="prev" title="ensurepip --- 引导 pip 安装器" href="ensurepip.html" />
|
||
<link rel="canonical" href="https://docs.python.org/3/library/venv.html" />
|
||
|
||
|
||
|
||
|
||
|
||
<style>
|
||
@media only screen {
|
||
table.full-width-table {
|
||
width: 100%;
|
||
}
|
||
}
|
||
</style>
|
||
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
|
||
<script type="text/javascript" src="../_static/copybutton.js"></script>
|
||
<script type="text/javascript" src="../_static/menu.js"></script>
|
||
|
||
</head>
|
||
<body>
|
||
<div class="mobile-nav">
|
||
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
|
||
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
|
||
<label for="menuToggler" class="toggler__label">
|
||
<span></span>
|
||
</label>
|
||
<nav class="nav-content" role="navigation">
|
||
<a href="https://www.python.org/" class="nav-logo">
|
||
<img src="../_static/py.svg" alt="Logo"/>
|
||
</a>
|
||
<div class="version_switcher_placeholder"></div>
|
||
<form role="search" class="search" action="../search.html" method="get">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
|
||
<path fill-rule="nonzero"
|
||
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
|
||
</svg>
|
||
<input type="text" name="q" aria-label="快速搜索"/>
|
||
<input type="submit" value="转向"/>
|
||
</form>
|
||
</nav>
|
||
<div class="menu-wrapper">
|
||
<nav class="menu" role="navigation" aria-label="main navigation">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<h3><a href="../contents.html">目录</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">venv</span></code> --- 创建虚拟环境</a><ul>
|
||
<li><a class="reference internal" href="#creating-virtual-environments">创建虚拟环境</a></li>
|
||
<li><a class="reference internal" href="#api">API</a></li>
|
||
<li><a class="reference internal" href="#an-example-of-extending-envbuilder">一个扩展 <code class="docutils literal notranslate"><span class="pre">EnvBuilder</span></code> 的例子</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="ensurepip.html"
|
||
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">ensurepip</span></code> --- 引导 <code class="docutils literal notranslate"><span class="pre">pip</span></code> 安装器</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="zipapp.html"
|
||
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">zipapp</span></code> —— 管理可执行的 Python zip 打包文件</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/venv.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
|
||
这个文档所针对的是一个已不再受支持的 Python 旧版本。
|
||
你应当升级版本,并阅读
|
||
<a href="/3/library/venv.html"> Python 当前稳定版本的文档</a>.
|
||
</div>
|
||
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>导航</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="总目录"
|
||
accesskey="I">索引</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python 模块索引"
|
||
>模块</a> |</li>
|
||
<li class="right" >
|
||
<a href="zipapp.html" title="zipapp —— 管理可执行的 Python zip 打包文件"
|
||
accesskey="N">下一页</a> |</li>
|
||
<li class="right" >
|
||
<a href="ensurepip.html" title="ensurepip --- 引导 pip 安装器"
|
||
accesskey="P">上一页</a> |</li>
|
||
|
||
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="distribution.html" accesskey="U">软件打包和分发</a> »</li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<section id="module-venv">
|
||
<span id="venv-creation-of-virtual-environments"></span><h1><a class="reference internal" href="#module-venv" title="venv: Creation of virtual environments."><code class="xref py py-mod docutils literal notranslate"><span class="pre">venv</span></code></a> --- 创建虚拟环境<a class="headerlink" href="#module-venv" title="永久链接至标题">¶</a></h1>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
<p><strong>源码:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.8/Lib/venv/">Lib/venv/</a></p>
|
||
<hr class="docutils" id="index-0" />
|
||
<p><a class="reference internal" href="#module-venv" title="venv: Creation of virtual environments."><code class="xref py py-mod docutils literal notranslate"><span class="pre">venv</span></code></a> 模块支持使用自己的站点目录创建轻量级“虚拟环境”,可选择与系统站点目录隔离。每个虚拟环境都有自己的 Python 二进制文件(与用于创建此环境的二进制文件的版本相匹配),并且可以在其站点目录中拥有自己独立的已安装 Python 软件包集。</p>
|
||
<p>有关 Python 虚拟环境的更多信息,请参阅 <span class="target" id="index-7"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0405"><strong>PEP 405</strong></a> 。</p>
|
||
<div class="admonition seealso">
|
||
<p class="admonition-title">参见</p>
|
||
<p><a class="reference external" href="https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment">Python 打包用户指南:创建和使用虚拟环境</a></p>
|
||
</div>
|
||
<section id="creating-virtual-environments">
|
||
<h2>创建虚拟环境<a class="headerlink" href="#creating-virtual-environments" title="永久链接至标题">¶</a></h2>
|
||
<p>通过执行 <code class="docutils literal notranslate"><span class="pre">venv</span></code> 指令来创建一个 <a class="reference internal" href="#venv-def"><span class="std std-ref">虚拟环境</span></a>:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python3</span> <span class="o">-</span><span class="n">m</span> <span class="n">venv</span> <span class="o">/</span><span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">new</span><span class="o">/</span><span class="n">virtual</span><span class="o">/</span><span class="n">environment</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>运行此命令将创建目标目录(父目录若不存在也将创建),并放置一个 <code class="docutils literal notranslate"><span class="pre">pyvenv.cfg</span></code> 文件在其中,文件中有一个 <code class="docutils literal notranslate"><span class="pre">home</span></code> 键,它的值指向运行此命令的 Python 安装(目标目录的常用名称是 <code class="docutils literal notranslate"><span class="pre">.venv</span></code>)。它还会创建一个 <code class="docutils literal notranslate"><span class="pre">bin</span></code> 子目录(在 Windows 上是 <code class="docutils literal notranslate"><span class="pre">Scripts</span></code>),其中包含 Python 二进制文件的副本或符号链接(视创建环境时使用的平台或参数而定)。它还会创建一个(初始为空的) <code class="docutils literal notranslate"><span class="pre">lib/pythonX.Y/site-packages</span></code> 子目录(在 Windows 上是 <code class="docutils literal notranslate"><span class="pre">Lib\site-packages</span></code>)。如果指定了一个现有的目录,这个目录就将被重新使用。</p>
|
||
<div class="deprecated">
|
||
<p><span class="versionmodified deprecated">3.6 版后已移除: </span><code class="docutils literal notranslate"><span class="pre">pyvenv</span></code> 是 Python 3.3 和 3.4 中创建虚拟环境的推荐工具,不过 <a class="reference external" href="https://docs.python.org/dev/whatsnew/3.6.html#deprecated-features">在 Python 3.6 中已弃用</a>。</p>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.5 版更改: </span>现在推荐使用 <code class="docutils literal notranslate"><span class="pre">venv</span></code> 来创建虚拟环境。</p>
|
||
</div>
|
||
<p>在 Windows 上,调用 <code class="docutils literal notranslate"><span class="pre">venv</span></code> 命令如下:</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>c:\>c:\Python35\python -m venv c:\path\to\myenv
|
||
</pre></div>
|
||
</div>
|
||
<p>或者,如果已经为 <a class="reference internal" href="../using/windows.html#using-on-windows"><span class="std std-ref">Python 安装</span></a> 配置好 <code class="docutils literal notranslate"><span class="pre">PATH</span></code> 和 <code class="docutils literal notranslate"><span class="pre">PATHEXT</span></code> 变量:</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>c:\>python -m venv c:\path\to\myenv
|
||
</pre></div>
|
||
</div>
|
||
<p>本命令如果以 <code class="docutils literal notranslate"><span class="pre">-h</span></code> 参数运行,将显示可用的选项:</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
|
||
[--upgrade] [--without-pip] [--prompt PROMPT]
|
||
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.
|
||
|
||
optional arguments:
|
||
-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.
|
||
|
||
Once an environment has been created, you may wish to activate it, e.g. by
|
||
sourcing an activate script in its bin directory.
|
||
</pre></div>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.4 版更改: </span>默认安装 pip,并添加 <code class="docutils literal notranslate"><span class="pre">--without-pip</span></code> 和 <code class="docutils literal notranslate"><span class="pre">--copies</span></code> 选项</p>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.4 版更改: </span>在早期版本中,如果目标目录已存在,将引发错误,除非使用了 <code class="docutils literal notranslate"><span class="pre">--clear</span></code> 或 <code class="docutils literal notranslate"><span class="pre">--upgrade</span></code> 选项。</p>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>虽然 Windows 支持符号链接,但不推荐使用它们。特别注意,在文件资源管理器中双击 <code class="docutils literal notranslate"><span class="pre">python.exe</span></code> 将立即解析符号链接,并忽略虚拟环境。</p>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>在 Microsoft Windows 上,为了启用 <code class="docutils literal notranslate"><span class="pre">Activate.ps1</span></code> 脚本,可能需要修改用户的执行策略。可以运行以下 PowerShell 命令来执行此操作:</p>
|
||
<p>PS C:> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser</p>
|
||
<p>参阅 <a class="reference external" href="https://go.microsoft.com/fwlink/?LinkID=135170">About Execution Policies</a> 以获取更多信息。</p>
|
||
</div>
|
||
<p>生成的 <code class="docutils literal notranslate"><span class="pre">pyvenv.cfg</span></code> 文件还包括 <code class="docutils literal notranslate"><span class="pre">include-system-site-packages</span></code> 键,如果运行 <code class="docutils literal notranslate"><span class="pre">venv</span></code> 带有 <code class="docutils literal notranslate"><span class="pre">--system-site-packages</span></code> 选项,则键值为 <code class="docutils literal notranslate"><span class="pre">true</span></code>,否则为 <code class="docutils literal notranslate"><span class="pre">false</span></code>。</p>
|
||
<p>除非采用 <code class="docutils literal notranslate"><span class="pre">--without-pip</span></code> 选项,否则将会调用 <a class="reference internal" href="ensurepip.html#module-ensurepip" title="ensurepip: Bootstrapping the "pip" installer into an existing Python installation or virtual environment."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ensurepip</span></code></a> 将 <code class="docutils literal notranslate"><span class="pre">pip</span></code> 引导到虚拟环境中。</p>
|
||
<p>可以向 <code class="docutils literal notranslate"><span class="pre">venv</span></code> 传入多个路径,此时将根据给定的选项,在所给的每个路径上创建相同的虚拟环境。</p>
|
||
<p>创建虚拟环境后,可以使用虚拟环境的二进制目录中的脚本来“激活”该环境。不同平台调用的脚本是不同的(须将 <cite><venv></cite> 替换为包含虚拟环境的目录路径):</p>
|
||
<table class="docutils align-default">
|
||
<colgroup>
|
||
<col style="width: 18%" />
|
||
<col style="width: 24%" />
|
||
<col style="width: 58%" />
|
||
</colgroup>
|
||
<thead>
|
||
<tr class="row-odd"><th class="head"><p>平台</p></th>
|
||
<th class="head"><p>Shell</p></th>
|
||
<th class="head"><p>用于激活虚拟环境的命令</p></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr class="row-even"><td><p>POSIX</p></td>
|
||
<td><p>bash/zsh</p></td>
|
||
<td><p>$ source <venv>/bin/activate</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td></td>
|
||
<td><p>fish</p></td>
|
||
<td><p>$ . <venv>/bin/activate.fish</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td></td>
|
||
<td><p>csh/tcsh</p></td>
|
||
<td><p>$ source <venv>/bin/activate.csh</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td></td>
|
||
<td><p>PowerShell Core</p></td>
|
||
<td><p>$ <venv>/bin/Activate.ps1</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p>Windows</p></td>
|
||
<td><p>cmd.exe</p></td>
|
||
<td><p>C:\> <venv>\Scripts\activate.bat</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td></td>
|
||
<td><p>PowerShell</p></td>
|
||
<td><p>PS C:\> <venv>\Scripts\Activate.ps1</p></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>当一个虚拟环境被激活时,<span class="target" id="index-8"></span><code class="xref std std-envvar docutils literal notranslate"><span class="pre">VIRTUAL_ENV</span></code> 环境变量会被设为该虚拟环境的路径。 这可被用来检测程序是否运行在虚拟环境中。</p>
|
||
<p>激活环境不是 <em>必须</em> 的,激活只是将虚拟环境的二进制目录添加到搜索路径中,这样 "python" 命令将调用虚拟环境的 Python 解释器,可以运行其中已安装的脚本,而不必输入其完整路径。但是,安装在虚拟环境中的所有脚本都应在不激活的情况下可运行,并自动与虚拟环境的 Python 一起运行。</p>
|
||
<p>在 shell 中输入 "deactivate" 可以退出虚拟环境。具体机制取决于不同平台,并且是内部实现(通常使用脚本或 shell 函数)。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.4 新版功能: </span><code class="docutils literal notranslate"><span class="pre">fish</span></code> 和 <code class="docutils literal notranslate"><span class="pre">csh</span></code> 激活脚本。</p>
|
||
</div>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.8 新版功能: </span>在 POSIX 上安装 PowerShell 激活脚本,以支持 PowerShell Core。</p>
|
||
</div>
|
||
<div class="admonition note" id="venv-def">
|
||
<p class="admonition-title">注解</p>
|
||
<p>虚拟环境是一个 Python 环境,安装到其中的 Python 解释器、库和脚本与其他虚拟环境中的内容是隔离的,且(默认)与“系统级” Python(操作系统的一部分)中安装的库是隔离的。</p>
|
||
<p>虚拟环境是一个目录树,其中包含 Python 可执行文件和其他文件,其他文件指示了这是一个是虚拟环境。</p>
|
||
<p>常用安装工具如 <a class="reference external" href="https://pypi.org/project/setuptools/">setuptools</a> 和 <a class="reference external" href="https://pypi.org/project/pip/">pip</a> 可以在虚拟环境中按预期工作。换句话说,当虚拟环境被激活,它们就会将 Python 软件包安装到虚拟环境中,无需明确指示。</p>
|
||
<p>当虚拟环境被激活(即虚拟环境的 Python 解释器正在运行),属性 <a class="reference internal" href="sys.html#sys.prefix" title="sys.prefix"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.prefix</span></code></a> 和 <a class="reference internal" href="sys.html#sys.exec_prefix" title="sys.exec_prefix"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.exec_prefix</span></code></a> 指向的是虚拟环境的基础目录,而 <a class="reference internal" href="sys.html#sys.base_prefix" title="sys.base_prefix"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.base_prefix</span></code></a> 和 <a class="reference internal" href="sys.html#sys.base_exec_prefix" title="sys.base_exec_prefix"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.base_exec_prefix</span></code></a> 指向非虚拟环境的 Python 安装,即曾用于创建虚拟环境的那个 Python 安装。如果虚拟环境没有被激活,则 <a class="reference internal" href="sys.html#sys.prefix" title="sys.prefix"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.prefix</span></code></a> 与 <a class="reference internal" href="sys.html#sys.base_prefix" title="sys.base_prefix"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.base_prefix</span></code></a> 相同,且 <a class="reference internal" href="sys.html#sys.exec_prefix" title="sys.exec_prefix"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.exec_prefix</span></code></a> 与 <a class="reference internal" href="sys.html#sys.base_exec_prefix" title="sys.base_exec_prefix"><code class="xref py py-attr docutils literal notranslate"><span class="pre">sys.base_exec_prefix</span></code></a> 相同(它们均指向非虚拟环境的 Python 安装)。</p>
|
||
<p>当虚拟环境被激活,所有 <a class="reference internal" href="distutils.html#module-distutils" title="distutils: Support for building and installing Python modules into an existing Python installation."><code class="xref py py-mod docutils literal notranslate"><span class="pre">distutils</span></code></a> 配置文件中更改安装路径的选项都会被忽略,以防止无意中将项目安装在虚拟环境之外。</p>
|
||
<p>在命令行 shell 中工作时,用户可以运行虚拟环境可执行文件目录中的 <code class="docutils literal notranslate"><span class="pre">activate</span></code> 脚本来激活虚拟环境(调用该文件的确切文件名和命令取决于 shell),这会将虚拟环境的可执行文件目录添加到当前 shell 的 <code class="docutils literal notranslate"><span class="pre">PATH</span></code> 环境变量。在其他情况下,无需激活虚拟环境。安装到虚拟环境中的脚本有 "shebang" 行,指向虚拟环境的 Python 解释器。这意味着无论 <code class="docutils literal notranslate"><span class="pre">PATH</span></code> 的值如何,脚本都将与该解释器一起运行。在 Windows 上,如果已安装 Python Launcher for Windows,则支持处理 "shebang" 行(此功能在 Python 3.3 中添加,详情请参阅 <span class="target" id="index-9"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0397"><strong>PEP 397</strong></a>)。这样,在 Windows 资源管理器中双击已安装的脚本,应该会使用正确的解释器运行该脚本,而在 <code class="docutils literal notranslate"><span class="pre">PATH</span></code> 中无需指向其虚拟环境。</p>
|
||
</div>
|
||
</section>
|
||
<section id="api">
|
||
<span id="venv-api"></span><h2>API<a class="headerlink" href="#api" title="永久链接至标题">¶</a></h2>
|
||
<p>上述的高级方法使用了一个简单的 API,该 API 提供了一种机制,第三方虚拟环境创建者可以根据其需求自定义环境创建过程,该 API 为 <a class="reference internal" href="#venv.EnvBuilder" title="venv.EnvBuilder"><code class="xref py py-class docutils literal notranslate"><span class="pre">EnvBuilder</span></code></a> 类。</p>
|
||
<dl class="class">
|
||
<dt id="venv.EnvBuilder">
|
||
<em class="property">class </em><code class="sig-prename descclassname">venv.</code><code class="sig-name descname">EnvBuilder</code><span class="sig-paren">(</span><em class="sig-param">system_site_packages=False</em>, <em class="sig-param">clear=False</em>, <em class="sig-param">symlinks=False</em>, <em class="sig-param">upgrade=False</em>, <em class="sig-param">with_pip=False</em>, <em class="sig-param">prompt=None</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.EnvBuilder" title="永久链接至目标">¶</a></dt>
|
||
<dd><p><a class="reference internal" href="#venv.EnvBuilder" title="venv.EnvBuilder"><code class="xref py py-class docutils literal notranslate"><span class="pre">EnvBuilder</span></code></a> 类在实例化时接受以下关键字参数:</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">system_site_packages</span></code> -- 一个布尔值,要求系统 Python 的 site-packages 对环境可用(默认为 <code class="docutils literal notranslate"><span class="pre">False</span></code>)。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">clear</span></code> -- 一个布尔值,如果为 true,则在创建环境前将删除目标目录的现有内容。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">symlinks</span></code> -- 一个布尔值,指示是否尝试符号链接 Python 二进制文件,而不是进行复制。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">upgrade</span></code> -- 一个布尔值,如果为 true,则将使用当前运行的 Python 去升级一个现有的环境,这主要在原位置的 Python 更新后使用(默认为 <code class="docutils literal notranslate"><span class="pre">False</span></code>)。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">with_pip</span></code> -- 一个布尔值,如果为 true,则确保在虚拟环境中已安装 pip。这使用的是带有 <code class="docutils literal notranslate"><span class="pre">--default-pip</span></code> 选项的 <a class="reference internal" href="ensurepip.html#module-ensurepip" title="ensurepip: Bootstrapping the "pip" installer into an existing Python installation or virtual environment."><code class="xref py py-mod docutils literal notranslate"><span class="pre">ensurepip</span></code></a>。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">prompt</span></code> -- a String to be used after virtual environment is activated
|
||
(defaults to <code class="docutils literal notranslate"><span class="pre">None</span></code> which means directory name of the environment would
|
||
be used).</p></li>
|
||
</ul>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.4 版更改: </span>添加 <code class="docutils literal notranslate"><span class="pre">with_pip</span></code> 参数</p>
|
||
</div>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.6 新版功能: </span>添加 <code class="docutils literal notranslate"><span class="pre">prompt</span></code> 参数</p>
|
||
</div>
|
||
<p>第三方虚拟环境工具的创建者可以自由地将此处提供的 <a class="reference internal" href="#venv.EnvBuilder" title="venv.EnvBuilder"><code class="xref py py-class docutils literal notranslate"><span class="pre">EnvBuilder</span></code></a> 类作为基类。</p>
|
||
<p>返回的 env-builder 是一个对象,包含一个 <code class="docutils literal notranslate"><span class="pre">create</span></code> 方法:</p>
|
||
<dl class="method">
|
||
<dt id="venv.EnvBuilder.create">
|
||
<code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param">env_dir</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.EnvBuilder.create" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>指定要建立虚拟环境的目标目录(绝对路径或相对于当前路径)来创建虚拟环境。<code class="docutils literal notranslate"><span class="pre">create</span></code> 方法将在指定目录中创建环境,或者引发对应的异常。</p>
|
||
<p><a class="reference internal" href="#venv.EnvBuilder" title="venv.EnvBuilder"><code class="xref py py-class docutils literal notranslate"><span class="pre">EnvBuilder</span></code></a> 类的 <code class="docutils literal notranslate"><span class="pre">create</span></code> 方法说明了可用于定制子类的钩子:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env_dir</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Create a virtualized Python environment in a directory.</span>
|
||
<span class="sd"> env_dir is the target directory to create an environment in.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">env_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">env_dir</span><span class="p">)</span>
|
||
<span class="n">context</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ensure_directories</span><span class="p">(</span><span class="n">env_dir</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">create_configuration</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">setup_python</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">setup_scripts</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">post_setup</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>每个方法 <a class="reference internal" href="#venv.EnvBuilder.ensure_directories" title="venv.EnvBuilder.ensure_directories"><code class="xref py py-meth docutils literal notranslate"><span class="pre">ensure_directories()</span></code></a>, <a class="reference internal" href="#venv.EnvBuilder.create_configuration" title="venv.EnvBuilder.create_configuration"><code class="xref py py-meth docutils literal notranslate"><span class="pre">create_configuration()</span></code></a>, <a class="reference internal" href="#venv.EnvBuilder.setup_python" title="venv.EnvBuilder.setup_python"><code class="xref py py-meth docutils literal notranslate"><span class="pre">setup_python()</span></code></a>, <a class="reference internal" href="#venv.EnvBuilder.setup_scripts" title="venv.EnvBuilder.setup_scripts"><code class="xref py py-meth docutils literal notranslate"><span class="pre">setup_scripts()</span></code></a> 和 <a class="reference internal" href="#venv.EnvBuilder.post_setup" title="venv.EnvBuilder.post_setup"><code class="xref py py-meth docutils literal notranslate"><span class="pre">post_setup()</span></code></a> 都可以被重写。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="method">
|
||
<dt id="venv.EnvBuilder.ensure_directories">
|
||
<code class="sig-name descname">ensure_directories</code><span class="sig-paren">(</span><em class="sig-param">env_dir</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.EnvBuilder.ensure_directories" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>创建环境目录和所有必需的目录,并返回一个上下文对象。该对象只是一个容器,保存属性(如路径),供其他方法使用。允许目录已经存在,如果指定了 <code class="docutils literal notranslate"><span class="pre">clear</span></code> 或 <code class="docutils literal notranslate"><span class="pre">upgrade</span></code> 就允许在现有环境目录上进行操作。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="method">
|
||
<dt id="venv.EnvBuilder.create_configuration">
|
||
<code class="sig-name descname">create_configuration</code><span class="sig-paren">(</span><em class="sig-param">context</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.EnvBuilder.create_configuration" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>在环境中创建 <code class="docutils literal notranslate"><span class="pre">pyvenv.cfg</span></code> 配置文件。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="method">
|
||
<dt id="venv.EnvBuilder.setup_python">
|
||
<code class="sig-name descname">setup_python</code><span class="sig-paren">(</span><em class="sig-param">context</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.EnvBuilder.setup_python" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>在环境中创建 Python 可执行文件的拷贝或符号链接。在 POSIX 系统上,如果给定了可执行文件 <code class="docutils literal notranslate"><span class="pre">python3.x</span></code>,将创建指向该可执行文件的 <code class="docutils literal notranslate"><span class="pre">python</span></code> 和 <code class="docutils literal notranslate"><span class="pre">python3</span></code> 符号链接,除非相同名称的文件已经存在。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="method">
|
||
<dt id="venv.EnvBuilder.setup_scripts">
|
||
<code class="sig-name descname">setup_scripts</code><span class="sig-paren">(</span><em class="sig-param">context</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.EnvBuilder.setup_scripts" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>将适用于平台的激活脚本安装到虚拟环境中。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="method">
|
||
<dt id="venv.EnvBuilder.post_setup">
|
||
<code class="sig-name descname">post_setup</code><span class="sig-paren">(</span><em class="sig-param">context</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.EnvBuilder.post_setup" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>占位方法,可以在第三方实现中重写,用于在虚拟环境中预安装软件包,或是其他创建后要执行的步骤。</p>
|
||
</dd></dl>
|
||
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.7.2 版更改: </span>Windows 现在为 <code class="docutils literal notranslate"><span class="pre">python[w].exe</span></code> 使用重定向脚本,而不是复制实际的二进制文件。仅在 3.7.2 中,除非运行的是源码树中的构建,否则 <a class="reference internal" href="#venv.EnvBuilder.setup_python" title="venv.EnvBuilder.setup_python"><code class="xref py py-meth docutils literal notranslate"><span class="pre">setup_python()</span></code></a> 不会执行任何操作。</p>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.7.3 版更改: </span>Windows 将重定向脚本复制为 <a class="reference internal" href="#venv.EnvBuilder.setup_python" title="venv.EnvBuilder.setup_python"><code class="xref py py-meth docutils literal notranslate"><span class="pre">setup_python()</span></code></a> 的一部分而非 <a class="reference internal" href="#venv.EnvBuilder.setup_scripts" title="venv.EnvBuilder.setup_scripts"><code class="xref py py-meth docutils literal notranslate"><span class="pre">setup_scripts()</span></code></a>。在 3.7.2 中不是这种情况。使用符号链接时,将链接至原始可执行文件。</p>
|
||
</div>
|
||
<p>此外,<a class="reference internal" href="#venv.EnvBuilder" title="venv.EnvBuilder"><code class="xref py py-class docutils literal notranslate"><span class="pre">EnvBuilder</span></code></a> 提供了如下实用方法,可以从子类的 <a class="reference internal" href="#venv.EnvBuilder.setup_scripts" title="venv.EnvBuilder.setup_scripts"><code class="xref py py-meth docutils literal notranslate"><span class="pre">setup_scripts()</span></code></a> 或 <a class="reference internal" href="#venv.EnvBuilder.post_setup" title="venv.EnvBuilder.post_setup"><code class="xref py py-meth docutils literal notranslate"><span class="pre">post_setup()</span></code></a> 调用,用来将自定义脚本安装到虚拟环境中。</p>
|
||
<dl class="method">
|
||
<dt id="venv.EnvBuilder.install_scripts">
|
||
<code class="sig-name descname">install_scripts</code><span class="sig-paren">(</span><em class="sig-param">context</em>, <em class="sig-param">path</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.EnvBuilder.install_scripts" title="永久链接至目标">¶</a></dt>
|
||
<dd><p><em>path</em> 是一个目录的路径,该目录应包含子目录 "common", "posix", "nt",每个子目录存有发往对应环境中 bin 目录的脚本。在下列占位符替换完毕后,将复制 "common" 的内容和与 <a class="reference internal" href="os.html#os.name" title="os.name"><code class="xref py py-data docutils literal notranslate"><span class="pre">os.name</span></code></a> 对应的子目录:</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">__VENV_DIR__</span></code> 会被替换为环境目录的绝对路径。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">__VENV_NAME__</span></code> 会被替换为环境名称(环境目录的最后一个字段)。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">__VENV_PROMPT__</span></code> 会被替换为提示符(用括号括起来的环境名称紧跟着一个空格)。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">__VENV_BIN_NAME__</span></code> 会被替换为 bin 目录的名称( <code class="docutils literal notranslate"><span class="pre">bin</span></code> 或 <code class="docutils literal notranslate"><span class="pre">Scripts</span></code> )。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">__VENV_PYTHON__</span></code> 会被替换为环境可执行文件的绝对路径。</p></li>
|
||
</ul>
|
||
<p>允许目录已存在(用于升级现有环境时)。</p>
|
||
</dd></dl>
|
||
|
||
</dd></dl>
|
||
|
||
<p>有一个方便实用的模块级别的函数:</p>
|
||
<dl class="function">
|
||
<dt id="venv.create">
|
||
<code class="sig-prename descclassname">venv.</code><code class="sig-name descname">create</code><span class="sig-paren">(</span><em class="sig-param">env_dir</em>, <em class="sig-param">system_site_packages=False</em>, <em class="sig-param">clear=False</em>, <em class="sig-param">symlinks=False</em>, <em class="sig-param">with_pip=False</em>, <em class="sig-param">prompt=None</em><span class="sig-paren">)</span><a class="headerlink" href="#venv.create" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>通过关键词参数来创建一个 <a class="reference internal" href="#venv.EnvBuilder" title="venv.EnvBuilder"><code class="xref py py-class docutils literal notranslate"><span class="pre">EnvBuilder</span></code></a>,并且使用 <em>env_dir</em> 参数来调用它的 <a class="reference internal" href="#venv.EnvBuilder.create" title="venv.EnvBuilder.create"><code class="xref py py-meth docutils literal notranslate"><span class="pre">create()</span></code></a> 方法。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.4 版更改: </span>添加 <code class="docutils literal notranslate"><span class="pre">with_pip</span></code> 参数</p>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.6 版更改: </span>添加 <code class="docutils literal notranslate"><span class="pre">prompt</span></code> 参数</p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
</section>
|
||
<section id="an-example-of-extending-envbuilder">
|
||
<h2>一个扩展 <code class="docutils literal notranslate"><span class="pre">EnvBuilder</span></code> 的例子<a class="headerlink" href="#an-example-of-extending-envbuilder" title="永久链接至标题">¶</a></h2>
|
||
<p>下面的脚本展示了如何通过实现一个子类来扩展 <a class="reference internal" href="#venv.EnvBuilder" title="venv.EnvBuilder"><code class="xref py py-class docutils literal notranslate"><span class="pre">EnvBuilder</span></code></a>。这个子类会安装 setuptools 和 pip 到被创建的虚拟环境中。</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
|
||
<span class="kn">import</span> <span class="nn">os.path</span>
|
||
<span class="kn">from</span> <span class="nn">subprocess</span> <span class="kn">import</span> <span class="n">Popen</span><span class="p">,</span> <span class="n">PIPE</span>
|
||
<span class="kn">import</span> <span class="nn">sys</span>
|
||
<span class="kn">from</span> <span class="nn">threading</span> <span class="kn">import</span> <span class="n">Thread</span>
|
||
<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlparse</span>
|
||
<span class="kn">from</span> <span class="nn">urllib.request</span> <span class="kn">import</span> <span class="n">urlretrieve</span>
|
||
<span class="kn">import</span> <span class="nn">venv</span>
|
||
|
||
<span class="k">class</span> <span class="nc">ExtendedEnvBuilder</span><span class="p">(</span><span class="n">venv</span><span class="o">.</span><span class="n">EnvBuilder</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This builder installs setuptools and pip so that you can pip or</span>
|
||
<span class="sd"> easy_install other packages into the created virtual environment.</span>
|
||
|
||
<span class="sd"> :param nodist: If true, setuptools and pip are not installed into the</span>
|
||
<span class="sd"> created virtual environment.</span>
|
||
<span class="sd"> :param nopip: If true, pip is not installed into the created</span>
|
||
<span class="sd"> virtual environment.</span>
|
||
<span class="sd"> :param progress: If setuptools or pip are installed, the progress of the</span>
|
||
<span class="sd"> installation can be monitored by passing a progress</span>
|
||
<span class="sd"> callable. If specified, it is called with two</span>
|
||
<span class="sd"> arguments: a string indicating some progress, and a</span>
|
||
<span class="sd"> context indicating where the string is coming from.</span>
|
||
<span class="sd"> The context argument can have one of three values:</span>
|
||
<span class="sd"> 'main', indicating that it is called from virtualize()</span>
|
||
<span class="sd"> itself, and 'stdout' and 'stderr', which are obtained</span>
|
||
<span class="sd"> by reading lines from the output streams of a subprocess</span>
|
||
<span class="sd"> which is used to install the app.</span>
|
||
|
||
<span class="sd"> If a callable is not specified, default progress</span>
|
||
<span class="sd"> information is output to sys.stderr.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">nodist</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'nodist'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">nopip</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'nopip'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">progress</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'progress'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">verbose</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'verbose'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">post_setup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Set up any packages which need to be pre-installed into the</span>
|
||
<span class="sd"> virtual environment being created.</span>
|
||
|
||
<span class="sd"> :param context: The information for the virtual environment</span>
|
||
<span class="sd"> creation request being processed.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'VIRTUAL_ENV'</span><span class="p">]</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">env_dir</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodist</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">install_setuptools</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
|
||
<span class="c1"># Can't install pip without setuptools</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">nopip</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodist</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">install_pip</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">reader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Read lines from a subprocess' output stream and either pass to a progress</span>
|
||
<span class="sd"> callable (if specified) or write progress information to sys.stderr.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">progress</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">progress</span>
|
||
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||
<span class="n">s</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">s</span><span class="p">:</span>
|
||
<span class="k">break</span>
|
||
<span class="k">if</span> <span class="n">progress</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">progress</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'.'</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">))</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
||
<span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span> <span class="nf">install_script</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
|
||
<span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
|
||
<span class="n">fn</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">path</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||
<span class="n">binpath</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">bin_path</span>
|
||
<span class="n">distpath</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">binpath</span><span class="p">,</span> <span class="n">fn</span><span class="p">)</span>
|
||
<span class="c1"># Download script into the virtual environment's binaries folder</span>
|
||
<span class="n">urlretrieve</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">distpath</span><span class="p">)</span>
|
||
<span class="n">progress</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">progress</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">verbose</span><span class="p">:</span>
|
||
<span class="n">term</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">term</span> <span class="o">=</span> <span class="s1">''</span>
|
||
<span class="k">if</span> <span class="n">progress</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">progress</span><span class="p">(</span><span class="s1">'Installing </span><span class="si">%s</span><span class="s1"> ...</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">term</span><span class="p">),</span> <span class="s1">'main'</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Installing </span><span class="si">%s</span><span class="s1"> ...</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">term</span><span class="p">))</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
||
<span class="c1"># Install in the virtual environment</span>
|
||
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="n">context</span><span class="o">.</span><span class="n">env_exe</span><span class="p">,</span> <span class="n">fn</span><span class="p">]</span>
|
||
<span class="n">p</span> <span class="o">=</span> <span class="n">Popen</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">stderr</span><span class="o">=</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">cwd</span><span class="o">=</span><span class="n">binpath</span><span class="p">)</span>
|
||
<span class="n">t1</span> <span class="o">=</span> <span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reader</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span> <span class="s1">'stdout'</span><span class="p">))</span>
|
||
<span class="n">t1</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
||
<span class="n">t2</span> <span class="o">=</span> <span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">reader</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">stderr</span><span class="p">,</span> <span class="s1">'stderr'</span><span class="p">))</span>
|
||
<span class="n">t2</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
||
<span class="n">p</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
|
||
<span class="n">t1</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
|
||
<span class="n">t2</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="n">progress</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">progress</span><span class="p">(</span><span class="s1">'done.'</span><span class="p">,</span> <span class="s1">'main'</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'done.</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
||
<span class="c1"># Clean up - no longer needed</span>
|
||
<span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="n">distpath</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">install_setuptools</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Install setuptools in the virtual environment.</span>
|
||
|
||
<span class="sd"> :param context: The information for the virtual environment</span>
|
||
<span class="sd"> creation request being processed.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">url</span> <span class="o">=</span> <span class="s1">'https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py'</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">install_script</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="s1">'setuptools'</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
|
||
<span class="c1"># clear up the setuptools archive which gets downloaded</span>
|
||
<span class="n">pred</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">o</span><span class="p">:</span> <span class="n">o</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'setuptools-'</span><span class="p">)</span> <span class="ow">and</span> <span class="n">o</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'.tar.gz'</span><span class="p">)</span>
|
||
<span class="n">files</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="n">pred</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">bin_path</span><span class="p">))</span>
|
||
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">files</span><span class="p">:</span>
|
||
<span class="n">f</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">bin_path</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
|
||
<span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">install_pip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Install pip in the virtual environment.</span>
|
||
|
||
<span class="sd"> :param context: The information for the virtual environment</span>
|
||
<span class="sd"> creation request being processed.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">url</span> <span class="o">=</span> <span class="s1">'https://bootstrap.pypa.io/get-pip.py'</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">install_script</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="s1">'pip'</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="n">compatible</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o"><</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span>
|
||
<span class="n">compatible</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="s1">'base_prefix'</span><span class="p">):</span>
|
||
<span class="n">compatible</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">compatible</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'This script is only for use with '</span>
|
||
<span class="s1">'Python 3.3 or later'</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="kn">import</span> <span class="nn">argparse</span>
|
||
|
||
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="vm">__name__</span><span class="p">,</span>
|
||
<span class="n">description</span><span class="o">=</span><span class="s1">'Creates virtual Python '</span>
|
||
<span class="s1">'environments in one or '</span>
|
||
<span class="s1">'more target '</span>
|
||
<span class="s1">'directories.'</span><span class="p">)</span>
|
||
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'dirs'</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s1">'ENV_DIR'</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s1">'+'</span><span class="p">,</span>
|
||
<span class="n">help</span><span class="o">=</span><span class="s1">'A directory in which to create the</span>
|
||
<span class="s1">'virtual environment.'</span><span class="p">)</span>
|
||
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--no-setuptools'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||
<span class="n">action</span><span class="o">=</span><span class="s1">'store_true'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'nodist'</span><span class="p">,</span>
|
||
<span class="n">help</span><span class="o">=</span><span class="s2">"Don't install setuptools or pip in the "</span>
|
||
<span class="s2">"virtual environment."</span><span class="p">)</span>
|
||
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--no-pip'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||
<span class="n">action</span><span class="o">=</span><span class="s1">'store_true'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'nopip'</span><span class="p">,</span>
|
||
<span class="n">help</span><span class="o">=</span><span class="s2">"Don't install pip in the virtual "</span>
|
||
<span class="s2">"environment."</span><span class="p">)</span>
|
||
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--system-site-packages'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||
<span class="n">action</span><span class="o">=</span><span class="s1">'store_true'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'system_site'</span><span class="p">,</span>
|
||
<span class="n">help</span><span class="o">=</span><span class="s1">'Give the virtual environment access to the '</span>
|
||
<span class="s1">'system site-packages dir.'</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">'nt'</span><span class="p">:</span>
|
||
<span class="n">use_symlinks</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">use_symlinks</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--symlinks'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">use_symlinks</span><span class="p">,</span>
|
||
<span class="n">action</span><span class="o">=</span><span class="s1">'store_true'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s1">'symlinks'</span><span class="p">,</span>
|
||
<span class="n">help</span><span class="o">=</span><span class="s1">'Try to use symlinks rather than copies, '</span>
|
||
<span class="s1">'when symlinks are not the default for '</span>
|
||
<span class="s1">'the platform.'</span><span class="p">)</span>
|
||
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--clear'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'store_true'</span><span class="p">,</span>
|
||
<span class="n">dest</span><span class="o">=</span><span class="s1">'clear'</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">'Delete the contents of the '</span>
|
||
<span class="s1">'virtual environment '</span>
|
||
<span class="s1">'directory if it already '</span>
|
||
<span class="s1">'exists, before virtual '</span>
|
||
<span class="s1">'environment creation.'</span><span class="p">)</span>
|
||
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--upgrade'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'store_true'</span><span class="p">,</span>
|
||
<span class="n">dest</span><span class="o">=</span><span class="s1">'upgrade'</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">'Upgrade the virtual '</span>
|
||
<span class="s1">'environment directory to '</span>
|
||
<span class="s1">'use this version of '</span>
|
||
<span class="s1">'Python, assuming Python '</span>
|
||
<span class="s1">'has been upgraded '</span>
|
||
<span class="s1">'in-place.'</span><span class="p">)</span>
|
||
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--verbose'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'store_true'</span><span class="p">,</span>
|
||
<span class="n">dest</span><span class="o">=</span><span class="s1">'verbose'</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">'Display the output '</span>
|
||
<span class="s1">'from the scripts which '</span>
|
||
<span class="s1">'install setuptools and pip.'</span><span class="p">)</span>
|
||
<span class="n">options</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">options</span><span class="o">.</span><span class="n">upgrade</span> <span class="ow">and</span> <span class="n">options</span><span class="o">.</span><span class="n">clear</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'you cannot supply --upgrade and --clear together.'</span><span class="p">)</span>
|
||
<span class="n">builder</span> <span class="o">=</span> <span class="n">ExtendedEnvBuilder</span><span class="p">(</span><span class="n">system_site_packages</span><span class="o">=</span><span class="n">options</span><span class="o">.</span><span class="n">system_site</span><span class="p">,</span>
|
||
<span class="n">clear</span><span class="o">=</span><span class="n">options</span><span class="o">.</span><span class="n">clear</span><span class="p">,</span>
|
||
<span class="n">symlinks</span><span class="o">=</span><span class="n">options</span><span class="o">.</span><span class="n">symlinks</span><span class="p">,</span>
|
||
<span class="n">upgrade</span><span class="o">=</span><span class="n">options</span><span class="o">.</span><span class="n">upgrade</span><span class="p">,</span>
|
||
<span class="n">nodist</span><span class="o">=</span><span class="n">options</span><span class="o">.</span><span class="n">nodist</span><span class="p">,</span>
|
||
<span class="n">nopip</span><span class="o">=</span><span class="n">options</span><span class="o">.</span><span class="n">nopip</span><span class="p">,</span>
|
||
<span class="n">verbose</span><span class="o">=</span><span class="n">options</span><span class="o">.</span><span class="n">verbose</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">options</span><span class="o">.</span><span class="n">dirs</span><span class="p">:</span>
|
||
<span class="n">builder</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
|
||
<span class="n">rc</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">main</span><span class="p">()</span>
|
||
<span class="n">rc</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s1">'Error: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">e</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">rc</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>这个脚本同样可以 <a class="reference external" href="https://gist.github.com/vsajip/4673395">在线下载</a>。</p>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper">
|
||
<h3><a href="../contents.html">目录</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">venv</span></code> --- 创建虚拟环境</a><ul>
|
||
<li><a class="reference internal" href="#creating-virtual-environments">创建虚拟环境</a></li>
|
||
<li><a class="reference internal" href="#api">API</a></li>
|
||
<li><a class="reference internal" href="#an-example-of-extending-envbuilder">一个扩展 <code class="docutils literal notranslate"><span class="pre">EnvBuilder</span></code> 的例子</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="ensurepip.html"
|
||
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">ensurepip</span></code> --- 引导 <code class="docutils literal notranslate"><span class="pre">pip</span></code> 安装器</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="zipapp.html"
|
||
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">zipapp</span></code> —— 管理可执行的 Python zip 打包文件</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/venv.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>导航</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="总目录"
|
||
>索引</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python 模块索引"
|
||
>模块</a> |</li>
|
||
<li class="right" >
|
||
<a href="zipapp.html" title="zipapp —— 管理可执行的 Python zip 打包文件"
|
||
>下一页</a> |</li>
|
||
<li class="right" >
|
||
<a href="ensurepip.html" title="ensurepip --- 引导 pip 安装器"
|
||
>上一页</a> |</li>
|
||
|
||
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="distribution.html" >软件打包和分发</a> »</li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
<div class="footer">
|
||
© <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
|
||
<br />
|
||
This page is licensed under the Python Software Foundation License Version 2.
|
||
<br />
|
||
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
|
||
<br />
|
||
|
||
<br />
|
||
|
||
The Python Software Foundation is a non-profit corporation.
|
||
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
||
<br />
|
||
<br />
|
||
|
||
最后更新于 12月 09, 2024.
|
||
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
|
||
<br />
|
||
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
|
||
</div>
|
||
|
||
</body>
|
||
</html> |