Pipenvの進んだ使い方¶
このドキュメントではPipenvのより輝かしい進んだ機能を対象としています。
☤ 注意書き¶
Pipfile
にある依存パッケージのwheelは$ pipenv lock
では捕捉されません。- There are some known issues with using private indexes, related to hashing. We're actively working to solve this problem. You may have great luck with this, however.
- インストールはできる限り決定論的になるようになっています — 問題が出た場合には
--sequential
フラグを使ってより決定論的に振る舞うようにしてください。
☤ パッケージの一覧を指定する¶
特定のパッケージ一覧で特定のパッケージをインストールしたい場合は、次のように指定できます:
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[[source]]
url = "http://pypi.home.kennethreitz.org/simple"
verify_ssl = false
name = "home"
[dev-packages]
[packages]
requests = {version="*", index="home"}
maya = {version="*", index="pypi"}
records = "*"
めっちゃ高機能。
☤ PyPIミラーを使う¶
デフォルトのPyPIインデックスのURLをPyPIミラーのURLで上書きしたい場合は、次のオプションが使えます:
$ 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_PYPI_MIRROR
環境変数を設定することもできます。
☤ 環境変数でPipfileにクレデンシャルを差し込む¶
Pipenvは (定義されていれば) Pipfileにある環境変数を展開します。 この機能はプライベートのPyPIで認証する必要がある場合に非常に便利です:
[[source]]
url = "https://$USERNAME:${PASSWORD}@mypypi.example.com/simple"
verify_ssl = true
name = "pypi"
幸運なことに、Pipenvは環境変数を展開する 前に Pipfileのハッシュを取ります (そしてありがたいことに、ロックファイルからインストールするときは、再び環境変数が置き換えられます。そのため秘匿情報をコミットする必要は無いのです! やったー!)
If your credentials contain a special character, surround the references to the environment variables with quotation marks. For example, if your password contain a double quotation mark, surround the password variable with single quotation marks. Otherwise, you may get a ValueError, "No closing quotation"
error while installing dependencies.
[[source]]
url = "https://$USERNAME:'${PASSWORD}'@mypypi.example.com/simple"
☤ 基本的な事項の指定¶
ある特定のパッケージをあるシステムだけにインストールしたい場合は、 PEP 508 指示子 を使って実現できます。
これが、 Windowsシステムだけに pywinusb
をインストールする Pipfile
の例です:
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests = "*"
pywinusb = {version = "*", sys_platform = "== 'win32'"}
ほら、見て!
これがもっと複雑な例です:
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
[packages]
unittest2 = {version = ">=1.0,<3.0", markers="python_version < '2.7.9' or (python_version >= '3.0' and python_version < '3.4')"}
魔法です。純粋な、混じり気の無い魔法です。
☤ pipenvをデプロイで使う¶
デプロイ手順の一部として pipenv
を使いたい場合もあるでしょう。
--deploy
フラグを使うと強制的に Pipfile.lock
を最新にできます:
$ pipenv install --deploy
このフラグを立てると、 Pipfile.lock
が古くなっている場合に、Pipfile.lock
を新しく生成するのではなく、ビルドが失敗します。
そうでない場合は、sync
コマンドを使って Pipfile.lock
の指定どおりにパッケージがインストールされます:
$ pipenv sync
注釈
pipenv install --ignore-pipfile
is nearly equivalent to pipenv sync
, but pipenv sync
will never attempt to re-lock your dependencies as it is considered an atomic operation. pipenv install
by default does attempt to re-lock unless using the --deploy
flag.
システム環境への依存関係のデプロイ¶
--system
フラグを使って、Pipfileの内容にあるものを親システムにインストールするようPipenvに指示できます:
$ pipenv install --system
これはシステム環境のPythonの管理やデプロイのためのインフラで役に立ちます (例えば、Herokuで使われています)。
☤ PipenvとCPython以外のPythonディストリビューション¶
サードパーティーのPythonディストリビューション (例えば、Anaconda) でPipenvを使うには、Pythonバイナリへのパスを与えるだけでよいです:
$ pipenv install --python=/path/to/python
AnacondaはCondaでパッケージを管理しています。
CondaでインストールしたPythonのパッケージを再利用するには、 --site-packages
フラグを使ってください:
$ pipenv --python=/path/to/python --site-packages
☤ requirements.txt
の生成¶
Pipfile
や Pipfile.lock
は requirements.txt
に非常に簡単に変換でき、追加機能や素敵な機能など既に実装された機能全ての恩恵を受けられます。
この Pipfile
から:
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
[packages]
requests = {version="*"}
requirements.txt
を生成しましょう:
$ pipenv lock -r
chardet==3.0.4
requests==2.18.4
certifi==2017.7.27.1
idna==2.6
urllib3==1.22
開発用の依存関係だけの requirements.txt
を生成したいと思った場合は、それも可能です!
次の Pipfile
を用意しましょう:
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
[dev-packages]
pytest = {version="*"}
requirements.txt
を生成しましょう:
$ pipenv lock -r --dev
py==1.4.34
pytest==3.2.3
めっちゃ高機能。
☤ セキュリティの脆弱性の検知¶
Pipenv は safety パッケージを含んでいて、既知のセキュリティの脆弱性が無いか依存関係グラフを走査するのに使われます。
例:
$ cat Pipfile
[packages]
django = "==1.10.1"
$ pipenv check
Checking PEP 508 requirements…
Passed!
Checking installed package safety…
33075: django >=1.10,<1.10.3 resolved (1.10.1 installed)!
Django before 1.8.x before 1.8.16, 1.9.x before 1.9.11, and 1.10.x before 1.10.3, when settings.DEBUG is True, allow remote attackers to conduct DNS rebinding attacks by leveraging failure to validate the HTTP Host header against settings.ALLOWED_HOSTS.
33076: django >=1.10,<1.10.3 resolved (1.10.1 installed)!
Django 1.8.x before 1.8.16, 1.9.x before 1.9.11, and 1.10.x before 1.10.3 use a hardcoded password for a temporary database user created when running tests with an Oracle database, which makes it easier for remote attackers to obtain access to the database server by leveraging failure to manually specify a password in the database settings TEST dictionary.
33300: django >=1.10,<1.10.7 resolved (1.10.1 installed)!
CVE-2017-7233: Open redirect and possible XSS attack via user-supplied numeric redirect URLs
============================================================================================
Django relies on user input in some cases (e.g.
:func:`django.contrib.auth.views.login` and :doc:`i18n </topics/i18n/index>`)
to redirect the user to an "on success" URL. The security check for these
redirects (namely ``django.utils.http.is_safe_url()``) considered some numeric
URLs (e.g. ``http:999999999``) "safe" when they shouldn't be.
Also, if a developer relies on ``is_safe_url()`` to provide safe redirect
targets and puts such a URL into a link, they could suffer from an XSS attack.
CVE-2017-7234: Open redirect vulnerability in ``django.views.static.serve()``
=============================================================================
A maliciously crafted URL to a Django site using the
:func:`~django.views.static.serve` view could redirect to any other domain. The
view no longer does any redirects as they don't provide any known, useful
functionality.
Note, however, that this view has always carried a warning that it is not
hardened for production use and should be used only as a development aid.
✨🍰✨
注釈
In order to enable this functionality while maintaining its permissive copyright license, pipenv embeds an API client key for the backend Safety API operated by pyup.io rather than including a full copy of the CC-BY-NC-SA licensed Safety-DB database. This embedded client key is shared across all pipenv check users, and hence will be subject to API access throttling based on overall usage rather than individual client usage.
You can also use your own safety API key by setting the
environment variable PIPENV_PYUP_API_KEY
.
☤ コミュニティとの連係¶
Pipenvと連係する様々なプロダクトに加え、コミュニティがメンテナンスしている多種多様のプラグインや拡張があり、様々なエディタやIDEで使えます:
- Heroku (クラウドホスティング)
- Platform.sh (クラウドホスティング)
- PyUp (セキュリティ通知)
- Emacs (エディタ連係)
- Fish Shell (自動
$ pipenv shell
!) - VS Code (エディタ連係)
- PyCharm (エディタ連係)
対応中:
- Sublime Text (エディタ連係)
- 未だその姿を見せていない来たるべきGoogle Cloudプロダクト (クラウドホスティング)
☤ エディタでモジュールを開く¶
Pipenvを使うと $ pipenv open
コマンドで、(自分で書いたコードベースを含め) インストールされているどんなPythonモジュールも開けます:
$ pipenv install -e git+https://github.com/kennethreitz/background.git#egg=background
Installing -e git+https://github.com/kennethreitz/background.git#egg=background…
...
Updated Pipfile.lock!
$ pipenv open background
Opening '/Users/kennethreitz/.local/share/virtualenvs/hmm-mGOawwm_/src/background/background.py' in your EDITOR.
この機能のおかげで、GitHubまで見に行かなくても、今使っているコードを手軽に読めるようになります。
注釈
この機能では標準の EDITOR
環境変数が使われます。
例えばVS Codeを使っている場合は、 export EDITOR=code
とします (macOSの場合は、最初に PATH
に上 コマンドをインストール します)。
☤ Pythonの自動インストール¶
pyenv のインストールと設定が済んでいて、必要とするバージョンのPythonがまだ利用できる状態になっていない場合、Pipenvは自動でそのバージョンのPythonをインストールしたいかどうかを尋ねます。
これは非常に高度な機能で、自慢の機能です:
$ cat Pipfile
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
[dev-packages]
[packages]
requests = "*"
[requires]
python_version = "3.6"
$ pipenv install
Warning: Python 3.6 was not found on your system…
Would you like us to install latest CPython 3.6 with pyenv? [Y/n]: y
Installing CPython 3.6.2 with pyenv (this may take a few minutes)…
...
Making Python installation global…
Creating a virtualenv for this project…
Using /Users/kennethreitz/.pyenv/shims/python3 to create virtualenv…
...
No package provided, installing all dependencies.
...
Installing dependencies from Pipfile.lock…
🐍 ❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒❒ 5/5 — 00:00:03
To activate this project's virtualenv, run the following:
$ pipenv shell
Pipenv は PEP 508 が規定する python_full_version
と python_version
の両方に従います。
💫✨🍰✨💫
☤ .env
の自動読み込み¶
プロジェクトに .env
ファイルが存在する場合は、 $ pipenv shell
および $ pipenv run
は自動で読み込みます:
$ cat .env
HELLO=WORLD⏎
$ pipenv run python
Loading .env environment variables…
Python 2.7.13 (default, Jul 18 2017, 09:17:00)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['HELLO']
'WORLD'
Shell like variable expansion is available in .env
files using ${VARNAME} syntax.:
$ cat .env
CONFIG_PATH=${HOME}/.config/foo
$ pipenv run python
Loading .env environment variables…
Python 3.7.6 (default, Dec 19 2019, 22:52:49)
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['CONFIG_PATH']
'/home/kennethreitz/.config/foo'
この機能は、本番環境の証明書をコードベースから避けておくのに非常に便利です。
.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 shell
See theskumar/python-dotenv for more information on .env
files.
☤ 独自のスクリプトショートカット¶
Pipenvは、Pipfileのオプションの [scripts]
節で独自のショートカットの作成をサポートしています。
そのショートカットは、ターミナルで pipenv run <shortcut name>
と実行でき、Pipenvシェルを事前に有効化してなかったとしてもPipenvの仮想環境のコンテキストでコマンドが実行されます。
For example, in your Pipfile:
[scripts]
printspam = "python -c \"print('I am a silly example, no one would need to do this')\""
そして、ターミナルで次のように打ち込みます:
$ pipenv run printspam
I am a silly example, no one would need to do this
Commands that expect arguments will also work. For example:
[scripts]
echospam = "echo I am really a very silly example"
$ pipenv run echospam "indeed"
I am really a very silly example indeed
☤ 環境変数のサポート¶
Pipenv supports the usage of environment variables in place of authentication fragments
in your Pipfile. These will only be parsed if they are present in the [[source]]
section. For example:
[[source]]
url = "https://${PYPI_USERNAME}:${PYPI_PASSWORD}@my_private_repo.example.com/simple"
verify_ssl = true
name = "pypi"
[dev-packages]
[packages]
requests = {version="*", index="home"}
maya = {version="*", index="pypi"}
records = "*"
Environment variables may be specified as ${MY_ENVAR}
or $MY_ENVAR
.
On Windows, %MY_ENVAR%
is supported in addition to ${MY_ENVAR}
or $MY_ENVAR
.
☤ 環境変数による設定¶
Pipenvには、シェル環境変数で有効にできるオプションが少しだけあります。 オプションを有効にするには、シェルでその変数を作成すればpipevnが見付けてくれます。
-
pipenv.environments.
PIPENV_CACHE_DIR
= '/home/docs/.cache/pipenv'¶ Pipenvがパッケージキャッシュを保存する場所です。
Default is to use appdir's user cache directory.
-
pipenv.environments.
PIPENV_COLORBLIND
= False¶ 設定された場合、ターミナル出力に色が付きません。
なんらか理由で、ターミナル出力に色が付いて欲しくない人もいます。 デフォルトでは色が付きます。
-
pipenv.environments.
PIPENV_DEFAULT_PYTHON_VERSION
= None¶ 新しい仮想環境を作るときに、デフォルトでこのバージョンのPythonが使われます。
This can be set to a version string, e.g.
3.6
, or a path. Default is to use whatever Python Pipenv is installed under (i.e.sys.executable
). Command line flags (e.g.--python
,--three
, and--two
) are prioritized over this configuration.
-
pipenv.environments.
PIPENV_DONT_LOAD_ENV
= False¶ 設定された場合、Pipenvは
.env
ファイルを読み込みません。デフォルトでは、
run
コマンドとshell
コマンドで.env
が読み込まれます。
-
pipenv.environments.
PIPENV_DONT_USE_ASDF
= False¶ If set, Pipenv does not attempt to install Python with asdf.
Default is to install Python automatically via asdf when needed, if possible.
-
pipenv.environments.
PIPENV_DONT_USE_PYENV
= False¶ 設定された場合、PipenvはpyenvでPythonをインストールしようとはしなくなります。
デフォルトでは、可能なら必要なときにpyenvで自動的にPythonをインストールします。
-
pipenv.environments.
PIPENV_DOTENV_LOCATION
= None¶ 設定された場合、Pipenvは指定された場所の
.env
を読み込みます。デフォルトでは、もしあればプロジェクトルートから
.env
を読み込みます。
-
pipenv.environments.
PIPENV_EMULATOR
= ''¶ 設定された場合、ターミナルエミュレーターの名前に
pipenv shell
が使われます。デフォルトでは、エミュレーターを自動的に検出します。 例えばCmderなどの正しく検出されないエミュレーターの場合は、この環境変数を設定すべきです。
-
pipenv.environments.
PIPENV_HIDE_EMOJIS
= False¶ 出力に絵文字を使いません。
デフォルトでは、絵文字を使います。 Windowsでは自動的に設定されます。
-
pipenv.environments.
PIPENV_IGNORE_VIRTUALENVS
= False¶ If set, Pipenv will always assign a virtual environment for this project.
デフォルトでは、Pipenvは仮想環境内で実行されているかどうかを検出し、できる限り再利用します。 通常、これが望ましい振る舞いで、ユーザーが好きに構築した仮想環境をPipenvで使えるようにします。
-
pipenv.environments.
PIPENV_INSTALL_TIMEOUT
= 900¶ パッケージのインストールが完了するのを待つ最大秒数です。
Defaults to 900 (15 minutes), a very long arbitrary time.
-
pipenv.environments.
PIPENV_MAX_DEPTH
= 4¶ Pipfileを再帰的に探しに行くディレクトリ数の最大値です。
デフォルトでは、3です。
PIPENV_NO_INHERIT
も参照してください。
-
pipenv.environments.
PIPENV_MAX_RETRIES
= 0¶ Specify how many retries Pipenv should attempt for network requests.
Default is 0. Automatically set to 1 on CI environments for robust testing.
-
pipenv.environments.
PIPENV_MAX_ROUNDS
= 16¶ Tells Pipenv how many rounds of resolving to do for Pip-Tools.
Default is 16, an arbitrary number that works most of the time.
-
pipenv.environments.
PIPENV_MAX_SUBPROCESS
= 8¶ How many subprocesses should Pipenv use when installing.
Default is 16, an arbitrary number that seems to work.
-
pipenv.environments.
PIPENV_NOSPIN
= False¶ If set, disable terminal spinner.
This can make the logs cleaner. Automatically set on Windows, and in CI environments.
-
pipenv.environments.
PIPENV_NO_INHERIT
= False¶ Tell Pipenv not to inherit parent directories.
This is useful for deployment to avoid using the wrong current directory. Overwrites
PIPENV_MAX_DEPTH
.
-
pipenv.environments.
PIPENV_PIPFILE
= None¶ If set, this specifies a custom Pipfile location.
When running pipenv from a location other than the same directory where the Pipfile is located, instruct pipenv to find the Pipfile in the location specified by this environment variable.
Default is to find Pipfile automatically in the current and parent directories. See also
PIPENV_MAX_DEPTH
.
-
pipenv.environments.
PIPENV_PYPI_MIRROR
= None¶ If set, tells pipenv to override PyPI index urls with a mirror.
Default is to not mirror PyPI, i.e. use the real one, pypi.org. The
--pypi-mirror
command line flag overwrites this.
-
pipenv.environments.
PIPENV_RESOLVE_VCS
= False¶ Tells Pipenv whether to resolve all VCS dependencies in full.
As of Pipenv 2018.11.26, only editable VCS dependencies were resolved in full. To retain this behavior and avoid handling any conflicts that arise from the new approach, you may set this to '0', 'off', or 'false'.
-
pipenv.environments.
PIPENV_SHELL
= None¶ An absolute path to the preferred shell for
pipenv shell
.Default is to detect automatically what shell is currently in use.
-
pipenv.environments.
PIPENV_SHELL_FANCY
= False¶ If set, always use fancy mode when invoking
pipenv shell
.Default is to use the compatibility shell if possible.
-
pipenv.environments.
PIPENV_SKIP_LOCK
= False¶ If set, Pipenv won't lock dependencies automatically.
This might be desirable if a project has large number of dependencies, because locking is an inherently slow operation.
Default is to lock dependencies and update
Pipfile.lock
on each run.NOTE: This only affects the
install
anduninstall
commands.
-
pipenv.environments.
PIPENV_SPINNER
= 'dots'¶ Sets the default spinner type.
Spinners are identitcal to the node.js spinners and can be found at https://github.com/sindresorhus/cli-spinners
-
pipenv.environments.
PIPENV_TIMEOUT
= 120¶ Max number of seconds Pipenv will wait for virtualenv creation to complete.
Default is 120 seconds, an arbitrary number that seems to work.
-
pipenv.environments.
PIPENV_VENV_IN_PROJECT
= False¶ If set, creates
.venv
in your project directory.Default is to create new virtual environments in a global location.
-
pipenv.environments.
PIPENV_YES
= False¶ If set, Pipenv automatically assumes "yes" at all prompts.
Default is to prompt the user for an answer if the current command line session if interactive.
-
pipenv.environments.
PIP_EXISTS_ACTION
= 'w'¶ Specifies the value for pip's --exists-action option
Defaullts to (w)ipe
-
pipenv.environments.
is_in_virtualenv
()[ソース]¶ Check virtualenv membership dynamically
戻り値: True or false depending on whether we are in a regular virtualenv or not 戻り値の型: bool
これらの環境変数をプロジェクトごとの設定にしたい場合は、それを実現するために素敵な direnv を利用するのをお薦めします。
さらにカスタマイズする必要がある場合は、 pip自身も環境変数をサポートしている ことに着目してください。
例えば、次のようにできます:
$ PIP_INSTALL_OPTION="-- -DCMAKE_BUILD_TYPE=Release" pipenv install -e .
☤ 仮想環境の独自の配置場所¶
Pipenv automatically honors the WORKON_HOME
environment variable, if you
have it set — so you can tell pipenv to store your virtual environments
wherever you want, e.g.:
export WORKON_HOME=~/.venvs
さらに、 PIPENV_VENV_IN_PROJECT
環境変数を設定することで、 project/.venv
にある仮想環境をPipenvに使わせることができます。
☤ プロジェクトのテスト¶
Pipenvは Requests のようなプロジェクトで開発用の依存関係の宣言とテストスイートの実行に使われています。
現時点では Travis-CI と tox の両方で上手くデプロイのテストを行えています。
Travis CI¶
Travis CIの設定例は Requests にあります。
このプロジェクトではMakefileによく使う関数を init
コマンドや tests
コマンドとして定義してあります。
以下が .travis.yml
の本質的なところを抜き出したものです:
language: python
python:
- "2.6"
- "2.7"
- "3.3"
- "3.4"
- "3.5"
- "3.6"
- "3.7-dev"
# command to install dependencies
install: "make"
# command to run tests
script:
- make test
そして対応するMakefileは以下の通りです:
init:
pip install pipenv
pipenv install --dev
test:
pipenv run pytest tests
ToX自動化プロジェクト¶
または、 tox.ini
を次のようにローカル環境でのテストと外部環境でのテストの両方に対して設定できます:
[tox]
envlist = flake8-py3, py26, py27, py33, py34, py35, py36, pypy
[testenv]
deps = pipenv
commands=
pipenv install --dev
pipenv run pytest tests
[testenv:flake8-py3]
basepython = python3.4
commands=
pipenv install --dev
pipenv run flake8 --version
pipenv run flake8 setup.py docs project test
Pipenv will automatically use the virtualenv provided by tox
. If pipenv install --dev
installs e.g. pytest
, then installed command pytest
will be present in given virtualenv and can be called directly by pytest tests
instead of pipenv run pytest tests
.
テストを実行するたびにうっかりlockファイルを編集してしまわないように、 pipenv install
に --ignore-pipfile
を付けたいと思うかもしれません。
これをするとPipenvが Pipfile
への変更を無視してしまうのと、(もっと重要なこととして) 現在の環境を Pipfile.lock
に追加するのを防ぎます。
これが重要な点なのは、今いる環境 (すなわちtoxが用意した仮想環境) は通常は (望ましいもしくは望しくないことに) 現時点のプロジェクトと、 tox
の deps
に設定されている追加の依存関係を含んでいるためです。
最初に用意される環境に対しては、この方法ではなく skip_install = True
をtox.iniに追加することで無効化できます。
この方法はlockファイルの更新に関しての明示的な指定が必要であり、おそらくこれがどのケースにおいても良い案です。
サードパーティのプラグイン tox-pipenv も、toxにPipenvを連係させるのに使えます。
☤ シェルの補完¶
fishで補完を有効にするには、次のコマンドを設定ファイルに追加してください:
eval (pipenv --completion)
また、bashやzshでは次のコマンドを設定ファイルに追加してください:
eval "$(pipenv --completion)"
魔法のシェル補完が使えるようになりました!
✨🍰✨
☤ プラットフォームが提供するPythonコンポーネントを使っての作業¶
オペレーティングシステムのインターフェースに使われているプラットフォーム固有のPythonは、システムのパッケージマネージャからしか利用できず、従って pip を使った仮想環境へのインストールには使えないのが合理的に考えて普通です。 このようなケースでは、システムの site-packages ディレクトリにアクセスできる仮想環境を作ります:
$ pipenv --three --site-packages
pip でインストールできるコンポーネントが本当に仮想環境にインストールされ、システムのパッケージはPythonレベルでの依存関係解決に一切現れないインターフェースのために使われることを保証するために、 PIP_IGNORE_INSTALLED 設定を使いましょう:
$ PIP_IGNORE_INSTALLED=1 pipenv install --dev
☤ Pipfile vs setup.py¶
アプリケーション と ライブラリ の間には、微妙だが非常に重要な違いがあります。 これはPythonコミュニティでよく起こる混乱の元になっています。
ライブラリは、再利用可能な機能を他のライブラリやアプリケーション (ここでは両方を包括する用語として プロジェクト を使います) に提供します。
ライブラリは、自身を起点とする依存関係である他のライブラリと共に協調して動作する必要があります。
ライブラリは 抽象的な依存関係 を定義します。
プロジェクトに含まれる別々のライブラリのそれぞれを起点とする依存関係どうしで、バージョンの衝突が起きないようにライブラリは絶対に依存パッケージのバージョンを固定するべきではありません。
ある特定の機能や修正やバグに依存している場合には、バージョンの下限や (滅多に無いですが) 上限を指定することもあります。
ライブラリの依存関係は setup.py
では install_requires
で指定します。
ライブラリは究極的には、とある アプリケーション で使われるためのものです。 アプリケーションはそれとは違って、通常は他のプロジェクトから依存されることはありません。 アプリケーションは、ある特定の環境に配置され、依存関係やさらにその先の依存関係全ての正確なバージョンが具体的であるようになっています。 この処理をより簡単にすることが、現在Pipenvの最も重要な目標です。
まとめると次のようになります:
- ライブラリは、
setup.py
のinstall_requires
で 抽象的な依存関係 を定義します。 厳密にどのバージョンをインストールし、どこから依存パッケージを取得するかの判断は、あなたが決めることではありません! - アプリケーションは、 Pipfile に 依存関係とそれをどこから取得するか を定義し、Pipfileを使って
Pipfile.lock
にある 具体的な依存関係 たちを更新します。 Pipfile.lockは、プロジェクトがきちんと動くことが分かっている特定の冪等な環境を定義します。Pipfile.lock
は正しさの源泉です。Pipfile
はそのlockファイルを作るのに便利なもので、実際に使う依存関係の正確なバージョンについて、曖昧なままにしておけます。 Pipenvは、きちんと動作する衝突の起きない依存関係のバージョン指定を定義する助けになります。他のツールではこの作業は非常にうんざりするものになります。 - もちろん、
Pipfile
とPipenvはライブラリの開発者にも便利なもので、開発環境やテスト環境を定義するのに使えます。 - そして当り前ですが、ライブラリとアプリケーションの区別が明確でないプロジェクトもあります。
その場合は、Pipenvおよび
Pipfile
と一緒にinstall_requires
を使ってください。
次のようにもできます:
$ pipenv install -e .
このコマンドでは、 setup.py
で宣言されている依存関係を全てロックするようにPipenvに指示しています。
☤ Pipenvのキャッシュの場所を変更する¶
環境変数 PIPENV_CACHE_DIR
を好きな場所に設定することで、デフォルトと異なるキャッシュの場所を使うようPipenvに強制できます。
これは PIP_CACHE_DIR
を別のディレクトリに変更しているのと同じ状況で役に立ちます。
☤ Pythonのデフォルトバージョンを変更する¶
デフォルトでは、Pipenvはプロジェクトの初期化にpython3のどれかのバージョンを使います。
--three
フラグもしくは --two
フラグを付けてプロジェクトを始める他に、 --three
や --two
を付けていないときには PIPENV_DEFAULT_PYTHON_VERSION
を使ってプロジェクトを始めるときにどのバージョンを使うかを指定できます。