pipenv 让你的虚拟环境更加funny一点

简介: pipenv 让你的虚拟环境更加funny一点

Referer


pipenv官方文档


pipenv pypi


什么是虚拟环境?


  • 由百度百科 得知:以专利的实时动态程序行为修饰与模拟算法,直接利用本机的 OS,模拟出自带与本机相容 OS 的虚拟机(Vista 下可模拟 Vista、XP,Windows 7 下则可模拟 Windows 7、Vista、XP),也称为 “虚拟环境”


  • 功能:每一个环境都相当于一个新的 Python 环境。你可以在这个新的环境里安装库,运行代码等


为什么需要使用虚拟环境?


  • 众所周知 Python 的强大在于其兼容性,其强大的社区等。因为第三方库多,层次不齐造成了许多的第三方库并不兼容


  • 真实环境与虚拟环境二者相对关联,并非绝对关联,可以在虚拟环境里面随便造。


  • 虚拟环境中进行了隔离,更方便我们部署上线


什么时候需要使用虚拟环境?


例如:


  • 项目依赖版本不同时


  • 所需包与其他包(非此项目所需,但却存在)产生冲突时


  • 等等


为什么虚拟环境使用`pipenv`好一点?


Pipenv是一种工具,旨在将所有包装领域(捆扎机,作曲家,npm,货物,纱线等)中的最佳产品引入Python世界。Windows是我们世界上的头等公民。


它会自动为您的项目创建和管理virtualenv,并Pipfile在您安装/卸载软件包时从您的软件包中添加/删除软件包。它还会生成非常重要的Pipfile.lock,用于生成确定性构建。


Pipenv的主要目的是为应用程序的用户和开发人员提供一种简单的方法来设置工作环境。有关库和应用程序之间的区别以及使用setup.pyvsPipfile定义依赖项的区别,请参见☤Pipfile vs setup.py。


Pipenv试图解决的问题是多方面的:


  • 您不再需要使用pipvirtualenv分开。他们一起工作。


  • 管理requirements.txt文件可能会出现问题,因此Pipenv使用PipfilePipfile.lock将抽象依赖声明与上次测试的组合分开。


  • 哈希值随处可见。安全。自动公开安全漏洞。


  • 强烈建议使用最新版本的依赖项,以最大程度地减少由于过时的组件引起的安全风险。


  • 让您深入了解依赖关系图(例如)。$ pipenv graph


  • 通过加载.env文件来简化开发工作流程。


pipenv安装


建议使用pip3, mac还是服务器上的Linux一般都会有python2.x版本。在这种场景大多情况下,pip指向python2.x,并非python3.x


1pip3 install --upgrade pip
2# 推荐使用pip来安装
3pip3 install pipenv


其他几种安装方式


1# If you’re on MacOS, you can install Pipenv easily with Homebrew:
2brew install pipenv
3
4# Or, if you’re using Fedora 28:
5sudo dnf install pipenv
6
7# if you're using centos
8sudo yum install -y pipenv


反正安装都一样,无论是使用其他的包管理工具还是pip,都可以


创建虚拟环境


1# python3 环境创建
2pipenv --python 3.x
3pipenv --three
4pipenv install
5
6# 创建完成后,虚拟环境的pip。并不是你真实环境的pip版本,如果有需要,需要升级一下pip 的版本
7python3 -m pip install --upgrade pip


值得一提的是,首先必须得安装了相对应的Python 版本才能创建虚拟环境。可能点萌萌哒。举个栗子,例如我的电脑环境中只有python3.7,而我想创建一个python2.7 这样是不能创建的


Pip3安装的pipenv 只能python3 只能使用


安装删除第三方库


1pipenv install packageName
2
3# 安装多个包,中间以空格分隔即可
4pipenv install packageName-1 packageName-2 packageNama-3
5
6pipenv uninstall packageName


Terminal激活虚拟环境


1pipenv shell


  • 此时终端会在最前面显示(xxx), xxx一般为项目文件名。证明退出成功


  • 并不需要关心虚拟环境的具体位置,只需要在当前目录下。有Pipfile即可


Terminal中退出虚拟环境


在其他包的虚拟环境中退出可能是使用deactivate,在conda 中使用conda deactivate,而在pipenv 中直接使用


1exit
2# 即可退出


如果使用deactivate,然后在使用pipenv shell,造成本终端页面进入虚拟环境失败。请参考勘误2


删除虚拟环境


在此项目目录下只需一下命令


1pipenv --rm


镜像源安装第三方包


我相信你也和我一样遇见过或尽力过下载第三方包失效包很慢,或者干脆出现timeout导致第三方包下载失败的情况,那么接下来让我们来使用国内的镜像源进行安装第三方包。速度嗖嗖嗖~


单一的安装


