首页 » PHP教程 » lavelphp技巧_Python多情形治理神器pipenv

lavelphp技巧_Python多情形治理神器pipenv

访客 2024-11-12 0

扫一扫用手机浏览

文章目录 [+]

pipenv 是一款比较新的包管理工具,其借鉴了 javascript 的 npm 和 PHP 的 composer 等理念,通过一个依赖描述文件 Pipfile 来安装和管理依赖,以达到协同开拓的目的。
如果你熟习 npm 或者 composer 的话,那 pipenv 正合你胃口。
pipenv 实在整合了 pip 和 virtualenv 等库,在其上推出了更便捷的利用办法。

1、安装pipenv

直策应用pip命令安装

lavelphp技巧_Python多情形治理神器pipenv

pip3 install pipenv

设置命令行的自动补全功能

lavelphp技巧_Python多情形治理神器pipenv
(图片来自网络侵删)

如果利用的bash shell,请将以下代码添加到 .bashrc 或 .bash_profile 文件内:

eval "$(pipenv --completion)"

参考: https://blog.csdn.net/swinfans/article/details/89305301

命令详解:

$ pipenvUsage: pipenv [OPTIONS] COMMAND [ARGS]...Options: --where 输出项目根目录干系信息 --venv 输出virtualenv干系信息 --py 输出Python阐明器干系信息 --envs 输出环境变量选项 --rm 删除virtualenv --bare 最小化输出 --completion 命令自动补全 --man 显示man页面 --three / --two 在创建virtualenv时利用Python3或Python2 --python TEXT 指定创建virtualenv时利用的详细的Python版本 --site-packages 为virtualenv启用site-packages [env变量:PIPENV_SITE_PACKAGES] --clear 打消缓存(pipenv,pip和pip-tools)[env变量:PIPENV_CLEAR] --pypi-mirror TEXT 指定一个PyPI镜像 --version 显示版本信息并退出 -h, --help 显示帮助信息并退出利用示例: 创建一个项目,并明确指定利用Python3.7: $ pipenv --python 3.7 删除项目的virtualenv (inferred from current directory): $ pipenv --rm 为项目安装所有依赖项 (including dev): $ pipenv install --dev 创建包含pre-releases的lockfile文件: $ pipenv lock --pre 将已安装的依赖项显示为图表: $ pipenv graph 检讨已安装的依赖项是否存在安全漏洞: $ pipenv check 安装一个本地的setup.py到你的虚拟环境或Pipfile: $ pipenv install -e . 利用原生的pip命令: $ pipenv run pip freezeCommands: check 根据 Pipfile 中供应的PEP 508标记检讨安全漏洞 clean 卸载所有 Pipfile.lock 未指定的包 graph 显示当前安装的依赖项的关系图信息 install 如果未指定要安装的包,则会安装 Pipfile 中的所有包,否则,只安装指定的包 lock 天生 Pipfile.lock 文件 open 在编辑器中查看给定的模块 run 运行virtualenv中已安装的命令 shell 在virtualenv内启动一个shell sync 安装 Pipfile.lock 中指定的所有的包 uninstall 卸载一个指定的包并将其从 Pipfile 中移除 update 先运行lock命令,在运行sync命令2、pipenv虚拟环境管理2.1、虚拟环境创建与激活创建虚拟环境

# 进入项目目录:[root@ops-130 data]# mkdir myproj10[root@ops-130 data]# cd myproj10/[root@ops-130 myproj10]# ls[root@ops-130 myproj10]# pipenv install

上面的命令会自动在~/.local/share/virtualenvs/目录下创建虚拟环境目录,

名字为一个当前目录名加一串随机字符串的虚拟环境目录。
这里是myproj10-740tHe3W

创建过程如下图:

下面多了两个文件,为Pipfile和Pipfile.lock,用于存放依赖包名的文件。

类似php里的composer.json和composer.lock。

[root@ops-130 myproj10]# lsPipfile Pipfile.lock查看虚拟环境

[root@ops-130 myproj10]# pipenv --venv/root/.virtualenvs/myproj10-740tHe3W

我们的虚拟环境目录在/root/.virtualenvs/下面,是由于我们之前设置过环境变量

export WORKON_HOME=$HOME/.virtualenvs激活虚拟环境:

cd /data/myproj10pipenv shell

激活后如下图:

