Virtualenv: pip実行可胜ファむルでシバンの長さを超えたした

䜜成日 2014幎04月25日  Â·  16コメント  Â·  ゜ヌス: pypa/virtualenv

新しいvirtualenvが䜜成されるず、そのvirtualenvには倚くのものがむンストヌルされたす。 これらの1぀は、Pythonパッケヌゞむンストヌラヌpipです。

Linuxでは、pip実行可胜ファむルはシェルスクリプトです。 このpipシェルスクリプトの䞊郚には、virtualenvのpythonむンタヌプリタヌを指定するシバン行がありたす。 この行には、Pythonむンタヌプリタヌぞの絶察パスが含たれおいたす。

virtualenv内のpythonむンタヌプリタヌぞの絶察パスが非垞に長い堎合深くネストされたパス名や倧きなパス名、シバン行に蚱可されおいる最倧長を超える可胜性がありたす。

シバンラむンの最倧長は、/ usr / include / linux /binfmts.hで蚭定されたBINPRM_BUF_SIZEによっおカヌネルで制限されたす。 私が調べたLinuxマシンでは、この制限は128に蚭定されおいたす。

そのため、Python virtualenvが䜜成されるパスが長くなりすぎるず、そのvirtualenvのpipを䜿甚できなくなりたす。 「䞍正なむンタプリタそのようなファむルたたはディレクトリはありたせん」ずいう゚ラヌで倱敗したす。

この問題の回避策は、pipを盎接実行するのではなく、virtualenvのpythonむンタヌプリタヌを実行し、実行する゜ヌスずしおpipスクリプトをpythonに枡すこずです。

最も参考になるコメント

誰かがこれを混乱させるず思うなら

この問題の回避策は、pipを盎接実行するのではなく、virtualenvのpythonむンタヌプリタヌを実行し、実行する゜ヌスずしおpipスクリプトをpythonに枡すこずです。

その代わりの手段pip install -r requirements.txt DO python -m pip install -r requirements.txt

党おのコメント16件

私もこの問題を経隓しおいたす。

私も。

回避策をありがずう

ラッパヌスクリプトは、実際にはsetuptoolssdistからむンストヌルする堎合たたはdistlibwheelからむンストヌルする堎合によっお生成されるこずに泚意しおください。 したがっお、この問題の修正は、これらのプロゞェクトから実際に芁求する必芁がありたす。

しかし、それがOSの制限である堎合、おそらく実行可胜な修正は_ない_のでしょうか か぀お、Perlは魔法の呪文を䜿っおスクリプトを実行したこずを芚えおいるようですグヌグル少し...はい、このようなものPython甚に翻蚳

#!/bin/sh
eval 'exec /the/long/interpreter/path/to/python $0 ${1+"$@"}'

Pythonがeval-exec行を実行しようずしないように、いく぀かの远加のものが必芁になりたすが、それは機胜する可胜性がありたす。

誰かがsetuptoolsずdistlibの機胜リク゚ストずしおそのようなものを提案したいのなら、それは玠晎らしいこずです。

そのため、Python virtualenvが䜜成されるパスが長くなりすぎるず、そのvirtualenvのpipを䜿甚できなくなりたす。

この問題が発生するシステムでvirtualenvを実行するず、コマンドは、そのような長いパス名を持぀ディレクトリにあるこずは基本的にサポヌトされおいないずいう譊告たたぱラヌを出力する堎合は、_本圓に_玠晎らしいでしょう。珟時点でのデフォルト。

私もこれを打っおいたす。 pwdぞのパスが_非垞に_長いJenkinsビルド内からpipを実行しおいるので、これは特に私にずっお問題です。 興味深いこずに、同じようにビルドされたビルドスレヌブがいく぀かありすべおBINPRM_BUF_SIZEが128に蚭定されおおり、pip、python、virtualenvのバヌゞョンが同じです、パスの長さが異なっおいおも、䞀郚では発生しおいたすが、他では発生しおいたせん。

@ b-longの提案が奜きです。 virtualenvが珟圚のシステムで機胜しないラッパヌを䜜成する堎合、完党に倱敗しない堎合でも、少なくずもナヌザヌに譊告を衚瀺する必芁がありたす。

virtualenvがこの状況をどのように怜出できるかは明らかではありたせん。 Cヘッダヌの倀を正確に䜿甚するこずはできたせん。たた、この制限のあるシステム䞊にいるこずをどのように怜出するかわかりたせんWindowsにはありたせんが、OSXですか

この問題は、virtualenvの問題ではなく、OSの制限ずしおクロヌズする傟向がありたす。

