应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Python虚拟环境

  前言
  通常,在不同的项目中,会用到不同的Python版本如果有必要的话,也包括一些库的版本,并非总是最新的就是最适合的或者最好的。对此,解决之道就是创建虚拟环境。
  一个项目创建一个虚拟环境,在每个虚拟环境之中,就相当于一个裸机,里面所需要的东西任你根据当前的需要自由配置,并且不会影响到其他项目。特别是在诸如Linux系统上,有时候安装某些东西还需要root权限,此时虚拟环境的好处就更明显了。创建虚拟环境
  不论是Python2,还是Python3中,都可以创建虚拟环境虽然现在广泛使用Python3,但也有项目在Python2上跑着呢。只是两个版本中创建方法稍有区别。在Python3中创建虚拟环境
  下面的方法是Python3中推荐的方法,务必掌握。python3mvenvpython3venv
  命令行上的m参数是告诉解释器运行venv模块,此模块是Python3核心发行版的一部分。python3venv是虚拟环境的目录名称。执行之后就会创建python3venv,虚拟环境就在这个目录中。
  如果对venv好奇,可以用下面的方式来瞧一瞧。python3Python3。6。4(v3。6。4:d48ecebad5,Dec182017,21:07:28)〔GCC4。2。1(AppleInc。build5666)(dot3)〕ondarwinTypehelp,copyright,creditsorlicenseformoreinformation。importvenvprint(venv)modulevenvfromLibraryFrameworksPython。frameworkVersions3。6libpython3。6venvinit。py
  venv模块的代码在LibraryFrameworksPython。frameworkVersions3。6libpython3。6venvinit。py,查看此文件(执行catLibraryFrameworksPython。frameworkVersions3。8libpython3。8venvinit。py即可看到),并到最底部,会看到如下内容:ifnamemain:rc1try:main()rc0exceptExceptionase:print(Error:se,filesys。stderr)sys。exit(rc)
  如果要查看命令行的参数,可以:python3mvenvusage:venv〔h〕〔systemsitepackages〕〔symlinkscopies〕〔clear〕〔upgrade〕〔withoutpip〕〔promptPROMPT〕ENVDIR〔ENVDIR。。。〕venv:error:thefollowingargumentsarerequired:ENVDIR在Python3。6及更低版本中创建虚拟环境
  现在不推荐这种方法,但是,也介绍一下。因为这个方法主要用于Python3。6及以下版本中。
  Python3。6及以下版本有一个名为pyvenv的可执行文件,它本质上是venv模块的二进制包装器。如果按按照下面的方法操作,就可以看到命令行的参数。pyvenvWARNING:thepyenvscriptisdeprecatedinfavourofpython3。6mvenvusage:venv〔h〕〔systemsitepackages〕〔symlinkscopies〕〔clear〕〔upgrade〕〔withoutpip〕〔promptPROMPT〕ENVDIR〔ENVDIR。。。〕venv:error:thefollowingargumentsarerequired:ENVDIR
  使用它创建虚拟目录的方法是:pyvenvpython3venvWARNING:thepyenvscriptisdeprecatedinfavourofpython3。6mvenv
  但是,会告诉我们,这个东西弃用了,后面要使用前面推荐的方法。在Python2。x中创建虚拟环境
  在Python2。x上,用virtualenv模块创建虚拟环境。在不同的操作系统中,对virtualenv可能有不同的处理方式,比如有的默认就安装了这个模块,有的没有安装,这就需要你先安装上。
  检查一下它是不是在你的机器上了。whichvirtualenvLibraryFrameworksPython。frameworkVersions2。7binvirtualenv
  创建一个Python2。x的虚拟目录,其语法类似于前面的方法:virtualenvpython2venvNewpythonexecutableinUsersjamespython2venvbinpythonInstallingsetuptools,pip,wheel。。。done。检查虚拟环境
  已经创建了两个虚拟环境的目录,分别是:lspython3venvpython2venvpython2venv:binincludelibpython3venv:binincludelibpyvenv。cfg
  这两个目录的却别在于,python3venv中能够看到pyvenv。cfg文件,如果你有兴趣了解有关此文件的更多信息,可以在PEP0405查看相关的背景知识。激活虚拟环境
  要使用虚拟环境,必须先激活。
  注意,虚拟环境激活前后,shell的提示符会发生变化。原来是这样的:echoPATHLibraryFrameworksPython。frameworkVersions3。6bin:LibraryFrameworksPython。frameworkVersions2。7bin:usrlocalbin:usrbin:bin:usrsbin:sbin
  激活虚拟环境之后(执行sourcepython3venvbinactivate指令后)显示(python3venv)。sourcepython3venvbinactivate(python3venv)
  检查路径后,虚拟环境将优先于前面做同样操作是呈现的路径。(python3venv)echoPATHUsersjamespython3venvbin:LibraryFrameworksPython。frameworkVersions3。6bin:LibraryFrameworksPython。frameworkVersions2。7bin:usrlocalbin:usrbin:bin:usrsbin:sbin执行python
  如果我们现在执行python或pip,由于路径优先(前面的操作已经显示,python3。6优先执行了虚拟环境中),来自虚拟环境命令将优先执行。如果用下面的方式查看,会发现它们都在相应的虚拟环境中。(python3venv)whichpythonUsersjamespython3venvbinpython(python3venv)whichpipUsersjamespython3venvbinpip
  比如执行python,本来本地机器上安装两个版本的Python,如果不用虚拟环境,python之后默认会执行Python2,要执行Python3,必须是python3。但是,现在不同了,因为激活了Python3。6的虚拟环境,当执行python命令后,会首先在指定的虚拟环境中搜索。并且,进入到Python3之后,查看sys。path,当前虚拟环境目录也被添加到Python搜索路径中了。(python3venv)pythonPython3。6。4(v3。6。4:d48ecebad5,Dec182017,21:07:28)〔GCC4。2。1(AppleInc。build5666)(dot3)〕ondarwinTypehelp,copyright,creditsorlicenseformoreinformation。importsysprint(sys。path)〔,LibraryFrameworksPython。frameworkVersions3。6libpython36。zip,LibraryFrameworksPython。frameworkVersions3。6libpython3。6,LibraryFrameworksPython。frameworkVersions3。6libpython3。6libdynload,Usersjamespython3venvlibpython3。6sitepackages〕用pip安装软件包
  激活虚拟环境后,使用pip会将模块或者第三方包直接安装到虚拟环境。例如,如果我们安装了名为arrow的模块专门解读日期、时间的模块,比传统的datatime模块使用更方便。(python3venv)pipinstallarrowCollectingarrowDownloadinghttps:files。pythonhosted。orgpackagesf47f0360628ba40bb93c10cd89cd289b6a8e9ea87b2db884b8edf32c80ee1c73arrow0。13。1py2。py3noneany。whlCollectingpythondateutil(fromarrow)Downloadinghttps:files。pythonhosted。orgpackages4117c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbbpythondateutil2。8。0py2。py3noneany。whl(226kB)100235kB3。6MBsCollectingsix1。5(frompythondateutilarrow)Downloadinghttps:files。pythonhosted。orgpackages73fb00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9six1。12。0py2。py3noneany。whlInstallingcollectedpackages:six,pythondateutil,arrowSuccessfullyinstalledarrow0。13。1pythondateutil2。8。0six1。12。0Youareusingpipversion9。0。1,howeverversion19。0。3isavailable。Youshouldconsiderupgradingviathepipinstallupgradepipcommand。
  上面的安装过程显示,在安装了arrow的过程中,还安装了six和pythondateutil两个依赖模块。我们可以再次确认arrow模块在虚拟环境中。(python3venv)pythonPython3。6。4(v3。6。4:d48ecebad5,Dec182017,21:07:28)〔GCC4。2。1(AppleInc。build5666)(dot3)〕ondarwinTypehelp,copyright,creditsorlicenseformoreinformation。importarrowprint(arrow)modulearrowfromUsersjamespython3venvlibpython3。6sitepackagesarrowinit。py升级pip
  在上面用pip安装的时候,最后有警公告,提示要升级pip,如果看到这个提示,就要必须升级,为什么?请阅读:
  必须升级pip,为什么?!
  可以按以下方式升级虚拟环境中的pip。(python3venv)pipinstallupgradepipCacheentrydeserializationfailed,entryignoredCollectingpipUsingcachedhttps:files。pythonhosted。orgpackagesd8f3413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceffpip19。0。3py2。py3noneany。whlInstallingcollectedpackages:pipFoundexistinginstallation:pip9。0。1Uninstallingpip9。0。1:Successfullyuninstalledpip9。0。1Successfullyinstalledpip19。0。3(python3venv)pipversionpip19。0。3fromUsersjamespython3venvlibpython3。6sitepackagespip(python3。6)集成环境需求
  为了让下面的示例更能说明问题,在安装flask一个用于web开发的框架。(python3venv)pipinstallflaskCollectingflaskDownloadinghttps:files。pythonhosted。orgpackages7fe708578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4bFlask1。0。2py2。py3noneany。whl(91kB)10092kB2。4MBsCollectingJinja22。10(fromflask)Downloadinghttps:files。pythonhosted。orgpackages7fffae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731Jinja22。10py2。py3noneany。whl(126kB)100133kB7。6MBsCollectingWerkzeug0。14(fromflask)Downloadinghttps:files。pythonhosted。orgpackages20c412e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243Werkzeug0。14。1py2。py3noneany。whl(322kB)100327kB13。0MBsCollectingitsdangerous0。24(fromflask)Downloadinghttps:files。pythonhosted。orgpackages76ae44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49eitsdangerous1。1。0py2。py3noneany。whlCollectingclick5。1(fromflask)Downloadinghttps:files。pythonhosted。orgpackagesfa3745185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ecClick7。0py2。py3noneany。whl(81kB)10081kB15。2MBsCollectingMarkupSafe0。23(fromJinja22。10flask)Downloadinghttps:files。pythonhosted。orgpackagesf000a6aea33f5598b080b86d6b6d1214b51afe3ffa6100b902d5aa465080083fMarkupSafe1。1。1cp36cp36mmacosx106intel。whlInstallingcollectedpackages:MarkupSafe,Jinja2,Werkzeug,itsdangerous,click,flaskSuccessfullyinstalledJinja22。10MarkupSafe1。1。1Werkzeug0。14。1click7。0flask1。0。2itsdangerous1。1。0
  安装flask的同时,也会安装相关的依赖模块。这样,在虚拟环境中就有了比较多的模块,而且每个模块(或者库)都有一定的版本。
  下面按照如下的指令执行,目的是要生成一个名为requirements。txt的文件,在这个文件中,将记录当前虚拟环境中所安装的模块及其版本(注意,requirements。txt文件目录,先下面代码这样指定,是为了后面使用方便。)。(python3venv)pipfreezeteetmprequirements。txtarrow0。13。1Click7。0Flask1。0。2itsdangerous1。1。0Jinja22。10MarkupSafe1。1。1pythondateutil2。8。0six1。12。0Werkzeug0。14。1
  有了这个文件,当我们需要重现这个虚拟环境中已经安装的各个模块是,就简单了。重现虚拟环境配置
  前面,曾经创建了一个Python2的虚拟环境,现在要将刚才在Python3的虚拟环境中安装的各个模块(即配置),移植到Python2的虚拟环境中注意,这种做法并不提倡,但是,这里纯粹是为演示虚拟环境的重现移植。
  首先,将现在的python3venv虚拟环境停用。(python3venv)deactivate
  然后激活Python2的虚拟环境python2venv。sourcepython2venvbinactivate(python2venv)
  升级pip,多数情况下,用pipinstallupgradepip即可,但是,如果遇到了意想不到的事情,可以用下面的方式尝试解决。(python2venv)curlhttps:bootstrap。pypa。iogetpip。pypythonTotalReceivedXferdAverageSpeedTimeTimeTimeCurrentDloadUploadTotalSpentLeftSpeed1001659k1001659k002375k0::::::2377kDEPRECATION:Python2。7willreachtheendofitslifeonJanuary1st,2020。PleaseupgradeyourPythonasPython2。7wontbemaintainedafterthatdate。AfutureversionofpipwilldropsupportforPython2。7。CollectingpipUsingcachedhttps:files。pythonhosted。orgpackagesd8f3413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceffpip19。0。3py2。py3noneany。whlInstallingcollectedpackages:pipFoundexistinginstallation:pip9。0。1Uninstallingpip9。0。1:Successfullyuninstalledpip9。0。1Successfullyinstalledpip19。0。3
  现在,要将python3venv中的配置,在当前虚拟环境中重现,方法如下:(python2venv)pipinstallrtmprequirements。txtDEPRECATION:Python2。7willreachtheendofitslifeonJanuary1st,2020。PleaseupgradeyourPythonasPython2。7wontbemaintainedafterthatdate。AfutureversionofpipwilldropsupportforPython2。7。Collectingarrow0。13。1(fromrtmprequirements。txt(line1))Usingcachedhttps:files。pythonhosted。orgpackagesf47f0360628ba40bb93c10cd89cd289b6a8e9ea87b2db884b8edf32c80ee1c73arrow0。13。1py2。py3noneany。whlCollectingClick7。0(fromrtmprequirements。txt(line2))Usingcachedhttps:files。pythonhosted。orgpackagesfa3745185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ecClick7。0py2。py3noneany。whlCollectingFlask1。0。2(fromrtmprequirements。txt(line3))Usingcachedhttps:files。pythonhosted。orgpackages7fe708578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4bFlask1。0。2py2。py3noneany。whlCollectingitsdangerous1。1。0(fromrtmprequirements。txt(line4))Usingcachedhttps:files。pythonhosted。orgpackages76ae44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49eitsdangerous1。1。0py2。py3noneany。whlCollectingJinja22。10(fromrtmprequirements。txt(line5))Usingcachedhttps:files。pythonhosted。orgpackages7fffae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731Jinja22。10py2。py3noneany。whlCollectingMarkupSafe1。1。1(fromrtmprequirements。txt(line6))Downloadinghttps:files。pythonhosted。orgpackages6dd20ccd2c0e2cd93b35e765d9b3205cd6602e6b202b522fc7997531353715b3MarkupSafe1。1。1cp27cp27mmacosx106intel。whlCollectingpythondateutil2。8。0(fromrtmprequirements。txt(line7))Usingcachedhttps:files。pythonhosted。orgpackages4117c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbbpythondateutil2。8。0py2。py3noneany。whlCollectingsix1。12。0(fromrtmprequirements。txt(line8))Usingcachedhttps:files。pythonhosted。orgpackages73fb00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9six1。12。0py2。py3noneany。whlCollectingWerkzeug0。14。1(fromrtmprequirements。txt(line9))Usingcachedhttps:files。pythonhosted。orgpackages20c412e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243Werkzeug0。14。1py2。py3noneany。whlCollectingbackports。functoolslrucache1。2。1;pythonversion2。7(fromarrow0。13。1rtmprequirements。txt(line1))Downloadinghttps:files。pythonhosted。orgpackages038e2424c0e65c4a066e28f539364deee49b6451f8fcd4f718fefa50cc3dcf48backports。functoolslrucache1。5py2。py3noneany。whlInstallingcollectedpackages:six,pythondateutil,backports。functoolslrucache,arrow,Click,MarkupSafe,Jinja2,itsdangerous,Werkzeug,FlaskSuccessfullyinstalledClick7。0Flask1。0。2Jinja22。10MarkupSafe1。1。1Werkzeug0。14。1arrow0。13。1backports。functoolslrucache1。5itsdangerous1。1。0pythondateutil2。8。0six1。12。0
  虽然现在是一个Python2的虚拟环境,但是也按照requirement。txt文件中的记录,配置了与Python3虚拟环境相同的各个模块,并且还根据Python2的特定要求,增加了应有的依赖backports。functoolslrucache1。5。于是当前虚拟环境中的配置如下:(python2venv)pipfreezeDEPRECATION:Python2。7willreachtheendofitslifeonJanuary1st,2020。PleaseupgradeyourPythonasPython2。7wontbemaintainedafterthatdate。AfutureversionofpipwilldropsupportforPython2。7。arrow0。13。1backports。functoolslrucache1。5Click7。0Flask1。0。2itsdangerous1。1。0Jinja22。10MarkupSafe1。1。1pythondateutil2。8。0six1。12。0Werkzeug0。14。1不激活的情况下,使用虚拟环境
  一般情况下,按照上面所说的,激活虚拟环境,然后开始使用,这已经很方便了。但是,在某些情况下,或许有不激活虚拟环境的需求。
  为此,可以这么做。比如要执行虚拟环境python3venv中的Python3,可以在没有激活任何虚拟环境的情况下,直接执行python3venvbinpython运行python3venv中的Python。
  在下面的操作中,首先要从python2venv的虚拟环境中退出。(python2venv)deactivatepython3venvbinpythonPython3。6。4(v3。6。4:d48ecebad5,Dec182017,21:07:28)〔GCC4。2。1(AppleInc。build5666)(dot3)〕ondarwinTypehelp,copyright,creditsorlicenseformoreinformation。importarrowprint(arrow)modulearrowfromUsersjamespython3venvlibpython3。6sitepackagesarrowinit。pyDpython2venvbinpythonPython2。7。14(v2。7。14:84471935ed,Sep162017,12:01:12)〔GCC4。2。1(AppleInc。build5666)(dot3)〕ondarwinTypehelp,copyright,creditsorlicenseformoreinformation。importarrowprint(arrow)modulearrowfromUsersjamespython2venvlibpython2。7sitepackagesarrowinit。pycD
  在程序文件中,也可以指定所使用的虚拟环境,方法就是用!发起指令,如下面的代码所示:catEOFtest。py!Usersjamespython3venvbinpythonimportarrowutcarrow。utcnow()print(utc)EOF
  设置示例文件test。py可执行,然后执行,可以确认执行了虚拟环境中的模块。chmoduxtest。py。test。py20190303T21:17:22。63213000:00
  如此,即可根据特定需求执行程序了。打包
  如果在本地完成了开发,要将程序移植到别的机器上,通常要在目标机器上配置与本地一样的环境。当然,现在有一种容器化的方案,比如使用docker等。如果不那样做,按照上面的方法完成了虚拟环境的配置,并且在虚拟环境中完成了程序编写。那么,就可以将真个虚拟环境打包。当然,这里有一个前提,目标机器上必须安装了与虚拟环境中相同版本的Python。
  以前面使用过的python3venv为例,用tar命令将目录python3venv打包。tarcfpython3venv。tarpython3venv
  为了演示需要,将当前的python3venv目录删除。rmrfpython3venv
  然后从python3venv。tar中将目录提取出来。tarxfpython3venv。tar
  继续使用test。py测试一下,python3venv虚拟目录及其内部安装的各模块,都已经恢复。。test。py20190303T21:26:47。08209200:00用pip管理虚拟环境
  pip是一个好工具,它为管理和维护虚拟环境及其依赖提供简便方法。比如,对于虚拟环境python3venv中的模块,如果要删除arrow和flask,如下操作所示,使用pipuninstallpackagename即可,不过,安装时候所安装的那些依赖项会依然保留。(python3venv)pipuninstallarrowflaskUninstallingarrow0。13。1:Wouldremove:Usersjamespython3venvlibpython3。6sitepackagesarrow0。13。1。distinfoUsersjamespython3venvlibpython3。6sitepackagesarrowProceed(yn)?ySuccessfullyuninstalledarrow0。13。1UninstallingFlask1。0。2:Wouldremove:Usersjamespython3venvbinflaskUsersjamespython3venvlibpython3。6sitepackagesFlask1。0。2。distinfoUsersjamespython3venvlibpython3。6sitepackagesflaskProceed(yn)?ySuccessfullyuninstalledFlask1。0。2(python3venv)pipfreezeClick7。0itsdangerous1。1。0Jinja22。10MarkupSafe1。1。1pythondateutil2。8。0six1。12。0Werkzeug0。14。1
  除了上面简单的方法之外,还可以通过piptools中的工具,实现对模块更灵活的管理。
  首先,要退出当前的虚拟环境,并删除python3venv目录。然后,重新创建虚拟环境从这就可以看出虚拟环境的优势,你可以任意删除和重建,每次重建之后它都是干干净净的。
  进入到新建的虚拟环境之后,升级pip这是常规套路。再安装piptools。(python3venv)deactivatermrfpython3venvpython3mvenvpython3venvsourcepython3venvbinactivate(python3venv)pipinstallupgradepipCacheentrydeserializationfailed,entryignoredCollectingpipUsingcachedhttps:files。pythonhosted。orgpackagesd8f3413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceffpip19。0。3py2。py3noneany。whlInstallingcollectedpackages:pipFoundexistinginstallation:pip9。0。1Uninstallingpip9。0。1:Successfullyuninstalledpip9。0。1Successfullyinstalledpip19。0。3(python3venv)pipinstallpiptoolsCollectingpiptoolsDownloadinghttps:files。pythonhosted。orgpackages587af93b24807b7ac2d9d0bd6b8a886bcbe67eb39c1b1184b985dd5e0e2eca92piptools3。4。0py2。py3noneany。whl(43kB)10051kB2。3MBsCollectingsix(frompiptools)Usingcachedhttps:files。pythonhosted。orgpackages73fb00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9six1。12。0py2。py3noneany。whlCollectingclick6(frompiptools)Usingcachedhttps:files。pythonhosted。orgpackagesfa3745185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ecClick7。0py2。py3noneany。whlInstallingcollectedpackages:six,click,piptoolsSuccessfullyinstalledclick7。0piptools3。4。0six1。12。0
  创建一个名为requirements。in的文件,在其中写上需要的模块及其版版本,比如arrow和flask,版本如下:(python3venv)catEOFrequirements。inarrow0。13。1Flask1。0。2EOF
  然后,使用pipcompile(是piptools中提供的),依据requirements。in创建requirements。txt文件(python3venv)pipcompilegeneratehashesoutputfilerequirements。txtrequirements。inThisfileisautogeneratedbypipcompileToupdate,run:pipcompilegeneratehashesoutputfilerequirements。txtrequirements。inarrow0。13。1hashsha256:3397e5448952e18e1295bf047014659effa5ae8da6a5371d37ff0ddc46fa6872hashsha256:6f54d9f016c0b7811fac9fb8c2c7fa7421d80c54dbdd75ffb12913c55db60b8aclick7。0hashsha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13hashsha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7viaflaskflask1。0。2hashsha256:2271c0070dbcb5275fad4a82e29f23ab92682dc45f9dfbc22c02ba9b9322ce48hashsha256:a080b744b7e345ccfcbc77954861cb05b3c63786e93f2b3875e0913d44b43f05itsdangerous1。1。0hashsha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19hashsha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749viaflaskjinja22。10hashsha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bdhashsha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4viaflaskmarkupsafe1。1。1hashsha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473hashsha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161hashsha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235hashsha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5hashsha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971affhashsha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116bhashsha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1hashsha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669ehashsha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183hashsha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66hashsha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1hashsha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1hashsha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221ehashsha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0bhashsha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905hashsha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735hashsha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7dhashsha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5ehashsha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0dhashsha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32chashsha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21hashsha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2hashsha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5hashsha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51bhashsha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6hashsha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704fhashsha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42fhashsha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7viajinja2pythondateutil2。8。0hashsha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fbhashsha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9eviaarrowsix1。12。0hashsha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761chashsha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73viapythondateutilwerkzeug0。14。1hashsha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557chashsha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49bviaflask
  从上述信息中可以看到,每个依赖都有相应的哈希值,这样能够保证所安装的模块彼此之间没有冲突。
  有了requirements。txt文件之后,就可以使用pipsync(也是piptools中的一个工具)将虚拟环境中的配置与之同步。(python3venv)pipsyncCollectingarrow0。13。1(fromrvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line1))Usingcachedhttps:files。pythonhosted。orgpackagesf47f0360628ba40bb93c10cd89cd289b6a8e9ea87b2db884b8edf32c80ee1c73arrow0。13。1py2。py3noneany。whlCollectingflask1。0。2(fromrvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line4))Usingcachedhttps:files。pythonhosted。orgpackages7fe708578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4bFlask1。0。2py2。py3noneany。whlCollectingitsdangerous1。1。0(fromrvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line7))Usingcachedhttps:files。pythonhosted。orgpackages76ae44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49eitsdangerous1。1。0py2。py3noneany。whlCollectingjinja22。10(fromrvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line10))Usingcachedhttps:files。pythonhosted。orgpackages7fffae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731Jinja22。10py2。py3noneany。whlCollectingmarkupsafe1。1。1(fromrvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line13))Usingcachedhttps:files。pythonhosted。orgpackagesf000a6aea33f5598b080b86d6b6d1214b51afe3ffa6100b902d5aa465080083fMarkupSafe1。1。1cp36cp36mmacosx106intel。whlCollectingpythondateutil2。8。0(fromrvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line42))Usingcachedhttps:files。pythonhosted。orgpackages4117c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbbpythondateutil2。8。0py2。py3noneany。whlCollectingwerkzeug0。14。1(fromrvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line45))Usingcachedhttps:files。pythonhosted。orgpackages20c412e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243Werkzeug0。14。1py2。py3noneany。whlRequirementalreadysatisfied:click5。1in。python3venvlibpython3。6sitepackages(fromflask1。0。2rvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line4))(7。0)Requirementalreadysatisfied:six1。5in。python3venvlibpython3。6sitepackages(frompythondateutil2。8。0rvarfoldersxkp46swdnn3b56rbd01qwdjhdh0000gnTtmpfwkk4j83(line42))(1。12。0)Installingcollectedpackages:pythondateutil,arrow,werkzeug,itsdangerous,markupsafe,jinja2,flaskSuccessfullyinstalledarrow0。13。1flask1。0。2itsdangerous1。1。0jinja22。10markupsafe1。1。1pythondateutil2。8。0werkzeug0。14。1(python3venv)pipfreezearrow0。13。1Click7。0Flask1。0。2itsdangerous1。1。0Jinja22。10MarkupSafe1。1。1piptools3。4。0pythondateutil2。8。0six1。12。0Werkzeug0。14。1
  如果删除一个模块,例如删除Flask,只需要更新requirements。in文件,如下所示。然后重复上面的过程,使用pipsync,就可以从当前虚拟环境中删除Flask,并且,在安装的时候,随着一同安装上的各种依赖模块,也同时被移除。(python3venv)catEOFrequirements。inarrow0。13。1EOF(python3venv)pipcompilegeneratehashesoutputfilerequirements。txtrequirements。inThisfileisautogeneratedbypipcompileToupdate,run:pipcompilegeneratehashesoutputfilerequirements。txtrequirements。inarrow0。13。1hashsha256:3397e5448952e18e1295bf047014659effa5ae8da6a5371d37ff0ddc46fa6872hashsha256:6f54d9f016c0b7811fac9fb8c2c7fa7421d80c54dbdd75ffb12913c55db60b8apythondateutil2。8。0hashsha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fbhashsha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9eviaarrowsix1。12。0hashsha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761chashsha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73viapythondateutil(python3venv)pipsyncUninstallingFlask1。0。2:SuccessfullyuninstalledFlask1。0。2Uninstallingitsdangerous1。1。0:Successfullyuninstalleditsdangerous1。1。0UninstallingJinja22。10:SuccessfullyuninstalledJinja22。10UninstallingMarkupSafe1。1。1:SuccessfullyuninstalledMarkupSafe1。1。1UninstallingWerkzeug0。14。1:SuccessfullyuninstalledWerkzeug0。14。1(python3venv)pipfreezearrow0。13。1Click7。0piptools3。4。0pythondateutil2。8。0six1。12。0指定PyPi库
  如果需要将虚拟环境与特定的PyPi库关联起来,即要求安装指定的PyP中的模块或者库,为此需要在虚拟环境的根目录下创建一个名为pip。conf的配置文件,在这个文件中声明安装依赖的属性。下面是一个pip。conf的例子,要根据需要修改hostname。spurin。com。〔global〕disablepipversioncheckTruetrustedhosthostname。spurin。comindexhttps:hostname。spurin。comrepositorypypiallpypiindexurlhttps:hostname。spurin。comrepositorypypiallsimple创建虚拟环境中模块的轮子
  在《必须升级pip,为什么?!》中曾经介绍了。whl文件的作用,虚拟环境中安装的模块,也可以编译为。whil文件,如果在另外一台机器上再安装同样模块,只需要用pip安装此文件即可,从而让虚拟环境的移植更简单了。
  具体操作流程如下所示。(python3venv)pipwheelwheeldirtmpwheeldirrrequirements。txtCollectingarrow0。13。1(fromrrequirements。txt(line7))Usingcachedhttps:files。pythonhosted。orgpackagesf47f0360628ba40bb93c10cd89cd289b6a8e9ea87b2db884b8edf32c80ee1c73arrow0。13。1py2。py3noneany。whlSavedprivatetmpwheeldirarrow0。13。1py2。py3noneany。whlCollectingpythondateutil2。8。0(fromrrequirements。txt(line10))Usingcachedhttps:files。pythonhosted。orgpackages4117c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbbpythondateutil2。8。0py2。py3noneany。whlSavedprivatetmpwheeldirpythondateutil2。8。0py2。py3noneany。whlCollectingsix1。12。0(fromrrequirements。txt(line14))Usingcachedhttps:files。pythonhosted。orgpackages73fb00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9six1。12。0py2。py3noneany。whlSavedprivatetmpwheeldirsix1。12。0py2。py3noneany。whl(python3venv)lstmpwheeldirarrow0。13。1py2。py3noneany。whlpythondateutil2。8。0py2。py3noneany。whlsix1。12。0py2。py3noneany。whl(python3venv)pipuninstallarrowpythondateutilsixUninstallingarrow0。13。1:Wouldremove:Usersjamespython3venvlibpython3。6sitepackagesarrow0。13。1。distinfoUsersjamespython3venvlibpython3。6sitepackagesarrowProceed(yn)?ySuccessfullyuninstalledarrow0。13。1Uninstallingpythondateutil2。8。0:Wouldremove:Usersjamespython3venvlibpython3。6sitepackagesdateutilUsersjamespython3venvlibpython3。6sitepackagespythondateutil2。8。0。distinfoProceed(yn)?ySuccessfullyuninstalledpythondateutil2。8。0Uninstallingsix1。12。0:Wouldremove:Usersjamespython3venvlibpython3。6sitepackagessix1。12。0。distinfoUsersjamespython3venvlibpython3。6sitepackagessix。pyProceed(yn)?ySuccessfullyuninstalledsix1。12。0(python3venv)pipinstallfindlinkstmpwheeldirrrequirements。txtLookinginlinks:tmpwheeldirCollectingarrow0。13。1(fromrrequirements。txt(line7))Collectingpythondateutil2。8。0(fromrrequirements。txt(line10))Collectingsix1。12。0(fromrrequirements。txt(line14))Installingcollectedpackages:six,pythondateutil,arrowSuccessfullyinstalledarrow0。13。1pythondateutil2。8。0six1。12。0结束语
  创建虚拟环境的目的,就是隔离特定模块的版本,从而满足不同项目的特定需要
  另外,除了上述创建虚拟环境的方法之外,现在也流行着一个名为pipenv的模块,有兴趣的可以试试,代码仓库地址:https:github。compypapipenv。当然,对它也是仁者见仁智者见智。