把稳:上面激活虚拟环境的时候,涌现了这么一个告警:

Warning: Your Pipfile requires python_version 2.7, but you are using 3.9.9 (/root/./m/bin/python).

缘故原由:这是由于创建虚拟环境的时候,没有指定python阐明器,Pipfile就利用系统默认的python阐明器了,便是2.7.5,但是pipenv却是利用系统最新的阐明器3.9.

办理办法:

办法一:手动修正Pipfile

手动修正Pipfile文件里的python_version

把稳:Pipfile.lock里的也要修正

vim Pipfile[[source]]url = "https://pypi.org/simple"verify_ssl = truename = "pypi"[packages][dev-packages][requires]python_version = "3.9"

办法二:删除虚拟环境,重新创建虚拟环境

删除虚拟环境后,再次安装会覆盖之前的Pipfile,利用新环境。
如果不删除,无法覆盖。

# pipenv --rm删除当前虚拟环境,把稳Pipfile不会被删掉[root@ops-130 myproj10]# pipenv --rm# 利用pipenv重新安装,指定阐明器版本为3.X[root@ops-130 myproj10]# pipenv install --three# 此时再次查看Pipfile版本就和环境同等了。
[root@ops-130 myproj10]# cat Pipfile

如下图:

退出虚拟环境:exit

((myproj10) ) [root@ops-130 myproj10]# exitexit[root@ops-130 myproj10]#

刚创建好虚拟环境的时候,会自动进入虚拟环境,并且此时是没有前缀显示,此时须要用exit退出。

当后面用pipenv shell激活的时候,会显示前缀,此时可以用exit退出,也可以利用deactivate退出。

删除虚拟环境

[root@ops-130 myproj10]# pipenv --rm Removing virtualenv (/root/.virtualenvs/myproj10-740tHe3W)...2.2、创建虚拟环境的多种办法

pipenv创建虚拟环境有多种办法,这里总结一下:

办法一:指定阐明器创建虚拟环境

# 创建虚拟环境pipenv --three# 或者pipenv --python 3.9

这种办法是指定python阐明器,并创建虚拟环境。

它会在当前目录天生Pipfile,不会天生Pipfile.lock

这种办法创建虚拟环境后,会自动进入虚拟环境,但是进入后也不会显示前缀

办法二:安装所有依赖时创建虚拟环境

# 创建虚拟环境pipenv install

这种办法是在安装依赖包的同时创建虚拟环境。

由于pipenv install,便是根据Pipfile来安装所有依赖,类似npm install

如果当前目录没有Pipfile,它就会自动创建Pipfile并创建虚拟环境。

由于这种办法它已经在安装所有依赖了,以是不仅会创建Pipfile,也会创建Pipfile.lock文件。

同时,它创建虚拟环境后,也会自动进入环境,但是也不会显示前缀。

如下图:

办法三:激活时创建虚拟环境

# 激活,如果环境不存在,则创建虚拟环境并激活pipenv shell

这个命令紧张用于激活环境,但是如果环境不存在,则会先创建虚拟环境,并同时激活虚拟环境。

这种办法由于利用了pipenv shell激活了,以是创建虚拟环境后,也会自动进入虚拟环境,并激活。

会显示虚拟环境前缀。

如下图:

2.3、修正虚拟环境目录位置

有三种方法:

方法一:

# 方法一:# 设置这个环境变量,pipenv会在当前目录下创建.venv的目录,往后都会把模块装到这个.venv下。
export PIPENV_VENV_IN_PROJECT=1

方法二:

# 自己在项目目录下手动创建.venv的目录,然后运行 pipenv run 或者 pipenv shell pipenv都会在.venv下创建虚拟环境。
mkdir .venvpipenv shell

方法三:

# 设置WORKON_HOME到其他的地方 (如果当前目录下已经有.venv,此项设置失落效)。
export WORKON_HOME=$HOME/.virtualenvs

把稳:

小技巧: 如果子级目录的父级目录已经创建过虚拟环境, 则子级目录无法创建虚拟目录(子级目录无法天生Pipfile, 子级默认会利用父级的虚拟环境), 如果确实须要在子级目录创建独立的虚拟环境,可以运行pipenv --where 获取父级虚拟环境的名字, 根据虚拟环境的前半部分名字, 确定父级目录的位置, 然后删除父级目录下的Pipfile, Pipfile.lock, 运行exit退出父级虚拟环境,然后回到子目录,运行pipenv --three创建子目录的虚拟环境即可

