Virtualenv: -再配眮可胜な代替

䜜成日 2020幎02月10日  Â·  43コメント  Â·  ゜ヌス: pypa/virtualenv

--relocatableフラグを䜿甚したした。 新しいリリヌス20.0にはこのフラグがありたせん。 再配眮可胜な環境を䜜成するにはどうすればよいですか

最も参考になるコメント

--relocatableを䜿甚しおvenvをrpmにバンドルしたす。 virtualenvは$ DESTDIRに䜜成され、最終的に/opt/companyに移動されたす。

党おのコメント43件

再配眮可胜フラグは垞に実隓的なものであり、実際に機胜するこずはありたせんでした。 サポヌトが終了し、機胜が完党に削陀されたしたしたがっおメゞャヌリリヌス。 ナヌスケヌスを説明しおください。別のアプロヌチを提案できる堎合がありたす。

CMD export branch && cd /build_dir && \
 apt-get update -y && apt-get upgrade -y && \
 pip3 install virtualenv && \
 virtualenv --always-copy --python=python3 env && \
 git clone http://user:pass@gitlab/dev/repo.git && \
 cd /build_dir/veil-repo/code/veil-common && \
 git checkout $branch && \
 python3 install.py -p /build_dir/veil-repo/code/cli-app/ -v /build_dir/env && \
 python3 install.py -p /build_dir/veil-repo/code/controller/ -v /build_dir/env && \
 python3 install.py -p /build_dir/veil-repo/code/node/ -v /build_dir/env && \
 cd /build_dir/ && \
 ./env/bin/pip3 install -r requirements.txt && \
 virtualenv --relocatable env

これはDockerfileからの抜粋です。 --relocatableフラグを削陀するず、コヌドは正しく機胜したすか ぀たり、独自の分離された環境を䜜成する必芁がありたす。これは、どのような方法でもコピヌできたす。

Dockerの内郚では、90だず思いたす。 ただし、そのDockerコヌドを管理しおいるナヌザヌず連絡を取る必芁があるこずを確認するには、再配眮可胜の凊理方法の埮劙な違いが実際に発生する可胜性がありたす。

CIシステムが長い名前のディレクトリにvirtualenvを䜜成するため、この機胜を䜿甚するこずがありたした。 名前は十分に長いため、 #!が長すぎお、環境でスクリプトを実行できたせん。

@ Nitori-そのような堎合は、䞀般的にツヌルを呌び出すためにpython -m圢匏を䜿甚するこずをお勧めしたす🀔

それは公正です。 倚くのPythonパッケヌゞは動䜜が悪く、そのように呌び出すこずはできたせんが。

@ Nitori-その堎合でも、バむナリフォルダヌ内のpythonむンタヌプリタヌを介しお実行可胜ファむルを呌び出すこずにより、い぀でも匷制的に呌び出すこずができたす。 䟋えば

{venv}/bin/python {venv}/bin/bad-bad-tool

ここで、 {venv}は任意の長さにするこずができたす👍

私の䌚瀟では、パむプラむンで--relocatableフラグを䜿甚しお、virtualenvを再利甚し、時間を節玄しおいたす。GitLabを䜿甚し、早い段階でvirtualenvを構築し、アヌティファクトずしお保存しおから、再利甚しお䞊列テストの束。

virtualenvのバヌゞョンを固定する぀もりでしたが、バグのために最新のものをプルするこずになり、今朝パむプラむンが壊れたした。 そのバグを修正しお固定し、すべおが実行されるようにしたした。フラグが削陀されるのを回避する方法を芋぀けたす。 しかし、問題が解決され、フラグが今埌サポヌトされるこずを期埅しおいなくおも、私の経隓を䌝えるためにここに泚意したいず思いたした。

virtualenvを䜜成する新しいアプリデヌタシヌダヌは100ミリ秒匱かかるため、このアプロヌチはナヌスケヌスで掚奚されたす。

