簡單說,pipenv
就是把pip
和virtualenv
包裝起來的一個便攜工具。html
它不會在你的項目文件夾裏生成一大堆東西,只有兩個文本文件:python
Pipfile
, 簡明地顯示項目環境和依賴包。Pipfile.lock
, 詳細記錄環境依賴,而且利用了hash算法保證了它完整對應關係。只在你使用pipenv lock
命令後纔出現。我這裏已經安裝了Python3.7
,Python2.7
兩個版本,其中Python3.7
爲默認版本,已將其路徑添加到了PATH
環境變量中。Python2.7
沒有添加任何的環境變量。git
D:\Program Files\Python\Python37\ D:\Program Files\Python\Python37\Scripts\
pipenv
可以使用 pip 直接安裝。github
pip install pipenv
pip默認安裝包路徑:算法
D:\Program Files\Python\Python37\Lib\site-packages
爲防止和系統python庫產生影響,可以使用此種方案安裝。shell
pip install --user pipenv
若是使用用戶模式安裝,安裝包路徑:django
C:\Users\qhong\AppData\Roaming\Python\Python37\site-packages
若是不知道用戶模式安裝後路徑的,能夠執行命令:json
$ python -m site --user-site C:\Users\qhong\AppData\Roaming\Python\Python37\site-packages
使用用戶模式安裝之後,若是pipenv不可用,須要把路徑添加到環境變量PATH中segmentfault
執行pipenv install
,建立虛擬環境,以下:bash
D:\Git\vscode $ pipenv install Creating a virtualenv for this project… Pipfile: D:\Git\vscode\Pipfile Using d:\program files\python\python37\python.exe (3.7.3) to create virtualenv… [ ] Creating virtual environment...Already using interpreter d:\program files\python\python37\python.exe Using base prefix 'd:\\program files\\python\\python37' New python executable in C:\Users\qhong\.virtualenvs\vscode-R5kwUx1U\Scripts\python.exe Installing setuptools, pip, wheel... done. Successfully created virtual environment! Virtualenv location: C:\Users\qhong\.virtualenvs\vscode-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:\Users\qhong\.virtualenvs\
下建立了個和項目同名的虛擬環境(可經過配置環境變量來自定義虛擬環境目錄,export WORKON_HOME=~/.venvs
),python使用的是默認的python2.7 。
可經過參數--two
和--three
來泛指python版本,也可經過--python 3.5
來明確知道python版本,可是這些參數的前提是你係統上有此python版本,不然會報以下錯誤:
D:\Git\pyy $ 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\to\python
正確的:
D:\Git\vscode $ pipenv --python 3.7 install Creating a virtualenv for this project… Pipfile: D:\Git\vscode\Pipfile 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:\Git\vscode\.venv\Scripts\python.exe Installing setuptools, pip, wheel... done. Running virtualenv with interpreter D:/Program Files/Python/Python37/python.exe Successfully created virtual environment! Virtualenv location: D:\Git\vscode\.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個文件Pipfile
和Pipfile.lock
。爲pipenv包的配置文件,代替原來的 requirement.txt。項目提交時,可將Pipfile
文件和Pipfile.lock
文件受控提交,待其餘開發克隆下載,根據此Pipfile 運行命令pipenv install [--dev]
生成本身的虛擬環境。
Pipfile.lock
文件是經過hash算法將包的名稱和版本,及依賴關係生成哈希值,能夠保證包的完整性。
使用Python2.7版本建立一下虛擬環境:
D:\Git\py27 $ pipenv --python 2.7 install Creating a virtualenv for this project… Pipfile: D:\Git\py27\Pipfile Using D:/Program Files/Python/Python27/python.exe (2.7.16) to create virtualenv… [ =] Creating virtual environment...New python executable in D:\Git\py27\.venv\Scripts\python.exe Installing setuptools, pip, wheel... done. Running virtualenv with interpreter D:/Program Files/Python/Python27/python.exe Successfully created virtual environment! Virtualenv location: D:\Git\py27\.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:\Git\py27 $ pipenv shell Launching subshell in virtual environment… D:\Git\py27 (.venv) $ cat Pipfile [[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] [packages] [requires] python_version = "2.7" D:\Git\py27 (.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:\Git\py27 (.venv) $ pip -V pip 19.1.1 from d:\git\py27\.venv\lib\site-packages\pip (python 2.7)
只須要安裝Pipenv,而後:
pipenv install
Pipenv會在項目文件夾下自動尋找Pipfile和Pipfile.lock文件,建立一個新的虛擬環境並安裝必要的軟件包。
也就是說pipenv install的時候有三種邏輯:
使用pipenv shell
命令之後就會進入到虛擬環境
D:\Git\py27 $ pip -V pip 19.1.1 from d:\program files\python\python37\lib\site-packages\pip (python 3.7) D:\Git\py27 $ py -V Python 3.7.3 D:\Git\py27 $ pipenv shell Launching subshell in virtual environment… D:\Git\py27 (.venv) $ pip -V pip 19.1.1 from d:\git\py27\.venv\lib\site-packages\pip (python 2.7) D:\Git\py27 (.venv) $ py -V Python 2.7.16
退出pipenv shell
exit //或者 ctrl+d
D:\Git\py27 $ pipenv run pip -V pip 19.1.1 from d:\git\py27\.venv\lib\site-packages\pip (python 2.7) D:\Git\py27 $ pip -V pip 19.1.1 from d:\program files\python\python37\lib\site-packages\pip (python 3.7) D:\Git\py27 $ py -V Python 3.7.3 D:\Git\py27 $ pipenv run py -V Python 2.7.16
默認地,虛擬環境會建立在~/.local/share/virtualenvs目錄裏面。
若是咱們但願在每一個項目的根目錄下保存虛擬環境目錄(.venv),須要在 .bashrc 或 .bash_profile 中配置以下
PIPENV_VENV_IN_PROJECT=1
或者
WORKON_HOME=~/.venvs
從新建立一個項目,初始化虛擬環境
D:\Git\vscode $ pipenv --where D:\Git\vscode D:\Git\vscode $ pipenv --venv D:\Git\vscode\.venv
發現虛擬環境位置改變
$ 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
從項目中更新某個包
pipenv update requests
或更新全部的包
pipenv update
# 刪除某個包 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自己就是基於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源,好比:
$ 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 = https://pypi.tuna.tsinghua.edu.cn/simple
在項目中的settings.json配置文件夾修改配置:
"python.pythonPath": "${workspaceRoot}\\.venv\\Scripts\\python.exe", "python.venvPath":"${workspaceRoot}\\.venv",
錯誤反饋以下:
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)'),))
最佳解決方案是:
$ pip install pyopenssl
由於這種SSL Error在其餘地方也常見,通常都是沒有在環境裏安裝pyopenssl
的問題。因此無論你在哪一個環境,若是出現這個SSL問題,就先裝pyopenssl
解決。
注意:不要用pipenv install pyopenssl
,由於你真的不想在每一個環境裏都從新裝一遍這個,乾脆把它撞到本機:$ pip install pyopenssl
.
不要在pipenv shell
裏面運行pipenv install
不要在pipenv shell
裏面運行deactivate