2.4、干系定位操作

定位项目目录:

[root@ops-130 aaa]# pipenv --where/data/myproj10

定位虚拟环境目录,即virtualenv目录

[root@ops-130 aaa]# pipenv --venv/root/.virtualenvs/myproj10-740tHe3W

定位Python阐明器:

[root@ops-130 aaa]# pipenv --py/root/.virtualenvs/myproj10-740tHe3W/bin/python

如下图:

3、pipenv包管理安装依赖包:

安装干系依赖包,并加入到Pipfile

pipenv install flask

它会在当前环境安装flask依赖包,并记录flask包名以及版本信息,记录到Pipfile里。

如果安装的时候,没有指定包名,默认是最新的,会记录为“”

把稳:Pipfile只会记录你install里指定的包,但是这个flask包本身所依赖的包不会记录,

但是所有的依赖详情都会记录到Pipfile.lock中。

Pipfile.lock类似如下:

查看目前安装的库及其依赖关系

pipenv graph

如下图:这是所有的完全依赖关系,这些会记录在Pipfile.lock中。

Pipfile会记录当前虚拟环境安装的所有依赖包及其对应的版本,当我们须要迁移项目,支配新项目,或者有新人接手时,就可以直接拿到这个Pipfile和Pipfile.lock文件,直接pipenv install即可,它就会按照Pipfile里的包,把所有的依赖文件都安装上,是不是很方便。

安装所有依赖包:

# 根据Pipfile的记录,安装所有依赖包pipenv install指定安装包版本:

你可以利用 语义化( https://semver.org/ )的版本掌握方案 指定包的版本。
例如 major.minor.micro 。

例如,你可以利用如下的命令安装 requests:

pipenv install requests~=1.2 # 相称于 requests~=1.2.0

Pipenv 将安装 1.2 版本和任何 minor 版本的更新,但不会安装 2.0 版本。

上面的命令将会自动更新 Pipfile 文件以表示这个分外的需求。

常日,Pipenv利用与pip相同的参数格式。
但是,请把稳,根据PEP 440,您不能利用包含连字符或加号的版本号。

要指定包含或者打消详细的版本,您可以利用如下命令:

pipenv install "requests>=1.4" # 只安装即是或者大于 1.4.0 的版本pipenv install "requests<=2.13" # 只安装小于或者即是 2.13.0 的版本pipenv install "requests>2.19" # 安装 2.19.1 版本但是不安装 2.19.0 版本

把稳:强烈建议利用双引号包裹包名和版本号以避免unix操作系统中的输入和输出重定向问题。

请优先利用 ~= 标识符而不是 == 标识符,由于后者会阻挡 pipenv 更新包:

pipenv install "requests~=2.2" # 锁定包的主版本(这相称于利用==2.)

要避免安装某个特定的版本,可以利用 != 标识符。

要深入阐明有效标识符和更繁芜的用例,请查看 PEP-440 的干系部分。

https://www.python.org/dev/peps/pep-0440/#version-specifiers%3E

卸载依赖包:

卸载指定包:

pipenv uninstall flask

卸载包后,干系包和依赖详情会从Pipfile和Pipfile.lock中移除。

卸载当前环境所有包:

# 从虚拟环境中移除所有已安装的包,但 Pipfile.lock 文件不受影响pipenv uninstall --all

卸载开拓包:

# 从虚拟环境中卸载所有开拓包,并从 Pipfile 文件中移除这些包pipenv uninstall –all-dev更新依赖包:

查看所有须要更新的包:

pipenv update --outdated

如下图:

更新指定包:

pipenv update <包名>

更新所有包:

pipenv update

检讨安全漏洞:

pipenv check # 检讨安全漏洞

它可能会检讨出很多缺点,实在如果不影响你利用,你可以直接忽略掉。
强制症患者也可以一个一个问题去办理。

比如如下问题:

修正pipenv的镜像源

可以修合法前目录下Pipfile文件,将[source]下的url属性改成海内的源即可:

[[source]]url = "https://mirrors.aliyun.com/pypi/simple"verify_ssl = truename = "pypi"3、环境支配利用pipenv进行多环境支配

dev与正式环境区分安装。

当你想要一个包只在开拓环境利用,等生产支配的时候,不须要该安装包,你可以这样指定环境安装。

# 把django安装在开拓环境pipenv install django --dev

安装如下图

安装完成后,查看Pipfile文件:

会创造,pipenv已经将安装包区分开来了。

[dev-packages] 里记录的--dev开拓环境安装的包

[package] 里记录的是没有加环境参数,默认便是正式环境的包。

那么等到你真正迁移莅临盆环境支配的时候,就只须要这么做:

pipenv install

这样默认是只安装[package] 里的安装包的,会自动过滤掉[dev-packages] 里的包。

让生产环境变得更加纯净,避免有多余的包。

如下:这是直接pipenv install的,里面是没有django包的

如果你要迁移到开拓环境,只须要这么做:

pipenv install --dev

它就会把[dev-packages] 里的包也一起安装上了。

如下:

这是利用了--dev参数的,看到已经把djiango安装上了。

4、Pipfile.lock文件

Pipfile.lock 利用了pip中一些新的安全改进。
默认情形下,Pipfile.lock 包含每个下载的包的 sha256 哈希值。
这可以使pip能够担保从不信赖的PyPI源安装包时或者在不稳定的网络环境下安装包时都能担保包的精确性与完全性。
我们强烈建议通过将项目从开拓环境提升莅临盆环境来进行支配。
您可以利用 pipenv lock 编译开拓环境上的依赖项,并将编译后的 Pipfile.lock 文件支配到您所有的生产环境,以便进行可重现的构建。

(利用Pipfile.lock可以锁定之前的安装包,确保迁移重新支配后,能够重现跟之前一样的环境。

Pipfile和Pipfile.lock不一致

由于利用pipenv install的时候,加上–ignore-lock参数,可以忽略 Pipfile.lock 文件而直接安装 Pipfile 中的包。
此外,不会更新 Pipfile.lock 文件。

当pipenv install安装一些比较大的包,比如TensorFlow等科学包,在安装完包,正在解析包依赖的时候,可能会花费很永劫光,可能就会ctrl+C停滞掉了,此时包已经安装完成,Pipfile已经写入完成,但是没有解析完依赖,以是Pipfile.lock没有写入完成。

这两种情形都会导致Pipfile和Pipfile.lock不一致的情形,会对应不上。

此时,可以利用Pipenv lock重新天生Pipfile.lock文件。

pipenv lock

如果通过 pipenv 命令安装和卸载 package,安装或卸载完成后还会更新 Pipfile.lock 文件,有时候会卡在这个步骤。
常日可以 ctrl+c 逼迫推出,删除 Pipfile.lock, 然后

# 重新天生Pipfile.lock文件pipenv lock

默认情形下,利用pipenv install,它会重新解析Pipfile里安装包的依赖性,并将依赖关系更新到Pipfile.lock中。
如果你不想要重新解析Pipfile里安装包,只想安装Pipfile.lock文件中现存的依赖包,可以精确的指定只利用Pipfile.lock文件。

pipenv sync

可以利用 sync 命令精确安装 Pipfile.lock 文件中指定的包:

pipenv sync

把稳:pipenv install --ignore-pipfile 和 pipenv sync 命令很相似,但是pipenv sync 命令永久不会考试测验重新锁定依赖项,由于它被认为是一个原子操作。
默认情形下,除非利用了 –deploy 标志,否则 pipenv install 会考试测验重新锁定依赖项。

pipenv install --deploy

可以利用 –deploy 标志逼迫Pipfile.lock 文件是最新的。

上述命令将在Pipfile.lock 文件不是最新的时候导致构建失落败,而不是天生一个新的。

5、兼容requirements.txt

之前我们的pip工具可以从requierments.txt文件中导入依赖包。

在pipenv,用下面的命令就可以将Pipfile和Pipfile.lock文件里面的包导出为requirements.txt文件。

# 将Pipfile里的全部包导出到requirements.txtpipenv lock -r > requirements.txt

内容如下:

可以选择只导出开拓环境的包:

# 只导出开拓环境的包pipenv lock -r --dev-only > requirements.txt

如下图:

导出开拓环境+ 默认的环境的包:

# dev环境和default环境的包都会导出pipenv lock -r --dev > requirements.txt

如下图:

也可以利用底层pip的命令导出:

pipenv run pip freeze > requirements.txt

如下图:

导入requirements.txt

导出为requirements.txt后,可以通过pip导入,也可以通过pipenv导入。

# 通过pip导入pip install -r requirements.txt# 通过pipenv导入pipenv install -r requirements.txt6、虚拟环境中运行命令:启动shell运行

正常来说,如果想要让命令运行在虚拟环境,须要启动一个虚拟环境的shell,否则命令还是在系统环境下运行的,如下:

pipenv shell

如下图:

利用run运行:

如果不想启动shell,而是直接在虚拟环境中实行命令,可以利用run:

# pipenv run <命令>pipenv run python --version

如下图:

支配项目的时候,你也可以不进入虚拟环境的办法运行项目:

pipenv run python xxx.py7、环境变量:(.env)自动加载.env文件 (利器)

.env文件可以设置一些环境变量,在程序开拓的时候仿照环境变量。

如果项目目录下包含一个 .env 文件,它会被 pipenv shell 和 pipenv run 命令自动加载:

# 如下,设置一个变量HELLO,以及配置文件路径的变量[root@ops-130 myproj10]# cat .env HELLO=WORLDCONFIG_PATH=${HOME}/.config/foo# 测试环境变量# 利用pipenv run的时候,会自动加载该环境变量。
[root@ops-130 myproj10]# pipenv run pythonLoading .env environment variables...Python 3.9.9 (main, Dec 31 2021, 15:34:46) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import os>>> os.environ['HELLO']'WORLD'>>> os.environ['CONFIG_PATH']'/root/.config/foo'>>>

这类似于php的lavel框架的.env文件。

这对付将生产凭据打消在代码库之外非常有用。
我们不建议将 .env 文件提交到源代码掌握中!

如果你的 .env 文件位于不同的路径下或者有其他名称,你可以设置一个PIPENV_DOTENV_LOCATION 环境变量:

PIPENV_DOTENV_LOCATION=/path/to/.env pipenv shell

要禁止pipenv加载 .env 文件,可以设置 PIPENV_DONT_LOAD_ENV 环境变量:

PIPENV_DONT_LOAD_ENV=1 pipenv shellPipfile引用环境变量:

在Pipfile中也可以引用环境变量的值,格式为${MY_ENVAR}或$MY_ENVAR,在Windows系统中还支持%MY_ENVAR%。

[[source]]url = "https://${PYPI_USERNAME}:${PYPI_PASSWORD}@my_private_repo.example.com/simple"verify_ssl = truename = "pypi"[packages]flask = ""jieba = ""[dev-packages]django = ""[requires]python_version = "3.9"

这里的变量为:${PYPI_USERNAME}:${PYPI_PASSWORD}

利用条件是,系统中要已经设置了干系的变量。

当然你可以结合.env文件,将干系变量设置在.env里。

从setup.py安装依赖包

很多依赖库都包含setup.py文件,里面也包含了对应包的子依赖信息,这个文件跟Pipfile.lock有点相似,pipenv也供应了堆setup.py的支持。

pipenv也可以从setup.py安装:

pipenv install -e .

更多pipenv的用法,请参考官网: https://pipenv.pypa.io/en/latest/

8、优缺陷剖析:

1、pipenv集成了pip,virtualenv两者的功能,且完善了两者的一些毛病。

2、支持Python2 和 Python3,在各个平台的命令都是一样的。

3、类似npm,随意马虎迁移,便于项目内部协同事情

4、各个地方利用了哈希校验,无论安装还是卸载包都十分安全,且会自动公开安全漏洞。

5、通过加载.env文件简化开拓事情流程。

6、Bug 很多,确实比较年轻,安装的流程有些让人困惑,不像 pip 这么直接好理解

参考引用:

https://blog.csdn.net/swinfans/article/details/89305301

https://pipenv.pypa.io/en/latest/

标签:

相关文章

介绍白点控制之路,从原理到方法

白点,作为生活中常见的现象,无处不在。对于如何控制白点,许多人却感到困惑。本文将从原理出发,探讨白点的控制方法,并结合实际案例,为...

PHP教程 2025-01-03 阅读1 评论0

介绍直播王者,如何开启你的电竞直播之旅

随着电竞产业的蓬勃发展,越来越多的年轻人投身于电竞直播行业。王者荣耀作为一款备受欢迎的MOBA手游,吸引了大量玩家和观众。如何开启...

PHP教程 2025-01-03 阅读1 评论0