<p>pipenvはpip.confを尊重しません</p>

作成日 2017年10月08日  ·  15コメント  ·  ソース: pypa/pipenv

devpiをプライベートpypiリポジトリとして使用しており、キャッシュpypiパッケージをプロキシして、独自の社内パッケージを追加できます。

私のpip.confは次のようになります。

[global]
index_url = https://pypi.priv.xxx/prod/+simple/
[search]
index = https://pypi.priv.xxx/prod/

この問題に言及している別の問題は見つかりませんでした。

最も参考になるコメント

これらのエントリには、プロジェクトリポジトリに入るはずのPipfileには確実に入らない資格情報が含まれている場合があります。

全てのコメント15件

これらのエントリは、Pipfileに入れる必要があります。

@kennethreitz自分のケースを明確にしたとは思わないので、pipenvを使い始めたときに遭遇したいくつかのユースケースを説得してみましょう。
まず、私はpipenv、それがどのように機能するか、そしてそのコードに飛び込み始めたところです。 私は、あなたがソースを指定することができます知っているPipfileで何ができるかに似ている、私はまた、あなたが名前のインデックスを使用することができます見て、 ~/.pypirc

新しいpipenvプロジェクト/環境の作成

$ mkdir foobar
$ cd foobar
$ pipenv install --verbose requests
⠋New python executable in /home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf/bin/python         
Installing setuptools, pip, wheel...done.                                                      

Virtualenv location: /home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf                         
Installing requests… 
⠙Installing u'requests'
$ "/home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install   --verbose   "requests"
-i https://pypi.python.org/simple --exists-action w
Collecting requests
  1 location(s) to search for versions of requests:
  * https://pypi.python.org/simple/requests/
  Getting page https://pypi.python.org/simple/requests/
[...]
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
Cleaning up...

Adding requests to Pipfile's [packages]…
  PS: You have excellent taste! ✨ 🍰 ✨
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (76e6d4)!

追加のインデックスからパッケージをインストールします

pypiが認識しないパッケージをインストールすると、すぐには機能しません( pip.conf設定を使用するため、pipまたはpip-toolsで機能します)。

$ pipenv install --verbose palantir
Installing palantir…
⠋Installing u'palantir'
$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install   --verbose   "palantir" -i https://pypi.python.org/simple --exists-action w
Collecting palantir
  1 location(s) to search for versions of palantir:
[...]
Error:  An error occurred while installing palantir!
  Could not find a version that satisfies the requirement palantir (from versions: )
No matching distribution found for palantir