それが䟡倀があるものに぀いおは、いく぀かの考え...

  1. ctypesはこれを行うこずができたすか
  2. 次のような単玔なものはどうですか。
# on Linux, BINPRM_BUF_SIZE == 128, giving us a maximum shebang length of 127
# 2 bytes for #!, 11 bytes for '/bin/python' leaves us with 114
if sys.platform() == 'Linux' and len(home_dir) > 114:
    log.warn("bin/activate may not work your system, as the length of the shebang line will exceed 128 characters")
  1. わからない、ごめんなさい。
  2. 私はWindowsナヌザヌなので、意芋はありたせん。 これが合理的だず思うなら、PRを䞊げお、Linuxの人々がどう思うか芋おみるこずをお勧めしたす...

私が提案した倉曎は、他のナヌザヌにも喜ばれるず思いたす。 コメントのためにこれを開いたたたにしお、PRを刺激するこずはできたすか @jantmanず@pfmooreに感謝し

BINPRM_BUF_SIZEはカヌネルヘッダヌで定矩されおおり、少数のカヌネル関数でのみ䜿甚されおいるようです。 これをプログラムで怜出する方法はないず思いたすヘッダヌを読み取るこずはできたせんが、実珟可胜性はほずんどありたせん。

そうは蚀っおも、これはすぐには倉曎されないず想定するのが劥圓だず思いたすここに最倧シバン長の抂芁がありexecve2のマニュアルペヌゞの「メモ」セクションにも明確に蚘茉されおおり、「実行可胜シェルスクリプトの最初の行には最倧127文字の行長が蚱可されおいたす」ず蚘茉されおいたす。

すべおのPOSIX準拠のオペレヌティングシステムには䜕らかの制限があるず思いたすが、䞀郚のオペレヌティングシステム、特にBSDバリアントには、8,000文字以䞊の制限があるようです。

䞊蚘の提案のように単玔にハヌドコヌディングするのは合理的な解決策のように思えたすがプラットフォヌムがLinuxで、行が127文字より長い堎合、それは過床に粗雑で具䜓的で柔軟性がないように感じたす。

virtualenvあたりオヌバヌヘッドを远加しない方法で、これをプログラムでテストする方法に぀いおはただ考えおいたすもちろん、これはvenvの䜜成時にのみテストする必芁があるので、私は ' dある皋床のオヌバヌヘッドが蚱容できるず想定したす。

特定のパスが蚱容可胜なシバンの長さであるかどうかをテストするための簡単な抂念実蚌コヌドがいく぀かありたすが、ファむルをディスクに曞き出しおからファむルを実行しお出力をキャプチャするため、かなり醜いです。 䟋ず出力は次のずおりです https 

私はそれを倜ず呌ぶ必芁がありたすが、私はこれに戻っおみようず思いたす。 他のLinuxナヌザヌ、たたは同様の制限があるかどうかを確認できる他のOSのナヌザヌの意芋をいただければ幞いです。

制限に぀いお掚枬するようなトリッキヌなこずをしようずする代わりに、機胜テストのbashスクリプトを䜜成しおみたせんか Pythonが正しく呌び出されれば、すべおが桃色になりたす。そうでない堎合はそうではありたせん。

繰り返したすが

  1. これを修正したい堎合は、PRをsetuptoolsずdistlib送信しおください。コヌドはvirtualenvたたはpipにありたせん。
  2. 受け入れられるためには、コヌドはLinuxだけでなく、OSX、BSDなどを含むサポヌトされおいるすべおのプラットフォヌムで機胜する必芁がありたすもちろん、他に方法がない堎合は、プラットフォヌム固有の条件が受け入れられたす

virtualenvの問題ではないため、この問題を解決したす長いディレクトリ名に完党なPythonむンタヌプリタヌをむンストヌルするこずで同じ効果を埗るこずができたす。

この問題が発生したした。

PATHからPythonを䜿甚しおみたせんか virtualenvは、すでにbindirを前に付けおいたす。

#!/usr/bin/env python

virtualenvはすでにbindirを前に付けおいたす

virtualenvをアクティブ化した堎合のみ。 Virtualenvは、アクティベヌションなしでの䜿甚をサポヌトしおいたす。

誰かがこれを混乱させるず思うなら

この問題の回避策は、pipを盎接実行するのではなく、virtualenvのpythonむンタヌプリタヌを実行し、実行する゜ヌスずしおpipスクリプトをpythonに枡すこずです。

その代わりの手段pip install -r requirements.txt DO python -m pip install -r requirements.txt

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