目录
介绍
背景
多少个Python?
多种解释器
多个软件包安装程序
多个搜索路径
虚拟环境
创建一个虚拟环境
激活虚拟环境
在虚拟环境中安装软件包
PIP冻结
VSC集成
Flask & Gunicorn
使用Nginx进行负载平衡
这是有关Python&Virtualenv&Visual Studio Code 的说明。
Python被认为是一种易于学习且易于使用的语言,但是本说明与Python语言无关。这是关于创建一个隔离的环境,使我们可以确定地运行Python程序。
在本说明中,我附加了一些简单的Python文件。我将使用它们向您展示拥有一个隔离的环境来运行Python程序的好处。
要运行Python程序,通常在计算机上需要3个组件。
Python宣称的优势之一是,它在所有计算机上都可以轻松获得。这也意味着我们可能不知道就拥有一个版本的Python解释器。在我的Linux Mint 17.2 Cinnamon 64位中,我至少有3个Python解释器。
当我们安装操作系统时,它会附带某些预先安装的Python解释器。这些Python解释器对于操作系统正常运行很重要。我们不应该在不确切知道我们正在做什么的情况下删除它们。
为了使事情变得更复杂,我们实际上在计算机上有多个pip实例。
在运行Python程序时,我们需要确保使用了正确的解释器实例。让我们看一下“python-search-path.py”文件。
# https://docs.python.org/3/tutorial/modules.html#the-module-search-path
import sys
for item in sys.path:
print(item)
如果通过以下命令运行程序,则可以找到“python”解释器使用的包搜索路径。
如果我们通过“python3.4”解释器运行它,我们将看到完全不同的路径。
现在我们知道计算机上的Python版本很复杂。更不稳定的是,我们可能使用的操作系统也使用相同版本的Python。如果我们更新操作系统也使用的某个程序包,则可能会导致操作系统出现问题。在最坏的情况下,它甚至可能无法启动。在使用某些版本的Python之后,我个人在操作系统上遇到了问题。
我们可以努力工作,以确保我们正在使用所需的Python解释器。我们还可以努力将软件包安装到正确的搜索路径中,以使Python程序平稳运行。但是我们也可以创建一个虚拟环境来轻松确定地运行Python程序。
从物理上讲,虚拟环境是一个文件夹。这个文件夹几乎包含所有运行Python程序的内容。当我们安装软件包时,它也安装在此文件夹中。
要创建虚拟环境,我们需要安装“virtualenv”工具。在计算机上,我使用以下命令安装“virtualenv”。
sudo python3 -m pip install virtualenv
然后,我们可以验证安装是否成功。
安装“virtualenv”后,我们可以通过以下命令创建虚拟环境:
virtualenv -p /usr/bin/python3.4 environment-3.4
要激活虚拟环境,我们可以发出以下命令:
source environment-3.4/bin/activate
激活虚拟环境后,我们可以检查Python和pip的执行路径。
激活虚拟环境后,我们可以看到所有python,pip和搜索路径都位于虚拟环境文件夹内。我们可以通过以下命令停用虚拟环境:
deactivate
如果要完全删除虚拟环境,我们可以简单地删除“environment-3.4”文件夹。
出于实验目的,我在“python-flask-api.py”文件中创建了一个小的“flask”应用程序。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/')
def message():
name = 'Song Li'
return jsonify(
username = name,
email = '[email protected]',
)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=3000)
此应用程序需要“flask”软件包。激活虚拟环境后,我们可以使用以下命令来安装软件包:
python -m pip install flask
安装“flask”后,我们可以运行“python-flask-api.py”文件。
我们可以通过运行“python-inspect-path.py”文件来进一步验证虚拟环境中是否安装了“flask”软件包。
在虚拟环境上工作一段时间后,您可能已经安装了许多软件包。如果要让其他人运行您的程序,则需要告诉他们这些软件包和版本。激活虚拟环境后,可以发出以下命令:
python -m pip freeze > requirements.txt
它创建一个名为“requirements.txt”的文件,其中包含有关虚拟环境中软件包的所有信息。
Click==7.0
Flask==1.0.4
itsdangerous==1.1.0
Jinja2==2.10.3
MarkupSafe==1.1.1
Werkzeug==0.16.1
我们可以使用以下命令在新的虚拟环境中安装所有软件包:
python -m pip install -r requirements.txt
我们还可以通过以下命令删除“requirements.txt”文件中的所有软件包:
python -m pip uninstall -r requirements.txt -y
Visual Studio Code是用于Python程序的不错的IDE。如果您不熟悉VSC,可以看一下我以前的笔记。为了支持Python,我只需要安装Microsoft的Python扩展。
为了能够在虚拟环境中使用Python解释器运行和调试程序,我们可以简单地创建一个“launch.json”文件,如下所示。它将“pythonPath”指向虚拟环境。
{
"version": "0.2.0",
"configurations": [
{
"name": "python-search-path.py",
"pythonPath": "${workspaceFolder}/environment-3.4/bin/python",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/python-search-path.py",
"console": "integratedTerminal"
},
{
"name": "python-inspect-path.py",
"pythonPath": "${workspaceFolder}/environment-3.4/bin/python",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/python-inspect-path.py",
"console": "integratedTerminal"
},
{
"name": "python-flask-api.py",
"pythonPath": "${workspaceFolder}/environment-3.4/bin/python",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/python-flask-api.py",
"console": "integratedTerminal"
}
]
}
如果愿意,您实际上可以在“settings.json”文件中将路径添加到python可执行文件。
{
"files.exclude": {
"**/.git": true,
"**/.gitignore": true,
"**/environment-3.4": true
},
"python.pythonPath": "${workspaceFolder}/environment-3.4/bin/python3.4"
}
在这种情况下,无论何时打开终端,虚拟环境都会自动激活。
Flask和 Django是在Python环境中的web框架。“python-flask-api.py”是一个简单的flask应用程序。
import sys, os
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def message():
return jsonify(pid = os.getpid())
if __name__ == '__main__':
app.run(host='0.0.0.0', port=3000)
我们可以通过以下命令启动该应用程序。
python python-flask-api.py
但是,当我们启动应用程序时,我们看到以下警告。
我们需要找到一个好的服务器来托管应用程序。我们有很多选择,但Gunicorn是受欢迎的选择。实际上,我们可以在虚拟环境中安装 Gunicorn。
python -m pip install gunicorn
安装Gunicorn之后,我们可以在虚拟环境中运行它。
gunicorn --bind 0.0.0.0:8000 python-flask-api:app
如果一切顺利,我们现在可以通过“8000”端口号访问该应用程序。我们还可以添加“-w”选项以指定工作进程数。通常,服务器中每个内核的工作进程数为2-4。
Nginx是一种流行的负载平衡器。通常使用Nginx对多个Flask实例进行负载平衡。要在我的Linux Mint计算机上安装Nginx,我们可以使用以下命令。
apt-cache policy nginx
sudo apt-get install nginx
安装后,我们可以使用以下命令来操作Nginx服务器。
sudo service nginx start
sudo service nginx restart
sudo service nginx reload
sudo service nginx stop
service nginx status
因为我正在个人计算机上试验Nginx,所以我不想在启动计算机时启动它,所以我使用以下命令禁用该服务。
sudo update-rc.d nginx disable
为了设置负载平衡,我创建了一个名为“loadbalance.conf”的文件。
upstream pythonweb {
server localhost:4000;
server localhost:3000;
server localhost:2000;
}
# This balances all the requests
# It also disable caching
server {
listen 80;
location / {
proxy_pass "http://pythonweb/";
add_header Cache-Control
'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
}
}
# nginx.conf file
# Comment out this line - include /etc/nginx/sites-enabled/*;
#include /home/song/sandbox/p-virtualenv-excercise/loadbalance.conf;
在我的计算机中,我需要将该文件“包含”在“/etc/nginx/nginx.conf”文件中,并注释掉默认的“/etc/nginx/sites-enabled/*”。
#include /etc/nginx/sites-enabled/*;
include /home/song/sandbox/p-virtualenv-excercise/loadbalance.conf;
准备好配置后,我们可以重新启动或重新加载Nginx服务器。我们还需要在不同终端的端口号2000/3000/4000上启动Flask应用程序的3个实例。以下是在端口号2000上启动实例的命令。
gunicorn --bind 0.0.0.0:2000 python-flask-api:app
如果一切顺利,则可以通过端口号80访问应用程序,并且在3个Flask实例之间平衡请求。