1# 以requests 为栗子
2 pipenv install requests  --pypi-mirror https://pypi.tuna.tsinghua.edu.cn/simple/


修改配置文件


使用pipenv创建虚拟环境之后会在项目目录下生成Pipfile,的文件。


1# Pipfile
 2[[source]]
 3url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
 4verify_ssl = true
 5name = "pypi"
 6
 7[packages]
 8requests = "*"
 9
10[dev-packages]
11
12[requires]
13python_version = "3.8"


获取包依赖


我们可以使用命令来清晰地呈现出当前安装的 Python 包版本及之间的依赖关系,命令如下:


1pipenv graph


~ ProjectNote % pipenv graph


lxml==4.6.2


requests==2.25.1


  • certifi [required: >=2017.4.17, installed: 2020.12.5]


  • chardet [required: >=3.0.2,<5, installed: 4.0.0]


  • idna [required: >=2.5,<3, installed: 2.10]


  • urllib3 [required: >=1.21.1,<1.27, installed: 1.26.2]


产生 Pipfile.lock


有时候可能 Pipfile.lock 文件不存在或被删除了,这时候我们可以使用如下命令生成:


1pipenv lock


以上就是pipenv基础使用了,但这还不够哦。接下来让我们深入探究一下


不知道但常用


1Usage: pipenv [OPTIONS] COMMAND [ARGS]...
 2
 3Options:
 4  --where                         Output project home information.
 5  --venv                          Output virtualenv information.
 6  --py                            Output Python interpreter information.
 7  --envs                          Output Environment Variable options.
 8  --rm                            Remove the virtualenv.
 9  --bare                          Minimal output.
10  --completion                    Output completion (to be executed by the
11                                  shell).
12
13  --man                           Display manpage.
14  --support                       Output diagnostic information for use in
15                                  GitHub issues.
16
17  --site-packages / --no-site-packages
18                                  Enable site-packages for the virtualenv.
19                                  [env var: PIPENV_SITE_PACKAGES]
20
21  --python TEXT                   Specify which version of Python virtualenv
22                                  should use.
23
24  --three / --two                 Use Python 3/2 when creating virtualenv.
25  --clear                         Clears caches (pipenv, pip, and pip-tools).
26                                  [env var: PIPENV_CLEAR]
27
28  -v, --verbose                   Verbose mode.
29  --pypi-mirror TEXT              Specify a PyPI mirror.
30  --version                       Show the version and exit.
31  -h, --help                      Show this message and exit.
32
33
34Usage Examples:
35   Create a new project using Python 3.7, specifically:
36   $ pipenv --python 3.7
37
38   Remove project virtualenv (inferred from current directory):
39   $ pipenv --rm
40
41   Install all dependencies for a project (including dev):
42   $ pipenv install --dev
43
44   Create a lockfile containing pre-releases:
45   $ pipenv lock --pre
46
47   Show a graph of your installed dependencies:
48   $ pipenv graph
49
50   Check your installed dependencies for security vulnerabilities:
51   $ pipenv check
52
53   Install a local setup.py into your virtual environment/Pipfile:
54   $ pipenv install -e .
55
56   Use a lower-level pip command:
57   $ pipenv run pip freeze
58
59Commands:
60  check      Checks for PyUp Safety security vulnerabilities and against PEP
61             508 markers provided in Pipfile.
62
63  clean      Uninstalls all packages not specified in Pipfile.lock.
64  graph      Displays currently-installed dependency graph information.
65  install    Installs provided packages and adds them to Pipfile, or (if no
66             packages are given), installs all packages from Pipfile.
67
68  lock       Generates Pipfile.lock.
69  open       View a given module in your editor.
70  run        Spawns a command installed into the virtualenv.
71  scripts    Lists scripts in current environment config.
72  shell      Spawns a shell within the virtualenv.
73  sync       Installs all packages specified in Pipfile.lock.
74  uninstall  Uninstalls a provided package and removes it from Pipfile.
75  update     Runs lock, then sync.


在真实环境中使用虚拟环境中包并运行


场景如下:


假设正式环境中为一个干净的仓库,有且仅有初始的包


虚拟环境中有所需要的第三方包。


如何实现在真实环境中使用虚拟环境中的第三方包并运行


1pipenv run python xxx.py


产生 Pipfile.lock


有时候可能 Pipfile.lock 文件不存在或被删除了,这时候我们可以使用以下命令生成:


1pipenv lock


批量安装第三方依赖包


部署的时候只需要将此执行一下命令即可安装所有的依赖包,它是依靠Pipfile.lock的


1pipenv sync


示例:使用pipenv 对接docker或其他的部署


只说不做假把式,只做不说傻把式。搞了这么多,来个case实现与项目接轨吧。这里为以docker部署为栗子


