<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>虚拟环境 &#8211; 李辉 / Grey Li</title>
	<atom:link href="https://greyli.com/tag/%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83/feed/" rel="self" type="application/rss+xml" />
	<link>https://greyli.com</link>
	<description>一个编程和写作爱好者的在线记事本</description>
	<lastBuildDate>Thu, 06 Nov 2025 11:36:11 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>

<image>
	<url>https://greyli.com/wp-content/uploads/2025/03/avatar-500-compressed-144x144.jpg</url>
	<title>虚拟环境 &#8211; 李辉 / Grey Li</title>
	<link>https://greyli.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>《Flask Web 开发实战》虚拟环境/依赖/Pipenv 等问题解决方法</title>
		<link>https://greyli.com/flask-web-book-pipenv-problem-solved/</link>
		<comments>https://greyli.com/flask-web-book-pipenv-problem-solved/#comments</comments>
		<pubDate>Tue, 07 Apr 2020 10:43:36 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[Flask Web开发实战]]></category>
		<category><![CDATA[Pipenv]]></category>
		<category><![CDATA[虚拟环境]]></category>

		<guid isPermaLink="false">http://greyli.com/?p=2887</guid>
		<description><![CDATA[注：这篇文章的主要受众是《Flask Web 开发实战》的读者。 注2：文中的 $ 符号标识一条命令行命令的开 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="md-end-block md-p"><span class="md-plain">注：这篇文章的主要受众是《</span><span class="md-link"><a spellcheck="false" href="http://helloflask.com/book/"><span class="md-plain">Flask Web 开发实战</span></a></span><span class="md-plain">》的读者。</span></p>
<p class="md-end-block md-p"><span class="md-plain">注2：文中的 $ 符号标识一条命令行命令的开始，$ 前面是当前工作目录，# 号后面是注释。你实际只需要输入 $ 符号和 # 号之间的内容，不包括开头和结尾的空格。</span></p>
<p class="md-end-block md-p"><span class="md-plain">在群聊和论坛里总是看到和虚拟环境和依赖安装相关的各类问题，这篇文章希望能够提供一个统一的解决方案。下次如果遇到有人问虚拟环境/Pipenv/依赖安装相关的问题，请把这篇文章的链接丢过去。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">安装 Python 库非常慢？</span></h2>
<p class="md-end-block md-p"><span class="md-plain">在进入正题之前，你需要先解决基础设施问题。你在执行 pip install 命令或 pipenv install 等命令时会不会网速非常慢？20k/s 或者干脆看到 Time out，Connection reset 之类的报错，这种情况下，你需要设置 PyPI 镜像。具体操作可以在这篇《</span><span class=" md-link"><a spellcheck="false" href="http://greyli.com/set-custom-pypi-mirror-url-for-pip-pipenv-poetry-and-flit/"><span class="md-plain">从国内的 PyPI 镜像（源）安装 Python 包</span></a></span><span class="md-plain">》看到。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">要不要继续使用 Pipenv？</span></h2>
<p class="md-end-block md-p"><span class="md-plain">因为书里面在一开始介绍了使用 Pipenv 管理依赖和虚拟环境，同时所有的安装第三方库的命令也都是使用 Pipenv，所以我们要解决的第一个问题是「要不要继续使用 Pipenv？」</span></p>
<p class="md-end-block md-p"><span class="md-plain">我的建议是，如果你在使用的过程中没有遇到过任何报错，那么就继续使用它。直到你觉得它在某些地方不再让你满意。</span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">但是如果你在使用的过程中遇到了问题（首先确保你使用的是最新版本的 Pipenv），比如：</span></p>
<ul>
<li class="md-end-block md-p"><span class="md-plain">锁定依赖很慢，停留在「locking&#8230;」这样的提示不动</span></li>
<li class="md-end-block md-p"><span class="md-plain">执行正确的命令但是总是出现报错</span></li>
</ul>
<blockquote>
<p><span data-offset-key="fm33e-0-0">附注 如果你安装依赖时的报错是「MarkupSafe </span><span data-offset-key="fm33e-1-0">setup.py</span><span data-offset-key="fm33e-2-0">: ImportError: cannot import name Feature」，请参考</span><a class="Link ztext-link" href="http://greyli.com/pip-pipenv-install-python-package-markupsafe-setup-py-importerror-cannot-import-name-feature/" target="_blank" rel="noopener" data-offset-key="fm33e-3-0" data-editable="true"><span data-offset-key="fm33e-3-0">这篇文章</span></a><span data-offset-key="fm33e-4-0">解决。</span></p>
</blockquote>
<p class="md-end-block md-p"><span class="md-plain">那么就继续看下去。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">如果不用 Pipenv，我该怎么办？</span></h2>
<p class="md-end-block md-p"><span class="md-plain">解决方法和替代工具非常多，这里给出两个。</span></p>
<p class="md-end-block md-p"><span class=""><strong><span class="md-plain">方法一：不用虚拟环境</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">最简单的解决方法就是不用虚拟环境。如果你是一个初学者，那么不用虚拟环境完全没问题。现在你把所有的 Python 包全都安装在一个盒子里，你只需要会使用 pip 安装依赖，也就是使用下面的 pip install 命令：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n184" mdtype="fences">$ pip install flask</pre>
<blockquote>
<p class="md-end-block md-p"><span class="md-plain">附注 顺便说一句，不用虚拟环境时，如果你是使用 Linux 和 macOS 系统的 Python 3 用户，那么执行 Python 和 pip 相关命令的时候需要输入的是 python3 和 pip3，比如：pip3 install flask。后面不再提示。</span></p>
</blockquote>
<p class="md-end-block md-p"><span class="md-plain">这个命令会为你安装 Flask。每到需要安装一个包，你就执行这个命令，把上面的 flask 替换成你要安装的包名即可。类似的，书中所有 pipenv install xxx 形式的命令也都替换为 pip install xxx。</span></p>
<p class="md-end-block md-p"><span class="md-plain">这时你可以跳过 Pipenv 和虚拟环境相关的内容。在第一章，当你把当前工作目录切换到 helloflask 文件夹内之后，整个 1.1 小节你只需要执行下面这行命令：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n189" mdtype="fences">$ pip install -r requirements.txt</pre>
<p class="md-end-block md-p"><span class="md-plain">而第二部分每章开头的下面这两行命令：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n191" mdtype="fences">$ pipenv install --dev
$ pipenv shell</pre>
<p class="md-end-block md-p"><span class="md-plain">都要替换为：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n193" mdtype="fences">$ pip install -r requirements.txt</pre>
<p class="md-end-block md-p"><span class="md-plain">这个命令会安装对应项目的所有依赖，所以后续介绍各个 Python 库时的安装命令不需要再执行。</span></p>
<p class="md-end-block md-p"><span class=""><strong><span class="md-plain">方法二：使用 virtualenv/venv 来管理虚拟环境，搭配 pip 来管理依赖</span></strong></span></p>
<p class="md-end-block md-p"><span class="md-plain">第二种方法是改用更基础的工具：你仍然使用 pip 安装依赖，同时搭配 virtualenv 或 venv 来管理虚拟环境。如果你选择这个方法，那就跳过书中对 Pipenv 的介绍，改为阅读这篇《</span><span class=" md-link"><a spellcheck="false" href="http://greyli.com/back-to-virtualenv-venv-and-pip/"><span class="md-plain">要不我们还是用回 virtualenv/venv 和 pip 吧</span></a></span><span class="md-plain">》。阅读完上述文章后，再继续阅读。</span></p>
<p class="md-end-block md-p"><span class="md-plain">现在你可以跳过 Pipenv 相关的内容。第一章切换进 helloflask 目录后，整个 1.1 小节你只需要执行下面的命令：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n198" mdtype="fences">$ python -m venv env  # Linux、macOS 系统的 Python3 用户，使用 python3 -m venv env
$ env\Scripts\activate  # Linux、macOS 系统使用 source env/bin/activate
$ pip install -r requirements.txt  # 这个命令会安装对应项目的所有依赖</pre>
<blockquote>
<p class="md-end-block md-p"><span class="md-plain">附注 ：上面命令里 # 号及之后的文字是注释，不需要输入。如果你使用 Python2，第一条命令需要改为 virtualenv env。这三行命令的作用依次为：创建虚拟环境、激活虚拟环境、从 requirements.txt 文件安装依赖列表。</span></p>
</blockquote>
<p class="md-end-block md-p"><span class="md-plain">类似的，第二部分每章开头的下面这两行命令：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n202" mdtype="fences">$ pipenv install --dev
$ pipenv shell</pre>
<p class="md-end-block md-p"><span class="md-plain">都要替换为：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n204" mdtype="fences">$ python -m venv env  # Linux、macOS 系统的 Python3 用户，使用 python3 -m venv env
$ env\Scripts\activate  # Linux、macOS 系统使用 source env/bin/activate
$ pip install -r requirements.txt  # 这个命令会安装对应项目的所有依赖</pre>
<p class="md-end-block md-p"><span class="md-plain">同时书中所有 pipenv install xxx 形式的命令都替换为 pip install xxx（不过你并不需要一个一个执行，因为每章开头执行 pip install -r requirements.txt 时会安装所有项目相关的依赖）。</span></p>
<p class="md-end-block md-p"><span class="md-plain">对于 PyCharm 设置 Python 解释器部分的内容，大致可以沿用，只不过在图 1-4 的位置你需要从列表里选择当前目录 env 文件夹（虚拟环境文件夹）中的 Python 解释器，根据操作系统的不同，将会是 env/bin/python 或 env\Scripts\python.exe。</span></p>
<p class="md-end-block md-p"><span class="md-plain">退出虚拟环境时，使用下面的命令：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n208" mdtype="fences">$ deactivate</pre>
<h2 class="md-end-block md-heading"><span class="md-plain">使用书中同样的代码，但是却出现报错？/ 我该怎么安装依赖？</span></h2>
<p class="md-end-block md-p"><span class="md-plain">有一些 Python 库在版本变化时会带来 API 的变化，而书中示例程序代码是基于每章开头注明的 Python 库来开发的，所以在更新依赖版本的时候可能会导致示例程序的代码出错。我建议你按照书中的命令来安装依赖，这会从项目依赖文件里安装固定版本的依赖列表，不要跳过第二部分每章开头的命令。</span></p>
<p class="md-end-block md-p"><span class="md-plain">具体来说，如果使用 Pipenv，对应的安装依赖的命令是：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n212" mdtype="fences">$ pipenv install --dev</pre>
<p class="md-end-block md-p"><span class="md-plain">如果使用 pip，对应的命令则是（如果创建了虚拟环境，需要先激活虚拟环境）：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n214" mdtype="fences">$ pip install -r requirements.txt</pre>
<p class="md-end-block md-p"><span class="md-plain">如果是第一章的示例程序，那么在 helloflask 目录下执行一次即可。如果是第二章的四个程序，那么在每一个程序的根目录执行一次即可。后续所有介绍新的 Python 包时给出的安装命令不用再执行。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">关于第一部分示例程序的项目结构和启动问题</span></h2>
<p class="md-end-block md-p"><span class="md-plain">在第一部分的源码中，一共有 6 个 Flask 程序，分别保存在 helloflask/demos/ 目录下的六个子文件夹内。用来存储环境变量的 .env 和 .flaskenv 文件需要在这些子文件夹内创建，而不是放到顶层目录（helloflask/）。同时为了方便操作，这 6 个程序共用同一个虚拟环境，所以在 helloflask/ 目录下创建虚拟环境。</span></p>
<blockquote>
<p class="md-end-block md-p"><span class="md-plain">注意 不要在 helloflask/ 目录下创建 .env 和 .flaskenv 文件，这会导致子目录下的程序无法正确启动（</span><span class=" md-link"><a spellcheck="false" href="https://github.com/pallets/flask/issues/3561"><span class="md-plain">issue #3561</span></a></span><span class="md-plain">）。</span></p>
</blockquote>
<p class="md-end-block md-p"><span class="md-plain">如果你按照书里给出的提示执行命令，一般不会出现问题。但是为了防止各种意外情况，这里列一下本书第一部分的操作流程（$ 符号前是当前工作目录）。</span></p>
<p class="md-end-block md-p"><span class="md-plain">具体的操作顺序就是，克隆仓库以后，切换到 helloflask 目录：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n222" mdtype="fences">$ cd helloflask</pre>
<p class="md-end-block md-p"><span class="md-plain">然后创建虚拟环境、激活虚拟环境、安装依赖：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n224" mdtype="fences">/helloflask $ python -m venv env  # Linux、macOS 系统的 Python3 用户，使用 python3 -m venv env
/helloflask $ env\Scripts\activate  # Linux、macOS 系统使用 source env/bin/activate
/helloflask $ pip install -r requirements.txt  # 这个命令会安装对应项目的所有依赖</pre>
<p class="md-end-block md-p"><span class="md-plain">接着看到介绍 Flask 最小程序部分，启动第一部分的示例程序：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n226" mdtype="fences">helloflask/ $ cd demos/hello
helloflask/demos/hello $ flask run</pre>
<p class="md-end-block md-p"><span class="md-plain">现在看到了第二章，启动第二部分的示例程序（先执行 cd .. 回到上层目录，即 demos/ 目录）：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n228" mdtype="fences">helloflask/demos/hello $ cd ..
helloflask/demos $ cd http
helloflask/demos/http $ flask run</pre>
<p class="md-end-block md-p"><span class="md-plain">看到第三章，启动第三部分的示例程序：</span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n230" mdtype="fences">helloflask/demos/http $ cd ..
helloflask/demos $ cd template
helloflask/demos/template $ flask run</pre>
<p class="md-end-block md-p"><span class="md-plain">以此类推。</span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">遇到了自己没法解决的问题怎么办？</span></h2>
<p class="md-end-block md-p"><span class="md-plain">如果遇到问题，你可以先尝试：</span></p>
<ul>
<li class="md-end-block md-p"><span class="md-plain">看一下本书 </span><span class=" md-link"><a spellcheck="false" href="https://github.com/greyli/helloflask"><span class="md-plain">GitHub 仓库</span></a></span><span class="md-plain">里的 </span><span class="md-link"><a spellcheck="false" href="https://github.com/greyli/helloflask/blob/master/faq/faq.md"><span class="md-plain">FAQ 页面</span></a></span><span class="md-plain"> 有没有你要找的答案</span></li>
<li class="md-end-block md-p"><span class="md-plain">在搜索引擎搜索你的错误信息关键字，尝试自己解决</span></li>
</ul>
<p>自己无法解决的话，可以：</p>
<ul>
<li class="md-end-block md-p"><span class="md-plain">发到 </span><span class=" md-link"><a spellcheck="false" href="https://github.com/greyli/helloflask/issues"><span class="md-plain">GitHub</span></a></span><span class="md-plain">（issue）和</span><span class="md-link"><a spellcheck="false" href="https://discuss.helloflask.com/"><span class="md-plain">论坛</span></a></span><span class="md-plain">（用文字形式贴出完整的错误信息、相关代码和命令，尽可能的详细描述相关信息）。</span></li>
<li class="md-end-block md-p"><span class="md-plain">发到</span><span class=" md-link"><a spellcheck="false" href="http://helloflask.com#discuss"><span class="md-plain">交流群</span></a></span><span class="md-plain md-expand">（建议优先选择发到 GitHub 和论坛，我会定期回复，群聊沟通效率很低，更适合闲聊）</span></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/flask-web-book-pipenv-problem-solved/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