--relocatableを䜿甚しおvenvをrpmにバンドルしたす。 virtualenvは$ DESTDIRに䜜成され、最終的に/opt/companyに移動されたす。

これは私の堎合です。

では、生成されたパスの最終的なタヌゲットを事前に枡すこずができるようにするのに圹立ちたすか

@gaborbernatはい

@gaborbernatでも、

ここで良い解決策が䜕であるかわかりたせん🀔私は提案を受け入れおいたす。

このような堎合の@gaborbernatの堎合、暙準の動䜜はbuilddirずprefixを区別するこずです。

virtualenvにはDEST_DIR匕数があり、この堎合は誀解を招く可胜性がありたす。 DEST_DIRは実際のvenvの堎所であり、事実䞊プレフィックスです/ usr、/ usr / localなどのように。 したがっお、 virtualenv LOCATIONを文曞化するず、これがより明確になるはずです。

次に、 --destdirたたは--rootオプションを远加できたす。デフォルトは/です。 このようにしお、virtualenvはdestdir chrootのようなもので分離しお動䜜できたす。 Python、pip、その他のスクリプトがこれにどのように察凊する必芁があるのか​​わかりたせん。

問題は、生成されたすべおのコン゜ヌルスクリプトが、shebangの䜜成䞭にパスをハヌドコヌドするこずです。 シバンを含むこれらの生成されたコン゜ヌルスクリプトを、ビルド䞭ずデプロむ埌の実行䞭の䞡方で機胜させる暙準的な方法はありたせん。 それは、ビルド埌に誰かがシェバンを修正しない限りです。 しかし、これは仮想環境の䜜成の範囲倖であるため、制埡できたせん。

@gaborbernatこれをsetuptoolsに実装する必芁があるずいうこずですか ビルド時ず実行時のタヌゲットロケヌションの䞡方で分離しお䜿甚できるシバンはどれですか

既存のvirtualenvのシバンを線集しお、新しい堎所で䜿甚できるようにするvirtualenv-relocateスクリプトを䜜成するこずを考えおいたす。 䜕かのようなもの 

$ virtualenv-relocate /build/dir/venv /opt/company/app/venv
Rewriting shebang of bin/pip.
Rewriting shebang of bin/pip3.5.
...
$

setuptoolsはこれにも適しおいるずは思いたせん。 これは、ロケヌションAでビルドしおから、ロケヌションBにデプロむするビルドシステムの䞀郚である必芁がある機胜です。

さお、Cプロゞェクトでは、PATHずLD_LIBRARY_PATHを線集するだけで、分離しおビルドできたす。 䜿甚するビルドシステムに関係なく。

私はCがこれをどのように達成するのかよく知らない、倚分誰かがそれを説明し、それにリンクするこずができるだろうか 以前に起こったこずはここにありたすhttps://github.com/pypa/virtualenv/blob/legacy/virtualenv.py#L1880-L1894 ; 基本的に、いく぀かのパスを盞察的なものにしようずしおいたす。぀たり、スクリプトずpth / egg-filesです。

私のリポゞトリも--relocatableを䜿甚しおおり、スクリプトを䜿甚しお再配眮可胜な仮想環境が䜜成された埌、远加のラむブラリをvirtualenvにコピヌしおいたす。 これにより、完党に再配眮可胜なvirtualenvを䜜成するこずができたした。 たずえば、これをWindowsで䜿甚し、virtualenvをむンストヌラヌに远加したす。 むンストヌル埌、python3プログラムはパッケヌゞ化されたvirtualenvで正垞に動䜜しおいたす。

同じナヌスケヌスは、MacずLinuxでも機胜したす。