摩托罗拉首发?首款骁龙8Plus新机曝光支持125W快充3月23日,博主数码闲聊站爆料称,联想拯救者和摩托罗拉有两款搭载骁龙8Plus(代号SM8475)的新旗舰蓄势待发。前段时间,联想成功地抢在小米之前,率先发布了首款搭载高通骁龙……黄金万两,抵不过平安,健康昨天一架从昆明飞往广州的飞机在广西梧州坠毁。这起空难亊件不知牵动着多少人的心,让多少家庭遭受沉重的打击。人活着真不容易!每天为衣食住行奔波劳累,还要面对各种天灾人祸。……三月流焱不为别人,只为做一个连自己都羡慕的人人这一辈子,我只能说,有些事是出乎意料的,有些事是情理之中的,有些事是难以控制的,有些事是不尽人意的,有些事是不和逻辑的,有些事是恍然大悟的,但无论发生什么事,都别忘了自己的本……那个当年叱咤风云的情感导师,满口仁义道德的涂磊,现在还好吗?在《爱情保卫战》中,有一次涂磊失控站起来怒怼贪婪母亲。涂磊:你为什么不能独自带着他?我没有这个能力,单位上没有多少钱!涂磊:是,你没有这个能力所以你找到了老万……张艺谋女儿现身活动,180外籍老公帅气抢镜,西装配布鞋低调朴张艺谋大家不陌生了吧,还有不少的小伙伴看过他导的电视剧吧,更是凭借《悬崖之上》获第34届中国电影金鸡奖最佳导演奖。2022年,担任2022年北京冬奥会和冬残奥会开闭幕式总导演。……传奇世界抢宝PK泡MM的神器,非探知项链和瞬移戒指莫属特戒,顾名思义就是拥有特殊能力的戒指,它们以舍弃攻击属性为代价而换来特殊效果。特戒在传奇世界中,是一般的玩家可望而不可及的东西,有特戒的玩家可以在发出特殊效果的几秒内让敌人死得……山水耕读心欢喜,人间胜景总如春2021生机大会车,驶在去往当地有名的耕读小镇的路上,天就开始飘起了濛濛细雨。人还在停车场,就被远处雨中的风景所深深吸引住了。一排排错落有致、古色古香的院落,是那么……绝地求生PUBG将于2022年1月12日转为免费不买免费送!《绝地求生》将于2022年1月12日转为免费早买早享受,晚买享折扣,不买免费送再等一个月就可以参与诸神之战了,好耶!妈妈再也不用担心我的steam……剧情党福音暗黑破坏神不朽谁能率先集齐破碎的世界之石碎片作为一个剧情党,暴雪游戏的剧情真的没话可说,特别是最近刚在国服二测的暗黑手游,把暗黑世界空白的历史展现在了大家眼前。在暗黑剧情中世界之石的力量是天使与恶魔挑起永恒战斗的原……OPPOFindN2Flip评测轻薄小巧,也能演绎出端庄优雅尽管大屏的折叠机型已经逐渐成熟,大家都会默契地选择外屏内折的方案,但对于小折叠旗舰来说,外屏的选择往往对于厂商来说,相信依旧会是一个难题。那么OPPOFindN2在这样的难题上……末日血战希尔芙秩序阵营(技能加测评)英雄基本信息英雄名称:希尔芙英文名称:Silver英雄阵营:秩序英雄类型:支援初始星级:5最高等级:33016星英雄综合推荐深渊魔窟推荐:0遗迹魔窟推荐:0升……谈谈辽宁队最核心的三个人物的短板(大韩篇)如果说辽宁最核心的三个人是杨鸣、大韩、郭艾伦可能没有人反对吧?首先作为主教练的杨鸣毕竟是球队的指挥官,球队的球员筛选、训练、比赛等等都是由他制定的,可以说杨鸣是辽宁队的第……
你努力了,为何还焦虑我今年毕业了,在学校的时候就一直和身边的朋友说毕业之后的打算,说毕业后出去工作一年,然后继续考本科,幻想着出社会后的美好,可是出社会后的我很迷茫,和当初想的完全不一样,但是我想……科技论文MOF纳米片敏化的CdS量子点尺寸依赖的电子注入和产第一作者:徐文凯通讯作者:张贵荣、黄宏亮、梅东海通讯单位:天津工业大学论文DOI:10。1016j。apcatb。2022。121218成果简介近……英如镝我从小就知道自己不能失败和冰场上随时需要激烈对抗的状态不同,冰场下的英如镝更像个温和的大男孩。他喜欢聊起他的宠物们,一只捷克狼犬,两只猫。他最近有点胖了,采访之前,听说要拍摄,他发来消息,问能不能给我……初秋让心旅行宅家也不错过的美景封面天天见逛街出街封面新闻记者郭可欣从九月开始,大自然的画笔正逐渐显露出它的功力,满山的色彩日渐丰富起来,红叶、桂花的相继绽放,到月底就能欣赏了。那些与色彩相关的美景,怎能错过。点滴……广胜寺三绝的故事广胜寺三绝有人说一场旅行的原因,可能是因为书里的某句话,而我的旅行,可能是在一本书里看到了某位老朋友。托一本书的福,今天又来探望广胜寺了,那就给你们讲讲广胜寺……绝了!这5道下酒菜太受欢迎了,酒鬼喝酒都爱吃,你吃过几款?秋日生活打卡季绝了!这5道下酒菜太受欢迎了,酒鬼喝酒都爱吃,你吃过几款?酒是粮食精,越喝越年轻,白酒可谓是人们酒桌上必不可少的饮品。人逢喜事来一杯,精神更是倍儿爽。人情世……流星雨之王迎来极大,就在明天海报制作:冯娟一年一度的狮子座流星雨将于北京时间11月18日迎来极大。因为形成流星雨的方位在天球上的投影(即辐射点)恰好位于狮子座方向,在地球上看起来就好像是从狮子……早安没有最好的年龄,只有最好的心态头条创作挑战赛1hr没有最好的年龄,只有最好的心态。孩童时渴望快快长大。长大了,就没有写不完的作业,没有老师的严厉,爸妈的唠叨而真正长大了,才知道,作业只不过……研究表明,表扬能让孩子成绩提高在从小到大的学习生活中,大多数人应该都受过老师的表扬与谴责。根据美国科学家的最新研究发现,对学生多表扬、少谴责,会有很好的教育效果。2020年1月29日,美国杨百翰大学的……双十一正在发生3大变化不吵了,人少了,心变了文二瓜爸今年双十一,正在发生3大变化,不吵了,人少了,心变了。见微知著,时代的风真的变向了。一、不吵了,安静了。在我的记忆里,以前的双十一很热闹,各大电……孩子不听话时,下策是责骂,中策是讲道理,上策鲜有人用和孩子沟通,孩子的想法和感受,才是最不该被忽视的。父母若不懂这一点,再好的亲子关系也会渐渐失去亲密。作者土豆妈电影《小孩不笨》中有一段经典台词:大人经常以为和……让人爱不释手HiFiROSERS520AllOne一体机对于不想系统太复杂的朋友来说,集合功放与数字串流于一身的AllinOne一体机就是最好的选择,HiFiROSE于今年慕尼黑音响展上就发表了一台全新的RS520,内置250W的功……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网