首先在项目中我们也使用虚拟环境去开发,当然也建议这样去做。没错,我是在教你做事。嘻嘻~


此时的项目该差不多如下,此时两个为必须存在一个是Pipfile, 一个是项目文件(文件夹)。deployDockerfile实现


640 (1).jpg


书写Dockerfile,拿docker部署没有Dockerfile是不阔能滴


Dockerfile实现如下,可以按需修改


1FROM python:3.8
2COPY . /code
3WORKDIR /code
4RUN sh deploy.sh
5CMD ["pipenv", "run", "python3", "testfile.py"]


Deploy.sh如下


其实deploy 其中的内容可以直接放到dockerfile中,我自己喜欢这样。更加清晰一点。啊,如此清晰的逻辑与结构,无敌~。我又在教你做事,大哥别杀我


1# 保持pip版本为最新版,及安装pipenv
2python3 -m pip install --upgrade pip  && pip3 install pipenv
3# 创建虚拟环境
4pipenv --python 3.8
5# 安装环境依赖(第三方包)
6pipenv update


这里需要注意的是,我建议你使用pipenv update,更加保险。


什么, 你问我为什么不用sync?


既然你诚心诚意的发问了,那我就大发慈悲的告诉你吧。哈哈~


pipenv update相当于执行了pipenv lockpipenv sync两个命令


如果用pipenv sync,而此时的你如果没有Pipfile.lock,那岂不是很尬


Docker build 执行结果如下


1Sending build context to Docker daemon  99.33kB
 2Step 1/5 : FROM python:3.8
 3 ---> d1bfb3dd9268
 4Step 2/5 : WORKDIR /code
 5 ---> Running in 74cda17b1483
 6Removing intermediate container 74cda17b1483
 7 ---> ecfd46d28538
 8Step 3/5 : COPY . /code
 9 ---> 8a89f329a4f9
10Step 4/5 : RUN pip install pipenv && sh deploy.sh
11 ---> Running in cea95051d481
12Collecting pipenv
13  Downloading pipenv-2020.11.15-py2.py3-none-any.whl (3.9 MB)
14Requirement already satisfied: setuptools>=36.2.1 in /usr/local/lib/python3.8/site-packages (from pipenv) (51.0.0)
15Requirement already satisfied: pip>=18.0 in /usr/local/lib/python3.8/site-packages (from pipenv) (20.3.3)
16Collecting virtualenv-clone>=0.2.5
17  Downloading virtualenv_clone-0.5.4-py2.py3-none-any.whl (6.6 kB)
18Collecting certifi
19  Downloading certifi-2020.12.5-py2.py3-none-any.whl (147 kB)
20Collecting virtualenv
21  Downloading virtualenv-20.2.2-py2.py3-none-any.whl (5.7 MB)
22Collecting appdirs<2,>=1.4.3
23  Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
24Collecting distlib<1,>=0.3.1
25  Downloading distlib-0.3.1-py2.py3-none-any.whl (335 kB)
26Collecting filelock<4,>=3.0.0
27  Downloading filelock-3.0.12-py3-none-any.whl (7.6 kB)
28Collecting six<2,>=1.9.0
29  Downloading six-1.15.0-py2.py3-none-any.whl (10 kB)
30Installing collected packages: six, filelock, distlib, appdirs, virtualenv-clone, virtualenv, certifi, pipenv
31Successfully installed appdirs-1.4.4 certifi-2020.12.5 distlib-0.3.1 filelock-3.0.12 pipenv-2020.11.15 six-1.15.0 virtualenv-20.2.2 virtualenv-clone-0.5.4
32Creating a virtualenv for this project...
33Pipfile: /code/Pipfile
34Using /usr/local/bin/python3.8 (3.8.6) to create virtualenv...
35⠦ Creating virtual environment...created virtual environment CPython3.8.6.final.0-64 in 1079ms
36  creator CPython3Posix(dest=/root/.local/share/virtualenvs/code-_Py8Si6I, clear=False, no_vcs_ignore=False, global=False)
37  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
38    added seed packages: pip==20.3.1, setuptools==51.0.0, wheel==0.36.1
39  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
40                                                                                                                                                                           ✔ Successfully created virtual environment! 
41Virtualenv location: /root/.local/share/virtualenvs/code-_Py8Si6I
42Installing dependencies from Pipfile.lock (d2a522)...
43To activate this project's virtualenv, run pipenv shell.
44Alternatively, run a command inside the virtualenv with pipenv run.
45All dependencies are now up-to-date!
46Removing intermediate container cea95051d481
47 ---> 5bc79a1c17b6
48Step 5/5 : CMD ["pipenv", "run", "python3", "testfile.py"]
49 ---> Running in d86af926715c
50Removing intermediate container d86af926715c
51 ---> a64b6bc63353
52Successfully built a64b6bc63353
53Successfully tagged test:1
54(ProjectNote) stringle-004@zhixiankeji-004s-MacBook-Pro ProjectNote % docker run  test:1
55<Response [200]>
56<!DOCTYPE html>
57<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 clabg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao1 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.bacom name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tlogin class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (windowocation.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
58                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> <tml>
59
60<Element html at 0x7fbfe776d100>
61


Docker 构建注意事项:


1# Pipfile文件
2[requires]
3python_version = "3.8"
4
5# dockerfile
6FROM python:3.8
7
8这两个后面跟的版本号必须一直,否则构建失败


  1. 使用pipenv update而不是pipenv sync,为什么,我就不告诉你了。看上面就好


勘误


1.pip版本过低造成安装失败


还记得我之前在服务器上,无论怎么安装就是安装不上,无论是其他包还是pipenv.后来硬是找不到什么原因。直到。。。


1# 查看pip 版本
2pip3 -V
3# or
4pip3 --version


输出结果类似如下


1~ % pip3 -V
2pip 20.3.3 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)


