zoukankan      html  css  js  c++  java
  • pipenv管理python开发环境

    简介

    简单说,pipenv就是把pipvirtualenv包装起来的一个便携工具。

    它不会在你的项目文件夹里生成一大堆东西,只有两个文本文件:

    • Pipfile, 简明地显示项目环境和依赖包。
    • Pipfile.lock, 详细记录环境依赖,并且利用了hash算法保证了它完整对应关系。只在你使用pipenv lock命令后才出现。

    安装

    本机环境

    我这里已经安装了Python3.7,Python2.7两个版本,其中Python3.7为默认版本,已将其路径添加到了PATH环境变量中。Python2.7 没有添加任何的环境变量。

    D:Program FilesPythonPython37
    D:Program FilesPythonPython37Scripts
    

    普通安装

    pipenv 可使用 pip 直接安装。

    pip install pipenv
    

    pip默认安装包路径:

    D:Program FilesPythonPython37Libsite-packages
    

    用户模式安装

    为防止和系统python库产生影响,可使用此种方案安装。

    pip install --user pipenv
    

    如果使用用户模式安装,安装包路径:

    C:UsersqhongAppDataRoamingPythonPython37site-packages
    

    如果不知道用户模式安装后路径的,可以执行命令:

    $ python -m site --user-site
    C:UsersqhongAppDataRoamingPythonPython37site-packages
    

    使用用户模式安装以后,如果pipenv不可用,需要把路径添加到环境变量PATH中

    pipenv 使用

    初始化虚拟环境

    执行pipenv install,创建虚拟环境,如下:

    D:Gitvscode
    $ pipenv install
    Creating a virtualenv for this project…
    Pipfile: D:GitvscodePipfile
    Using d:program filespythonpython37python.exe (3.7.3) to create virtualenv…
    [    ] Creating virtual environment...Already using interpreter d:program filespythonpython37python.exe Using base prefix 'd:\program files\python\python37'
    New python executable in C:Usersqhong.virtualenvsvscode-R5kwUx1UScriptspython.exe
    Installing setuptools, pip, wheel...
    done.
    
    Successfully created virtual environment!
    Virtualenv location: C:Usersqhong.virtualenvsvscode-R5kwUx1U
    Creating a Pipfile for this project…
    Pipfile.lock not found, creating…
    Locking [dev-packages] dependencies…
    Locking [packages] dependencies…
    Updated Pipfile.lock (a65489)!
    Installing dependencies from Pipfile.lock (a65489)…
      ================================ 0/0 - 00:00:00
    To activate this project's virtualenv, run pipenv shell.
    Alternatively, run a command inside the virtualenv with pipenv run.
    

    从打印信息可见,它在目录用户目录C:Usersqhong.virtualenvs下创建了个和项目同名的虚拟环境(可通过配置环境变量来自定义虚拟环境目录,export WORKON_HOME=~/.venvs),python使用的是默认的python2.7 。
    可通过参数--two--three 来泛指python版本,也可通过--python 3.5 来明确知道python版本,但是这些参数的前提是你系统上有此python版本,否则会报如下错误:

    D:Gitpyy
    $ pipenv --python 3.5 install
    Warning: Python 3.5 was not found on your system…
    You can specify specific versions of Python with:
      $ pipenv --python path	opython
    

    正确的:

    D:Gitvscode
    $ pipenv --python 3.7 install
    Creating a virtualenv for this project…
    Pipfile: D:GitvscodePipfile
    Using D:/Program Files/Python/Python37/python.exe (3.7.3) to create virtualenv…
    [==  ] Creating virtual environment...Using base prefix 'D:\Program Files\Python\Python37'
    New python executable in D:Gitvscode.venvScriptspython.exe
    Installing setuptools, pip, wheel...
    done.
    Running virtualenv with interpreter D:/Program Files/Python/Python37/python.exe
    
    Successfully created virtual environment!
    Virtualenv location: D:Gitvscode.venv
    Creating a Pipfile for this project…
    Pipfile.lock not found, creating…
    Locking [dev-packages] dependencies…
    Locking [packages] dependencies…
    Updated Pipfile.lock (a65489)!
    Installing dependencies from Pipfile.lock (a65489)…
      ================================ 0/0 - 00:00:00
    To activate this project's virtualenv, run pipenv shell.
    Alternatively, run a command inside the virtualenv with pipenv run.
    

    初始化好虚拟环境后,会在项目目录下生成2个文件PipfilePipfile.lock。为pipenv包的配置文件,代替原来的 requirement.txt。项目提交时,可将Pipfile 文件和Pipfile.lock文件受控提交,待其他开发克隆下载,根据此Pipfile 运行命令pipenv install [--dev]生成自己的虚拟环境。

    Pipfile.lock 文件是通过hash算法将包的名称和版本,及依赖关系生成哈希值,可以保证包的完整性。

    使用Python2.7版本创建一下虚拟环境:

    D:Gitpy27
    $ pipenv --python 2.7 install
    Creating a virtualenv for this project…
    Pipfile: D:Gitpy27Pipfile
    Using D:/Program Files/Python/Python27/python.exe (2.7.16) to create virtualenv…
    [   =] Creating virtual environment...New python executable in D:Gitpy27.venvScriptspython.exe
    Installing setuptools, pip, wheel...
    done.
    Running virtualenv with interpreter D:/Program Files/Python/Python27/python.exe
    
    Successfully created virtual environment!
    Virtualenv location: D:Gitpy27.venv
    Creating a Pipfile for this project…
    Pipfile.lock not found, creating…
    Locking [dev-packages] dependencies…
    Locking [packages] dependencies…
    Updated Pipfile.lock (dfae9f)!
    Installing dependencies from Pipfile.lock (dfae9f)…
      ================================ 0/0 - 00:00:00
    To activate this project's virtualenv, run pipenv shell.
    Alternatively, run a command inside the virtualenv with pipenv run.
    

    查看Pipfile

    D:Gitpy27
    $ pipenv shell
    Launching subshell in virtual environment…
    
    D:Gitpy27
    (.venv) $ cat Pipfile
    [[source]]
    name = "pypi"
    url = "https://pypi.org/simple"
    verify_ssl = true
    
    [dev-packages]
    
    [packages]
    
    [requires]
    python_version = "2.7"
    
    D:Gitpy27
    (.venv) $ pip list
    DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
    Package    Version
    ---------- -------
    pip        19.1.1
    setuptools 41.0.1
    wheel      0.33.4
    
    D:Gitpy27
    (.venv) $ pip -V
    pip 19.1.1 from d:gitpy27.venvlibsite-packagespip (python 2.7)
    

    项目虚拟环境同步

    只需要安装Pipenv,然后:

    pipenv install
    

    Pipenv会在项目文件夹下自动寻找Pipfile和Pipfile.lock文件,创建一个新的虚拟环境并安装必要的软件包。

    也就是说pipenv install的时候有三种逻辑:

    • 如果目录下没有Pipfile和Pipfile.lock文件,表示创建一个新的虚拟环境;
    • 如果有,表示使用已有的Pipfile和Pipfile.lock文件中的配置创建一个虚拟环境;
    • 如果后面带诸如django这一类库名,表示为当前虚拟环境安装第三方库。

    进入退出虚拟环境

    使用pipenv shell命令以后就会进入到虚拟环境

    D:Gitpy27
    $ pip -V
    pip 19.1.1 from d:program filespythonpython37libsite-packagespip (python 3.7)
    
    D:Gitpy27
    $ py -V
    Python 3.7.3
    
    D:Gitpy27
    $ pipenv shell
    Launching subshell in virtual environment…
    
    D:Gitpy27
    (.venv) $ pip -V
    pip 19.1.1 from d:gitpy27.venvlibsite-packagespip (python 2.7)
    
    D:Gitpy27
    (.venv) $ py -V
    Python 2.7.16
    

    退出pipenv shell

    exit //或者 ctrl+d
    

    运行虚拟环境(无需进入特定shell即可按照该环境运行脚本):

    D:Gitpy27
    $ pipenv run pip -V
    pip 19.1.1 from d:gitpy27.venvlibsite-packagespip (python 2.7)
    
    D:Gitpy27
    $ pip -V
    pip 19.1.1 from d:program filespythonpython37libsite-packagespip (python 3.7)
    
    D:Gitpy27
    $ py -V
    Python 3.7.3
    
    D:Gitpy27
    $ pipenv run py -V
    Python 2.7.16
    

    修改虚拟环境位置

    默认地,虚拟环境会创建在~/.local/share/virtualenvs目录里面。
    如果我们希望在每个项目的根目录下保存虚拟环境目录(.venv),需要在 .bashrc 或 .bash_profile 中配置如下

    PIPENV_VENV_IN_PROJECT=1
    

    或者

    WORKON_HOME=~/.venvs
    

    重新创建一个项目,初始化虚拟环境

    D:Gitvscode
    $ pipenv --where
    D:Gitvscode
    
    D:Gitvscode
    $ pipenv --venv
    D:Gitvscode.venv
    

    发现虚拟环境位置改变

    安装python模块

    $ pipenv install <包名>
    

    你需要知道的是,进入pipenv虚拟环境后,你还是可以用pip install来安装包的,也能正常使用,因为virtualenv就是这样做的。
    但是,这样你就不算使用了pipenv策略了,如果你要在项目文件夹里的Pipfile记录所有项目需要的依赖环境,就应该放弃使用pip install而使用pipenv install,这样你的Pipfile就会精确记录所有需要的依赖。

    重新安装所有packages:
    有时候需要冲github上clone项目,下载好后,只需要一句话就可以完成创建环境:

    # 根据Pipfile中的描述安装所有依赖
    $ pipenv install
    
    # 或者,根据Pipfile.lock中的描述安装所有依赖
    $ pipenv install --ignore-pipfile
    
    # 或者,只安装dev组的依赖
    $ pipenv install --dev
    
    # 或者,根据曾经在pip上导出requirements.txt安装依赖
    $ pipenv install -r <path-to-requirements.txt>
    

    安装 requests 模块:

    (vscode-R5kwUx1U) $ pipenv install requests
    Installing requests…
    Adding requests to Pipfile's [packages]…
    Installation Succeeded
    Pipfile.lock (444a6d) out of date, updating to (a65489)…
    Locking [dev-packages] dependencies…
    Locking [packages] dependencies…
    Success!
    Updated Pipfile.lock (444a6d)!
    Installing dependencies from Pipfile.lock (444a6d)…
      ================================ 5/5 - 00:00:02
    

    更新python模块

    从项目中更新某个包

    pipenv update requests
    

    或更新所有的包

    pipenv update
    

    删除python模块,删除环境

    # 删除某个包
    pipenv uninstall <包名>
    
    # 删除整个环境
    $ pipenv --rm
    

    锁定版本

    更新 lock 文件锁定当前环境的依赖版本

    pipenv lock
    

    按照树形结构显示当前环境的依赖关系:

    $ pipenv graph
    

    然后就会显示出如下效果:

    (vscode-R5kwUx1U) $ pipenv graph
    requests==2.22.0
      - certifi [required: >=2017.4.17, installed: 2019.3.9]
      - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
      - idna [required: >=2.5,<2.9, installed: 2.8]
      - urllib3 [required: >=1.21.1,<1.26,!=1.25.1,!=1.25.0, installed: 1.25.3]
    

    更换pipenv源

    修改Pipfile

    Pipenv本身就是基于Pip,所以也可以更换PyPI源。只需要在Pipfile中更换对应的url即可。比如,下面的Pipfile使用阿里云提供的镜像源:

    [[source]]
    
    url = "http://mirrors.aliyun.com/pypi/simple"
    verify_ssl = true
    name = "pypi"
    

    上方这种设置为http的,会出现信任问题,可以使用 :

    url = "http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com"
    

    或者直接使用https

    url = https://pypi.tuna.tsinghua.edu.cn/simple
    

    执行命令--pypi-mirror指定

    在执行安装命令时通过--pypi-mirror选项指定PyPI源,比如:

    $ pipenv install --pypi-mirror <mirror_url>
    
    $ pipenv update --pypi-mirror <mirror_url>
    
    $ pipenv sync --pypi-mirror <mirror_url>
    
    $ pipenv lock --pypi-mirror <mirror_url>
    
    $ pipenv uninstall --pypi-mirror <mirror_url>
    

    例如:

    $ pipenv install --pypi-mirror https://pypi.tuna.tsinghua.edu.cn/simple django
    Installing django…
    Adding django to Pipfile's [packages]…
    Installation Succeeded
    Pipfile.lock (748999) out of date, updating to (444a6d)…
    Locking [dev-packages] dependencies…
    Locking [packages] dependencies…
    Success!
    Updated Pipfile.lock (748999)!
    Installing dependencies from Pipfile.lock (748999)…
      ================================ 8/8 - 00:00:02
    

    环境变量PIPENV_PYPI_MIRROR

    设置环境变量PIPENV_PYPI_MIRROR效果相同。

    PIPENV_PYPI_MIRROR = https://pypi.tuna.tsinghua.edu.cn/simple
    

    在VsCode中使用

    在项目中的settings.json配置文件夹修改配置:

    "python.pythonPath": "${workspaceRoot}\.venv\Scripts\python.exe",
    "python.venvPath":"${workspaceRoot}\.venv",
    

    常见错误

    pipenv lock 时遇到的SSL Error

    错误反馈如下:

    Pipfile.lock not found, creating…
    Locking [dev-packages] dependencies…
    Locking [packages] dependencies…
    usr/local/Cellar/pipenv/2018.5.18/libexec/lib/python3.6/site-packages/pipenv/vendor/requests/sessions.py", line 508, in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/local/Cellar/pipenv/2018.5.18/libexec/lib/python3.6/site-packages/pipenv/vendor/requests/sessions.py", line 618, in send
        r = adapter.send(request, **kwargs)
      File "/usr/local/Cellar/pipenv/2018.5.18/libexec/lib/python3.6/site-packages/pipenv/vendor/requests/adapters.py", line 506, in send
        raise SSLError(e, request=request)
    requests.exceptions.SSLError: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /pypi/pyobjc-framework-netfs/json (Caused by SSLError(SSLError(1, u'[SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590)'),))
    

    参考pipenv的issue解答。

    最佳解决方案是:

    $ pip install pyopenssl
    

    因为这种SSL Error在其他地方也常见,一般都是没有在环境里安装pyopenssl的问题。所以不管你在哪个环境,如果出现这个SSL问题,就先装pyopenssl解决。
    注意:不要用pipenv install pyopenssl,因为你真的不想在每个环境里都重新装一遍这个,干脆把它撞到本机:$ pip install pyopenssl.

    常见错误操作

    不要在pipenv shell里面运行pipenv install

    不要在pipenv shell里面运行deactivate

    参考

    pipenv 更优雅的管理你的python开发环境

    快速入门Python 最新最流行的pipenv虚拟环境

    Pipenv:人类的Python Dev工作流程

    利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境

    Pipenv – 超好用的 Python 包管理工具

    Pipenv 的使用

  • 相关阅读:
    GKCTF2020
    PTA的Python练习题(二十三)
    Web刷题之旅(三)
    Web刷题之旅(二)
    Web刷题之旅(一)-攻防世界 站
    PTA的Python练习题(补)
    Ctfshow
    Ctfshow
    15、实操篇——Vi和Vim编译器
    13、14、实操篇——远程登录到Linux服务器和远程上传下载文件
  • 原文地址:https://www.cnblogs.com/hongdada/p/11014908.html
Copyright © 2011-2022 走看看