@ Gagi2kで行っおいるこずは、珟圚の再配眮可胜な実装の脆匱性をすでに瀺しおいたす。 envを䜜成した埌、完党に再配眮可胜にするために、いく぀かの远加のスクリプトを実行する必芁がありたした。 問題は、パッケヌゞを完党に再配眮可胜にする方法が、タヌゲット環境に倧きく䟝存しおいるこずです。 したがっお、ここでの考え方は、virtualenv自䜓が環境を完党に再配眮可胜にするこずを諊め倚くの堎合成功できないため、代わりに、これを実珟するこのカスタムスクリプトを䜜成する人々に完党にゞョブを委任するずいうものです。 タヌゲット環境の知識を持っおいるスクリプトなので、䜕かを再配眮可胜にするために必芁な倉曎の内容ず量を正確に把握しおください。

本圓の、公正な点。

私の問題は倚かれ少なかれ、以前に提䟛した機胜を再䜜成し、すべおのプラットフォヌムずいく぀かのディストリビュヌションでテストしお、叀い機胜ずたったく同じようにする必芁があるこずです。

私たたは他の誰かがこれを実装する時間があるたで、私は今のずころ叀いvirtualenvバヌゞョンに固執しようず思うず思いたす。

@ Gagi2kは、 virtualenv-relocateプロゞェクトのアむデアに関する䞊蚘の私のコメントを参照しおください。 私はこれに぀いお他の人ず協力しお喜んでいたす。 https://github.com/spotify/dh-virtualenv/が出発点ずしお適しおいる堎合がありたす。

@bersace thx、私はすでに叀いコヌドをコピヌし、

@ Gagi2k共有しお

@bersaceただ進行䞭です https  //codereview.qt-project.org/c/qt/qtivi/+/290859

virtualenv 20の曎新党䜓により、予想よりもはるかに倚くの問題が発生したす。 叀い機胜を再利甚しおスクリプトを再配眮可胜にするこずは倧したこずではありたせんが、珟圚はvenvに基づいおおり、そのpyvenv.cfgを䜿甚するず、はるかに耇雑になりたす。 たずえば、Windowsでは、叀いvirtualenvが倚くのベヌスpyファむルをコピヌしたした/ lib / pythonたたはそれをシンボリックリンクしたした。 珟圚、それらはたったくコピヌされおいたせんが、pyvenvは元の堎所を指しおいるだけです。 元の堎所が曎新されたら、virtualenvがそれを凊理する必芁があり、必芁なすべおがただ適切に配眮されおいるこずを期埅する必芁がありたす。 さらに倧きな問題はhttps://bugs.python.org/issue39469です。これにより、virtualenvを再配眮可胜にするためにすべおをセットアップする盞察的な堎所を枡すこずが困難になりたす...

今のずころ、私はそれができるずは思いたせんpyvenv.cfgがそれをサポヌトしおいなければ。

@gaborbernat virtualenvを本来の意図ず誀甚しおいる可胜性がありたすが、pipを䜿甚しお拡匵できるようにするために、アプリケヌションに独自のpython3コピヌを提䟛する公匏の方法は䜕ですか

@ Gagi2k私はここで䜕かが欠けおいるず確信しおいたす。 しかし、特定のマシンのむンストヌルフェヌズの䞀郚ずしおpyenv.cfg honeを倉曎するだけではいけたせんか

@gaborbernat virtualenvを本来の意図ず誀甚しおいる可胜性がありたすが、pipを䜿甚しお拡匵できるようにするために、アプリケヌションに独自のpython3コピヌを提䟛する公匏の方法は䜕ですか

仮想環境は、垞にマシン䞊のPythonむンタヌプリタヌを参照するように蚭蚈されおいたす。 基本的な前提は、マシン䞊に完党に機胜するPython環境があり、そのために耇数の個別のsite-packages必芁なこずです。 リンクを完党に明瀺的にしないこずにはある皋床の䟡倀がありたすが完党に明瀺的なパスの堎合のように、たどる堎合は、 pexを䜿甚しおコヌドをパッケヌゞ化しおください。参照を簡単に壊すこずなく、Python実行可胜ファむルを事前に実行できたすか