如果pip 的版本还不是20版本的,需要进行升级


1# 推荐
2python3 -m pip install --upgrade pip [--user]
3# 或者
4python3 -m pip install -U pip [--user]
5# 不推荐
6pip3 install --upgrade pip
7pip3 install -U pip


  • 其中[--user] 为可选参数,最好加上。一般情况下不加也没事


  • -m:run library module as a script (terminates option list) 将库模块作为脚本运行(终止选项列表)


2.虚拟环境重载错误


之前使用其他的python虚拟环境工具的时候,使用deactivate,退出虚拟环境。而pipenv, 并不是这样


使用deactivate,退出虚拟环境后又使用`pipenv shell, 进入虚拟环境,结果显示…


Shell for UNKNOWN_VIRTUAL_ENVIRONMENT already activated.


No action taken to avoid nested environments.


1# 先exit 一下即可,然后使用
2pipenv shell
3# 即可重新进入虚拟环境


  1. 创建虚拟环境需注意


pipenv 并不支持嵌套的虚拟环境,默认使用此文件的父级目录中的pipfile


比如:在projectfile中有文件src-1,pipfile, src-2,如果进入src-1 中执行pipenv installorpipenv --python 3.8or pipenv tree,中任何一个命令都会优先使用

目录
相关文章
|
4月前
|
Python
conda常见命令
conda常见命令
119 12
|
4月前
|
Shell Python
一些常见的 Conda 命令
一些常见的 Conda 命令
|
6月前
|
持续交付 开发工具 开发者
pip与virtualenv
【5月更文挑战第24天】本文介绍了Python开发中的模块和包管理工具pip与virtualenv。pip是Python的包管理器,用于安装、卸载、更新和列出包。virtualenv则提供了一个创建隔离的Python环境的工具,便于管理不同项目间的依赖关系。文章还提到了更高级的工具pipenv,它整合了pip和virtualenv的功能,支持自动化依赖管理、环境锁定,以及与Git、CI、Docker等的集成。通过学习和实践这些工具,开发者能更高效地管理Python项目。
43 1
|
6月前
|
Python
conda安装与使用——全称【Anaconda】
conda安装与使用——全称【Anaconda】
208 0
|
Python
Anaconda虚拟环境安装Python库与Spyder
本文介绍在Anaconda中,为Python的虚拟环境安装第三方库与Spyder等配套软件的方法~
437 1
Anaconda虚拟环境安装Python库与Spyder
|
Shell Python
python虚拟环境(venv、virtualenv)及虚拟环境管理工具(virtualenvwrapper)
&emsp;&emsp;Python应用开发时,本机的Python环境中安装各种各样的包的话,随着项目的增加,每次运行时都需要处理一下各种不同版本的依赖库,而且python版本也可能使用的不同,这样做很耗时。这就需要虚拟出不同的Python版本的环境,可以让虚拟环境专门为某一个应用而存在,且允许在虚拟环境中安装各种包。而且不影响本机大的python环境,便于开发环境和生产环境的管理。
426 0
|
数据挖掘 Linux C++
使用JupyterLab写C++
使用JupyterLab写C++
515 0
使用JupyterLab写C++
|
Docker Python 容器
virtualenv
virtualenv
83 0
|
Python
Conda | Conda的常用指令
Conda | Conda的常用指令
161 0
|
JSON 监控 安全
Python开发还在用virtualenv?是时候了解下pipenv了
过去大家经常使用virtualenv来创建虚拟环境,通过pip freeze生成requirements.txt文件,然后通过pip install -r requirements.txt进行项目模块的管理与安装。这样的安装存在很多问题,比如每次更新模块后,需要手动的重新生成依赖文件,等等问题。但看过今天的文章,你会更喜欢pipenv这款工具。
215 0