5

構成ファイルとマンページを含む Python ソフトウェアがあります。これらをインストールするために、 ( http://docs.python.org/2/distutils/setupscript.html#installing-additional-filessetup.pyで説明されているように)次の行が含まれています。

data_files = [('/etc/foo', ['foo.conf']), ('/usr/share/man/man1', ['foo.1'])]

でルートとしてソフトウェアをインストールしたい場合、これは問題なく機能しますが、ユーザーがおよびpython setup.py installへの書き込みを許可されていないため、もちろん virtualenv では失敗します。/etc/usr/share/man

それを修正するためのベストプラクティスは何ですか? 現在の環境で確認しVIRTUAL_ENVて、それらのファイルをまったくインストールしないでください。ソフトウェアはfoo.confローカル ディレクトリを検索するので、問題ありません。manユーザーはマンページを見逃すでしょうが、virtualenv の近くのどこにも見つからないので、とにかくそれをインストールする正気の方法はありません。

4

2 に答える 2

10

最終的に、あなたの質問は、実行中の Python が virtualenv にあるかどうかを検出する方法に関するものであるようです。virtualenvこれを理解するには、実際にどのように機能するかを理解する必要があります。

virtualenv 内でスクリプトを実行すると、activate次の 2 つのことが行われます。

  • virtualenv からのディレクトリPATHを含むように環境変数を更新するため、virtualenvからバイナリを実行すると実行されます。binpython
  • VIRTUAL_ENVactivate スクリプト自体がアクティベーションを追跡できるように、変数を設定します。

pythonvirtualenv から直接実行することはまったく問題なく、実行時には変数をまったくpython使用しません。VIRTUAL_ENV代わりに、実行中のpythonバイナリを含むディレクトリを特定し、親ディレクトリを「プレフィックス」として使用します。

sysモジュールをインポートして を参照することで、システムの接頭辞を決定できますsys.prefix。ただし、これは簡単にカスタマイズできる Python のビルド時の設定であり、プラットフォーム間で確実に異なるため、virtualenv がアクティブ化されていないときに this の値に依存することはお勧めできません。

ただし、Python には、virtualenv プレフィックスとコンパイル済みプレフィックスから実行する場合に、実行時にわずかな違いが1 つあります。パッケージには、Python バイナリにコンパイルされるプレフィックスを返すsys追加の変数があります。real_prefixしたがって、これを使用して、Python がデフォルト以外の場所で実行されていることを認識することができます。これは、virtualenv から実行されていることを意味する可能性がかなり高いです。

import sys

if getattr(sys, "real_prefix", None) is not None:
    print "Maybe in a virtualenv"
else:
    print "Probably not in a virtualenv"

しかし、これでさえ正確な科学ではありません。これは、python バイナリがコンパイル時に指定された場所にないことを示しています。現在のユーザーが書き込みアクセス権を持っているかどうかはわかりません/usr/share/man-これが正しい答えを与えない(おそらくエッジ)ケースがいくつかあります:

  • ユーザーがホーム ディレクトリのソースから独自の Python をコンパイルし、そのコンパイル済みプレフィックスが設定されていない/home/johnd/local-python場合real_prefix、ユーザーはまだ自分の Pythonlibディレクトリへの書き込みアクセス権を持っており、おそらくまたはへの書き込みアクセス権を持っていません。/etc/usr/share/man

  • 同様に、一部のシステムでは、管理者が/usr/lib/python2.7アプリ開発者の特定のグループにグループ書き込み権限を付与して、Python モジュールをインストールできるようにしている場合がありますが、他のシステム ファイルへの書き込みアクセスは許可していません。

data_filesしたがって、最終的にできる最善の方法はヒューリスティックであり、代わりに、virtualenv 内で使用されると予想されるモジュールに絶対パスを使用しないようにすることをお勧めします。妥協案として、モジュールを単純に 2 つのディストリビューションに分割することが考えられます。1 つはローカライズ可能なソース ファイルを表し、もう 1 つはそれを実行するためのシステム全体の構成を表します。後者は、ユーザーが簡単にインストールできるように前者に依存することができますが、使用しているユーザーにはvirtualenv、他の前者を直接使用するオプションがあります。

于 2013-03-18T04:49:54.983 に答える