Pipfileに新しいインデックスが設定され、パッケージがこのインデックスに関連付けられている場合(https://docs.pipenv.org/advanced.html#specifying-package-indexesに続く)、コマンドラインはとにかく最初にpypiを呼び出します:

$ pipenv install --verbose palantir
Installing palantir… 
⠋Installing u'palantir'                                                                        
$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install   --verbose   "palantir"
-i https://pypi.python.org/simple --exists-action w                                            
⠋$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install   --verbose   "palantir"
 -i https://pypi.priv.xxx/prod/+simple/ --exists-action w                
Collecting palantir                         
  1 location(s) to search for versions of palantir:
[...]
Successfully installed palantir-1.1.5
Cleaning up...

Adding palantir to Pipfile's [packages]…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…

pip-toolsによって生成された要件ファイルを使用します

pip-toolsを使用する場合、要件ファイルはパッケージのインストールに使用されるインデックスで始まります。

#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile --output-file requirements.txt requirements.in
#
--index-url https://pypi.priv.xxx/prod/+simple/

bcrypt==3.0.0
[...]

要件ファイルを使用する場合(クリーンなプロジェクトから開始)、この設定は尊重されません。

$ pipenv install -r requirements.txt
Requirements file provided! Importing into Pipfile…
Pipfile.lock (c23e27) out of date, updating to (3c7b08)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
CRITICAL:pip.index:Could not find a version that satisfies the requirement palantir==1.1.5 (from versions: )
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.

観察

インデックスとUXの処理にはある種の「ギャップ」があると思います。

  • ユーザーは、コマンドラインからインストールしているときにインデックスを(名前またはリソースで)指定できません。これにより、 Pipfileインデックスのエントリを作成し、すべてのパッケージをインデックスに関連付けることができます。 pypiからのパッケージがたくさんあり、プライベートインデックスからのパッケージが1つしかない場合、これはあまり便利ではありません。
  • コマンドラインからパッケージをインストールする場合、使用する必要があるデフォルトのインデックスは何ですか?
  • カスタムインデックスからパッケージをインストールする場合、コマンドラインでパッケージを指定することはできません。
  • 要件ファイルでインデックスが指定されている場合、そのインデックスは無視されます。

上記で明らかになった問題をカバーするPRを提供するためにコードに飛び込んでいます:

  • プロジェクトの初期化時に、カスタムインデックスのpip.confを確認します
  • Pipfileにデフォルトのインデックスを定義し、何も指定されていない場合に使用します
  • コマンドラインで名前またはリソースごとにインデックスを指定します
  • 要件ファイルで提供されているインデックスを尊重し、それをPipfile追加します

インデックスが要件ファイルまたはコマンドラインで使用されているが、 Pipfileが不明な場合は、pipenvで使用されているvenvの名前と同様の自動名でエントリを追加する必要があります。

どうしてそんなに気にするの? 中国に住んでいるので、pypiは常に利用可能または高速(多数のタイムアウトまたは完全な低速)ではないため、プライベートパッケージをキャッシュして混合できるdevpiのようなインデックスを持つことは二重の勝利です。 これにより、開発、テスト、Dockerビルドなどがはるかに高速になります。

例として、これはタイムアウトが関係するときに発生する非常に古典的な動作です。

Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
Could not find a version that matches requests==2.17.3,==2.18.4
Tried: 0.2.0, 0.2.0, 0.2.1, 0.2.1, 0.2.2, 0.2.2, 0.2.3, 0.2.3, 0.2.4, 0.2.4, 0.3.0, 0.3.0, 0.3.1, 0.3.1, 0.3.2, 0.3.2, 0.3.3, 0.3.3, 0.3.4, 0.3.4, 0.4.0, 0.4.0, 0.4.1, 0.4.1, 0.5.0, 0.5.0, 0.5.1, 0.5.1, 0.6.0, 0.6.0, 0.6.1, 0.6.1, 0.6.2, 0.6.2, 0.6.3, 0.6.3, 0.6.4, 0.6.4, 0.6.5, 0.6.5, 0.6.6, 0.6.6, 0.7.0, 0.7.0, 0.7.1, 0.7.1, 0.7.2, 0.7.2, 0.7.3, 0.7.3, 0.7.4, 0.7.4, 0.7.5, 0.7.5, 0.7.6, 0.7.6, 0.8.0, 0.8.0, 0.8.1, 0.8.1, 0.8.2, 0.8.2, 0.8.3, 0.8.3, 0.8.4, 0.8.4, 0.8.5, 0.8.5, 0.8.6, 0.8.6, 0.8.7, 0.8.7, 0.8.8, 0.8.8, 0.8.9, 0.8.9, 0.9.0, 0.9.0, 0.9.1, 0.9.1, 0.9.2, 0.9.2, 0.9.3, 0.9.3, 0.10.0, 0.10.0, 0.10.1, 0.10.1, 0.10.2, 0.10.2, 0.10.3, 0.10.3, 0.10.4, 0.10.4, 0.10.6, 0.10.6, 0.10.7, 0.10.7, 0.10.8, 0.10.8, 0.11.1, 0.11.1, 0.11.2, 0.11.2, 0.12.0, 0.12.0, 0.12.1, 0.12.1, 0.13.0, 0.13.0, 0.13.1, 0.13.1, 0.13.2, 0.13.2, 0.13.3, 0.13.3, 0.13.4, 0.13.4, 0.13.5, 0.13.5, 0.13.6, 0.13.6, 0.13.7, 0.13.7, 0.13.8, 0.13.8, 0.13.9, 0.13.9, 0.14.0, 0.14.0, 0.14.1, 0.14.1, 0.14.2, 0.14.2, 1.0.0, 1.0.0, 1.0.1, 1.0.1, 1.0.2, 1.0.2, 1.0.3, 1.0.3, 1.0.4, 1.0.4, 1.1.0, 1.1.0, 1.2.0, 1.2.0, 1.2.1, 1.2.1, 1.2.2, 1.2.2, 1.2.3, 1.2.3, 2.0.0, 2.0.0, 2.0.0, 2.0.0, 2.0.1, 2.0.1, 2.0.1, 2.0.1, 2.1.0, 2.1.0, 2.1.0, 2.1.0, 2.2.0, 2.2.0, 2.2.0, 2.2.0, 2.2.1, 2.2.1, 2.2.1, 2.2.1, 2.3.0, 2.3.0, 2.3.0, 2.3.0, 2.4.0, 2.4.0, 2.4.0, 2.4.0, 2.4.1, 2.4.1, 2.4.1, 2.4.1, 2.4.2, 2.4.2, 2.4.2, 2.4.2, 2.4.3, 2.4.3, 2.4.3, 2.4.3, 2.5.0, 2.5.0, 2.5.0, 2.5.0, 2.5.1, 2.5.1, 2.5.1, 2.5.1, 2.5.2, 2.5.2, 2.5.2, 2.5.2, 2.5.3, 2.5.3, 2.5.3, 2.5.3, 2.6.0, 2.6.0, 2.6.0, 2.6.0, 2.6.1, 2.6.1, 2.6.1, 2.6.1, 2.6.2, 2.6.2, 2.6.2, 2.6.2, 2.7.0, 2.7.0, 2.7.0, 2.7.0, 2.8.0, 2.8.0, 2.8.0, 2.8.0, 2.8.1, 2.8.1, 2.8.1, 2.8.1, 2.9.0, 2.9.0, 2.9.0, 2.9.0, 2.9.1, 2.9.1, 2.9.1, 2.9.1, 2.9.2, 2.9.2, 2.9.2, 2.9.2, 2.10.0, 2.10.0, 2.10.0, 2.10.0, 2.11.0, 2.11.0, 2.11.0, 2.11.0, 2.11.1, 2.11.1, 2.11.1, 2.11.1, 2.12.0, 2.12.0, 2.12.0, 2.12.0, 2.12.1, 2.12.1, 2.12.1, 2.12.1, 2.12.2, 2.12.2, 2.12.2, 2.12.2, 2.12.3, 2.12.3, 2.12.3, 2.12.3, 2.12.4, 2.12.4, 2.12.4, 2.12.4, 2.12.5, 2.12.5, 2.12.5, 2.12.5, 2.13.0, 2.13.0, 2.13.0, 2.13.0, 2.14.0, 2.14.0, 2.14.0, 2.14.0, 2.14.1, 2.14.1, 2.14.1, 2.14.1, 2.14.2, 2.14.2, 2.14.2, 2.14.2, 2.15.1, 2.15.1, 2.15.1, 2.15.1, 2.16.0, 2.16.0, 2.16.0, 2.16.0, 2.16.1, 2.16.1, 2.16.1, 2.16.1, 2.16.2, 2.16.2, 2.16.2, 2.16.2, 2.16.3, 2.16.3, 2.16.3, 2.16.3, 2.16.4, 2.16.4, 2.16.4, 2.16.4, 2.16.5, 2.16.5, 2.16.5, 2.16.5, 2.17.0, 2.17.0, 2.17.0, 2.17.0, 2.17.1, 2.17.1, 2.17.1, 2.17.1, 2.17.2, 2.17.2, 2.17.2, 2.17.2, 2.17.3, 2.17.3, 2.17.3, 2.17.3, 2.18.0, 2.18.0, 2.18.0, 2.18.0, 2.18.1, 2.18.1, 2.18.1, 2.18.1, 2.18.2, 2.18.2, 2.18.2, 2.18.2, 2.18.3, 2.18.3, 2.18.3, 2.18.3, 2.18.4, 2.18.4, 2.18.4, 2.18.4

@kennethreitz
いいえ。 たとえば、私は中国に住んでいます。 pypi.python.orgへの速度は通常50k / s未満であり、グローバルチャイナミラー設定する

  File "d:\python27\lib\site-packages\pipenv\patched\pip\_vendor\requests\packages\urllib3\response.
py", line 324, in read
    flush_decoder = True
  File "d:\python27\lib\contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "d:\python27\lib\site-packages\pipenv\patched\pip\_vendor\requests\packages\urllib3\response.
py", line 246, in _error_catcher
    raise ReadTimeoutError(self._pool, None, 'Read timed out.')
pip._vendor.requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='pypi.py
thon.org', port=443): Read timed out.

つまり、pipenvを使用するたびに、pip.conf [Pipfile]を作成する必要があるということですか? それは私には受け入れられません。

これらのエントリには、プロジェクトリポジトリに入るはずのPipfileには確実に入らない資格情報が含まれている場合があります。

@eromoe @hrbonzでは、pipenvがプライベートサーバーではなく最初にpypiを解決するという問題はありますか?

私にとってはそうです。 本当にグローバルミラー設定が必要です。

pip.confは次のとおりです。

  1. 最初にサイト全体のファイルが読み取られ、次に
  2. ユーザーごとのファイルが読み取られ、最後に
  3. virtualenv固有のファイルが読み取られます。

pip.confを尊重するということは、pipユーザーがシームレスにpipenvに切り替えることができることを意味します。

私はそれらの構成をPipfileに入れることができるというアイデアが好きです(他の開発者と構成を簡単に共有するため)が、pipenvは間違いなくpip.confも尊重する必要があります( Pipfile)。

@erinxoconこれは私が特定した問題の1つです。 私は仕事でかなり忙しいですが、来週までに最初のPRをプッシュしたいと思っています。

こんにちは、 @ kennethreitz素晴らしいプロジェクトに感謝​​します。

私は質問があります、あなたはその議論に議論が持ち込まれた後、その問題に関するあなたの立場を再考しますか?

pip.confの別の非常によく似たユースケースがあり、個別のpip.confファイルにクレデンシャルがあると、CI / CDパイプラインとローカル開発マシンで予測可能なビルドを行うのに有効です。

@hrbonz今のところ、pip.confファイルがpipenvでサポートされるまで、pipから$PIP_INDEX_URL env変数だけを使用するソリューションを見つけました。 これらの$PIP_VARIABLEは、今のところ.envファイルから入手できます。

pypa / pip#3728とカスタムインデックスを組み合わせることは、クレデンシャルを公開せずにプライベートインデックスのソリューションになると思います。 #1406にもコメント。

必要なのがインデックス名とURLだけである場合の1つの回避策です(たとえば、 devpiを使用します)。 このシェル関数は、カスタムのインデックス名とURLを持ち、それ以外は元の状態のPipfileを作成するときにいつでも呼び出すことができます。

pipenv_init() {
  # pipenv issue #856: pipenv doesn't respect pip.conf
  # https://github.com/pypa/pipenv/issues/856

  # This function accepts one optional argument: the path to the pipenv
  # executable. If not set or empty, defaults to PATH lookup.
  local PIPENV="${1:-pipenv}"
  if ! command -v -- "${PIPENV}" > /dev/null; then
    >&2 printf '%s\n' 'pipenv not found'
    return 1
  fi

  # Check for required environment variables.
  if [[ -z "${PIPENV_INDEX_NAME-}" ]] || [[ -z "${PIPENV_INDEX_URL-}" ]]; then
    >&2 printf '%s\n' 'PIPENV_INDEX_{NAME,URL} env vars must be set and not empty'
    return 1
  fi

  # Create fresh Pipfile and virtualenv.
  #
  # While doing so, move requirements.txt out of the way so pipenv
  # doesn't attempt to populate the virtualenv before we have a chance
  # to modify Pipfile.
  # https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/cli.py#L308-L330
  # https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/project.py#L117-L119
  # https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/project.py#L231-L240
  # https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/utils.py#L1112-L1124
  local TEMP_REQUIREMENTS_TXT
  "${PIPENV}" --rm || true
  rm -f -- Pipfile Pipfile.lock
  if [[ -f requirements.txt ]]; then
    TEMP_REQUIREMENTS_TXT="$(mktemp)"
    mv -- requirements.txt "${TEMP_REQUIREMENTS_TXT}"
  fi
  "${PIPENV}" install
  if [[ -n "${TEMP_REQUIREMENTS_TXT}" ]]; then
    mv -- "${TEMP_REQUIREMENTS_TXT}" requirements.txt
  fi
  rm -- Pipfile.lock

  # Within Pipfile's `[[source]]` section, set `name` to
  # `${PIPENV_INDEX_NAME}` and `url` to `${PIPENV_INDEX_URL}`.
  local TEMP_PIPFILE="$(mktemp)"
  < Pipfile \
      sed \
      -e '/^\[\[source\]\]$/,/^\[/ { s|^\(name = \).*|\1"'"${PIPENV_INDEX_NAME}"'"| ; s|^\(url = \).*|\1"'"${PIPENV_INDEX_URL}"'"| ; }' \
    > "${TEMP_PIPFILE}"
  mv -- "${TEMP_PIPFILE}" Pipfile
}

紳士、真剣に。 この問題の影響を直接受ける簡単なユースケースがあります。

pipenvを使用するプロジェクトがあります。 私はこのプロジェクトを自宅と職場の両方で書いています。
家では問題ありません。 職場では、内部pipyインデックスを使用する必要があります。

Pipfileがコミットされてgitにプッシュされるため、自宅から職場に移動するときに変更を続けることができません。 別のインデックスを使用する必要があることをpipenvに通知する外部構成が必要です。

この構成をPipfile内に配置しても機能しません。

これに関する更新はありますか?

@hrbonz @ninrod @GhostofGoesが#1769および#1809で修正されました-Pipfilesの環境変数が実行時に拡張されるようになりました

ご理解のほどよろしくお願いいたします。私たちの最優先事項はコードベースのコア機能であるため、このような機能はすり抜けてしまう傾向があります。 ただし、現在優先していないアイテムへの貢献については、いつでも喜んで話し合います。

これが修正されるまで私が考えることができる唯一の選択肢は、PyPi URLをオーバーライドして、すべてのトラフィックがPyPiの内部ミラー(たとえば、Artifactoryなど)に転送されるようにすることです。 とにかくPyPiは内部的に制限されているので。

このページは役に立ちましたか?
0 / 5 - 0 評価