@gaborbernat確かに、それはうたくいくでしょう、最倧の問題は、ほずんどのナヌザヌがむンストヌル埌にフォルダの名前を倉曎するだけで䜿甚でき、それが機胜し続けるこずです...
しかし、PYTHONHOMEを蚭定しおもうたくいくこずがわかりたした。少なくずも、元のむンストヌルを参照せずに動䜜させたWindowsでは。

pexは面癜そうだし、それをもっず詳しく芋おいきたす。ヒントはthxです。

@gaborbernatそれでも、

@gaborbernat確かに、それはうたくいくでしょう、最倧の問題は、ほずんどのナヌザヌがむンストヌル埌にフォルダの名前を倉曎するだけで䜿甚でき、それが機胜し続けるこずです...

圌らがこれを期埅する理由がわかりたせん。 これは決しおそうではありたせんでした。 再配眮可胜フラグがあっおも、考えられるケヌスのサブセットでは圓おはたりたした。 したがっお、なぜそれがv20で悩たされたのか。

@gaborbernatそれでも、

@bersaceこれは倚くのナヌスケヌスに䟝存したす。 deb / rpmは、Pythonがタヌゲットマシンの同じ堎所で利甚できるこずを保蚌したすか もしそうなら、むンストヌル䞭にシェバンパスを修正するだけです👍

システムpythonに䟝存する@gaborbernatは、pythonが特定の堎所にあるこずを確認するのに十分です。

postinstでむンストヌルされたファむルを倉曎するこずは非垞に悪い考えです。 これには、dpkgレルムからすべおのスクリプトを陀倖する必芁があるため、dpkgはアップグレヌド時にそれらに觊れたせん。 それは受け入れられたせん。

AFIAK、最善の解決策は、すべおのシバンを線集しおdestdirを削陀し、最終パッケヌゞをアヌカむブする前に実行するvirtualenv-change-prefixです。

@bersaceずあなたはshebangsを䜕に蚭定したすか

@gaborbernat絶察タヌゲット䜍眮。 䟋 #!/opt/company/app/venv/bin/python 。

これは、そのパッケヌゞを/以倖の新しいrefrootにデプロむするこずがサポヌトされなくなったこずを意味したすか

@gaborbernatはい、蚭蚈によるものです。 dpkg / rpmで管理されおいるファむルは、ナヌザヌが移動しおはなりたせん。

これはrelocatableずは倚少異なりたす。 目的は、venvを盞察的なものにするこずではなく、builddirdebian / build / ...たたはbuilddirずrundir/を区別するこずです。

私たちの偎に実甚的なアむテムがないので、これを閉じたす。 ここで、たたはvirtualenvの䞊でこれに取り組むこずを詊みる朜圚的なプロゞェクトに぀いお議論を続けるこずをお勧めしたす。

実際には、バヌゞョン管理を行わずに、ベンダヌの䟝存関係をいくらか代替するこずもできたす。

私の堎合、分散Sparkクラスタヌでのプログラムの実行をサポヌトするために、必芁な䟝存関係を含むpythonパッケヌゞを圧瞮し、それを「アヌカむブ」ずしおSpark onYarnに枡す必芁がありたす。 この操䜜はアナコンダで完了できたすが、私の䌚瀟でぱンタヌプラむズ゜フトりェアを䜿甚できたせん。 relocatableは、以前はこの問題を解決できたしたが、珟圚はなくなりたした。

私の堎合、分散Sparkクラスタヌでのプログラムの実行をサポヌトするために、必芁な䟝存関係を含むpythonパッケヌゞを圧瞮し、それを「アヌカむブ」ずしおSpark onYarnに枡す必芁がありたす。 この操䜜はアナコンダで完了できたすが、私の䌚瀟でぱンタヌプラむズ゜フトりェアを䜿甚できたせん。 relocatableは、以前はこの問題を解決できたしたが、珟圚はなくなりたした。

こんにちは@jackhhh 、既存のナヌスケヌスの回避策を芋぀けたしたか
同じ問題が発生しおいたす。

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