Debian下安装python虚拟环境
1.安装pip
apt install python3-pip
2.安装virtualenv
pip3 install virtualenv
3.安装指定版本的python环境
virtualenv -p /usr/bin/python py2
virtualenv -p /usr/bin/python3 py3
4.激活虚拟环境
cd py2/
source bin/activate
python -V
5.退出虚拟环境
deactivate
下面是详细介绍
python使用虚拟环境
Python工程师工作中常常遇到这样的场景:系统自带的Python是2.6,却需要用到Python2.7中的某些特性;不同的项目之间使用不同版本的某些包,但是因为某些原因(比如有依赖冲突)却不能都升级到最新版本。
所有的包都共用一个目录,很容易出现不小心更新了项目A的依赖,却影响了项目B用到的依赖的情况。这个时候就需要对环境进行隔离,使用虚拟环境让全局的site-packages目录非常干净和可管理。
Python社区中创建和管理虚拟环境的工具有virtualenv和pyvenv。这些工具可以帮助你快速创建一个单独、干净的Python环境,你可以把所需的包安装到各自孤立的环境中。
virtualenv
安装virtualenv:
pip install virtualenv
在linux系统中建立虚拟环境时,需要留意的是。linux系统直接输入python会执行2.7版本,要执行3.+版本时需要执行python3,此外,python3是放在/usr/bin/python3中,在建立虚拟环境是,可以在virtualenv后面加上 --python的参数设定成为Python3对应的版本,命令如下:
virtualenv --python=/usr/bin/python3 VENV
正常创建一个Python环境:
virtualenv venv
virtualenv默认会创建一个包含了Python可执行文件、常用的标准库、激活virtualenv环境的脚本的目录。
使用source激活virtualenv环境:
source venv/bin/activate
which python #注意终端提示的改变,前面添加了“(venv)”前缀。
/home/zixk/python_project/venv/bin/python
可以看到已经不再使用系统环境变量中的Python了。如果要退出虚拟环境,可以取消激活:
deactivate
虚拟环境扩展
virtualenvwrapper 是对virtualenv的功能扩展,它的用途:
- 用来管理全部的虚拟环境
- 能方便地创建、删除和拷贝虚拟环境
- 用单个命令就可以切换不同的虚拟环境
- 可以使用Tab补全虚拟环境
- 支持用户粒度的钩子支持
使用如下方式安装:
pip install virtualenvwrapper
安装完成后进行初始化
使用whereis virtualenvwrapper 查找安装的具体位置
将会得到如下输出:
virtualenvwrapper: /home/zi/.local/bin/virtualenvwrapper.sh
执行初始化命令:
export WORKON_HOME=~/venvs
source /home/zi/.local/bin/virtualenvwrapper.sh
初始化之后~/venv目录也会添加一下用户级别的virtualenvwrapper的钩子模版。
通常上述两行会放在shell的配置里面,比如~/.zshrc,这样每次登录是就自动初始化了。
初始化时给系统添加了一些虚拟环境相关的函数,比如用来创建虚拟环境的mkvirtualenv:
mkvirtualenv test
这里我们有成功创建了一个名为test的虚拟环境,退出虚拟环境还是使用:deactivate
mkvirtualenv 还会添加如下5个项目级别的钩子模版。
- predeactivate:在虚拟环境取消激活之前执行。
- postdeactivate:在虚拟环境取消激活之后执行。
- preactivate:在虚拟环境激活之前执行。
- postactivate:在虚拟环境激活之后执行。
- get_env_details:使用lsvirtualenv/showvirtualenv等命令时,对于当前环境的额外钩子,可以添加虚拟环境介绍等内容。
添加一个钩子,在取消激活之后输出:“Deactivated!”:
cat /home/zi/venvs/test/bin/postdeactivate
#!/bin/bash
# This hook is sourced after this virtualenv is deactivated.
echo "Deactivated!" >> /home/zi/venvs/test/bin/postdeactivate
(test) zi@zi:~/venvs$ deactivate
Deactivated!
zi@zi:~/venvs$
我在有多个虚拟环境的时候,可以使用Tab管理他们:
workon <Tab> #输入workon,然后按键盘Tab建
django study test #当前有三个虚拟环境
workon django #直接使用workon 就可以切换到django
workon study #直接使用workon 就可以切换到study
其他常用命令
- lsvirtualenv:列出全部的虚拟环境
- showvirtualenv:列出单个虚拟环境的信息
- rmvirtualenv:删除一个虚拟环境
- cpvirtualenv:拷贝一个虚拟环境
- allvirtualenv:对当前虚拟环境执行统一的命令。比如,要给study和django都按照flake8,就可以用:allvirtualenv pip install flake8
- cdvirtualenv:可以直接切换到虚拟环境的子目录里面。
(django) zi@zi:~$ cdvirtualenv bin (django) zi@zi:~/venvs/django/bin$ pwd /home/zi/venvs/django/bin (django) zi@zi:~/venvs/django/bin$
- cdsitepackages:和cdvirtualenv同理,切换到虚拟环境的site-packages目录下。
- lssitepackages:列出site-packages目录下的目录。
用户级别的钩子脚本
用户级别的钩子脚本都在VIRTUALENVWRAPPER_HOOK_DIR这个变量的目录下,默认是WORKON_HOME变量指定的目录。
常用的钩子脚本如下。
- get_env_details:当不带参数执行workon时执行。
- postmkvirtualenv:在虚拟环境创建和激活之后执行。
- preactivate:在虚拟环境激活之前执行。
- postactivate:在虚拟环境激活之后执行。
- predeactivate:在虚拟环境取消激活之前执行。
- postdeactivate:在虚拟环境取消激活之后执行。
- prermvirtualenv:在虚拟环境删除之前执行。
- postrmvirtualenv:在虚拟环境删除之后执行。
windows系统中搭建虚拟环境注意点:
需要使用管理员身份运行powershell执行如下命令,否则虚拟环境无法正常使用:
get-ExecutionPolicy
set-ExecutionPolicy RemoteSigned
然后输入:Y
启用虚拟环境:
虚拟环境工作路径\Scripts\activate
执行成功后前面会出现一个(venv)
##虚拟环境创建完成后开始安装Django
详细使用请查看:https://docs.djangoproject.com/zh-hans/3.2/intro/tutorial01/
安装django:
python -m pip install Django
Django版本查看:
python -m django --version
创建项目
django-admin startproject mysite #mysite为项目名称
这些目录和文件的用处是:
最外层的 mysite/ 根目录只是你项目的容器, 根目录名称对 Django 没有影响,你可以将它重命名为任何你喜欢的名称。
manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。
里面一层的 mysite/ 目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 mysite.urls).
mysite/init.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
mysite/settings.py:Django 项目的配置文件。
mysite/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。
mysite/asgi.py:作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。
mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。
设置时区和语音支持:
修改项目中settings.py
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
运行项目
如果你的当前目录不是外层的 mysite 目录的话,请切换到此目录,然后运行下面的命令:
python manage.py runserver
更换端口
默认情况下,runserver 命令会将服务器设置为监听本机内部 IP 的 8000 端口。
如果你想更换服务器的监听端口,请使用命令行参数。举个例子,下面的命令会使服务器监听 8080 端口:
python manage.py runserver 8080
如果你想要修改服务器监听的IP,在端口之前输入新的。比如,为了监听所有服务器的公开IP(这你运行 Vagrant 或想要向网络上的其它电脑展示你的成果时很有用),使用:
python manage.py runserver 0:8000 #0 是 0.0.0.0 的简写注意,windows10上面IP需要写成(0.0.0.0)才能正常启动
创建应用
python manage.py startapp polls #polls为创建应用名称,可以放在任何python路径中定义的路径。
创建应用的大致目录为:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
settings.py 配置文件内容说明:
INSTALLED_APPS = [
'django.contrib.admin', #-- 管理员站点
'django.contrib.auth', #-- 认证授权系统
'django.contrib.contenttypes', #-- 内容类型框架
'django.contrib.sessions', #-- 会话框架
'django.contrib.messages', #-- 消息框架
'django.contrib.staticfiles', #-- 管理静态文件的框架
]
这些应用被默认启用是为了给常规项目提供方便
INSTALLED_APPS 设置项。这里包括了会在你项目中启用的所有 Django 应用。应用能在多个项目中使用,你也可以打包并且发布应用,让别人使用它们。
写给极简主义者
就像之前说的,为了方便大多数项目,我们默认激活了一些应用,但并不是每个人都需要它们。如果你不需要某个或某些应用,你可以在运行 migrate 前毫无顾虑地从 INSTALLED_APPS 里注释或者删除掉它们。 migrate 命令只会为在 INSTALLED_APPS 里声明了的应用进行数据库迁移。
数据库配置
数据库配置在项目的settings.py里面。
通常,这个配置文件使用 SQLite 作为默认数据库。
如果你想使用其他数据库,你需要安装合适的 database bindings ,然后改变设置文件中 DATABASES ‘default’ 项目中的一些键值:
ENGINE – 可选值有
‘django.db.backends.sqlite3’,
‘django.db.backends.postgresql’,
‘django.db.backends.mysql’,
‘django.db.backends.oracle’。其它 可用后端。
NAME – 数据库的名称。如果你使用 SQLite,数据库将是你电脑上的一个文件,在这种情况下,NAME 应该是此文件完整的绝对路径,包括文件名。默认值 BASE_DIR / ‘db.sqlite3’ 将把数据库文件储存在项目的根目录。
如果你不使用 SQLite,则必须添加一些额外设置,比如 USER 、 PASSWORD 、 HOST 等等。
mariadb、mysql数据库运用配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS':{
'read_default_file':os.path.dirname(os.path.abspath(__file__))+'/conf/my.cnf',
},
}
}
安装数据库连接驱动:
在安装数据库连接驱动的时候可能无法正确安装,因为系统缺少部分支持文件,需要先安装对应的支持包,如下:
apt-get install libmysqlclient-dev #Ubuntu
apt-get install libmariadb-dev-compat #debian10
apt-get install libssl-dev
pip install mysqlclient #Django 需要 mysqlclient 1.4.0 或更高版本。
默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。请执行以下命令:
python manage.py migrate
这个 migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表,至于具体会创建什么,这取决于你的 mysite/settings.py 设置文件和每个应用的数据库迁移文件。这个命令所执行的每个迁移操作都会在终端中显示出来。如果你感兴趣的话,运行你数据库的命令行工具,并输入 \dt (PostgreSQL)、SHOW TABLES; (MariaDB,MySQL)、.schema (SQLite)或者 SELECT TABLE_NAME FROM USER_TABLES; (Oracle)来看看 Django 到底创建了哪些表。
激活模型
为了在我们的工程中包含这个应用,我们需要在配置类 INSTALLED_APPS 中添加设置。因为 PollsConfig 类写在文件 polls/apps.py 中,所以它的点式路径是 ‘polls.apps.PollsConfig’。在文件 mysite/settings.py 中 INSTALLED_APPS 子项添加点式路径后,它看起来像这样:
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
现在你的 Django 项目会包含 polls 应用。接着运行下面的命令:
python manage.py makemigrations polls
看到输出如下内容:
Migrations for 'polls':
polls\migrations\0001_initial.py
- Create model Question
- Create model Choice
通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。
迁移是 Django 对于模型定义(也就是你的数据库结构)的变化的储存形式 - 它们其实也只是一些你磁盘上的文件。如果你想的话,你可以阅读一下你模型的迁移数据,它被储存在 polls/migrations/0001_initial.py 里。别担心,你不需要每次都阅读迁移文件,但是它们被设计成人类可读的形式,这是为了便于你手动调整 Django 的修改方式。
Django 有一个自动执行数据库迁移并同步管理你的数据库结构的命令 - 这个命令是 migrate,我们马上就会接触它 - 但是首先,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL:
python manage.py sqlmigrate polls 0001
你将会看到类似下面这样的输出(我把输出重组成了人类可读的格式):
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" integer NOT NULL
);
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
请注意以下几点:
输出的内容和你使用的数据库有关,上面的输出示例使用的是 PostgreSQL。
数据库的表名是由应用名(polls)和模型名的小写形式( question 和 choice)连接而来。(如果需要,你可以自定义此行为。)
主键(IDs)会被自动创建。(当然,你也可以自定义。)
默认的,Django 会在外键字段名后追加字符串 “_id” 。(同样,这也可以自定义。)
外键关系由 FOREIGN KEY 生成。你不用关心 DEFERRABLE 部分,它只是告诉 PostgreSQL,请在事务全都执行完之后再创建外键关系。
生成的 SQL 语句是为你所用的数据库定制的,所以那些和数据库有关的字段类型,比如 auto_increment (MySQL)、 serial (PostgreSQL)和 integer primary key autoincrement (SQLite),Django 会帮你自动处理。那些和引号相关的事情 - 例如,是使用单引号还是双引号 - 也一样会被自动处理。
这个 sqlmigrate 命令并没有真正在你的数据库中的执行迁移 - 相反,它只是把命令输出到屏幕上,让你看看 Django 认为需要执行哪些 SQL 语句。这在你想看看 Django 到底准备做什么,或者当你是数据库管理员,需要写脚本来批量处理数据库时会很有用。
如果你感兴趣,你也可以试试运行 python manage.py check ;这个命令帮助你检查项目中的问题,并且在检查过程中不会对数据库进行任何操作。
现在,再次运行 migrate 命令,在数据库里创建新定义的模型的数据表:
python manage.py migrate
输出如下:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
这个 migrate 命令选中所有还没有执行过的迁移(Django 通过在数据库中创建一个特殊的表 django_migrations 来跟踪执行过哪些迁移)并应用在数据库上 - 也就是将你对模型的更改同步到数据库结构上。
迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表 - 它专注于使数据库平滑升级而不会丢失数据。我们会在后面的教程中更加深入的学习这部分内容,现在,你只需要记住,改变模型需要这三步:
编辑 models.py 文件,改变模型。
python manage.py makemigrations #为模型的改变生成迁移文件。
python manage.py migrate #来应用数据库迁移。
数据库迁移被分解成生成和应用两个命令是为了让你能够在代码控制系统上提交迁移数据并使其能在多个应用里使用;这不仅仅会让开发更加简单,也给别的开发者和生产环境中的使用带来方便。
初试 API
现在让我们进入交互式 Python 命令行,尝试一下 Django 为你创建的各种 API。通过以下命令打开 Python 命令行:
python manage.py shell
Django 管理页面
创建一个管理员账号
python manage.py createsuperuser
键入你想要使用的用户名,然后按下回车键:
Username: admin
然后提示你输入想要使用的邮件地址:
Email address: admin@example.com
最后一步是输入密码。你会被要求输入两次密码,第二次的目的是为了确认第一次输入的确实是你想要的密码。
Password: **********
Password (again): *********
Superuser created successfully.
启动开发服务器
Django 的管理界面默认就是启用的。让我们启动开发服务器,看看它到底是什么样的。
##如果开发服务器未启动,用以下命令启动它:
python manage.py runserver
一个快捷函数: render()一个快捷函数: render()
「载入模板,填充上下文,再返回由它生成的 HttpResponse 对象」是一个非常常用的操作流程。
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
一个快捷函数: get_object_or_404()
尝试用 get() 函数获取一个对象,如果不存在就抛出 Http404 错误也是一个普遍的流程。
from django.shortcuts import get_object_or_404, render
from .models import Question
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
一个快捷函数: get_object_or_404()
尝试用 get() 函数获取一个对象,如果不存在就抛出 Http404 错误也是一个普遍的流程。
from django.shortcuts import get_object_or_404, render
from .models import Question
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})