web-dev-qa-db-ja.com

パッケージを探すときに別のディレクトリを含めるようにPython

デフォルトのPythonサイトパッケージの場所が/usr/lib64/python2.6/site-packagesであるSUSEマシンを使用しています。一部のパッケージは、代わりに/usr/lib/python2.6/site-packagesに自動的にインストールされます。 Pythonを構成して、/usr/lib64/python2.6/site-packagesにも表示されるようにするにはどうすればよいですか?

6
Lorin Hochstein

(必要に応じて誤りや脱落を訂正してください。ありがとうございます。)

まず、質問とコメント。私はSUSEを使っていないので、塩を少し入れてください。 /usr/lib/python2.6/site-packagesにインストールされるパッケージは公式パッケージですか?もしそうなら、SUSEが壊れているので、そうは思われません。公式パッケージでない場合は、パッケージャーに標準パスを使用するように依頼するか、ウィッシュリストのバグをSUSEに送信して、この追加パスをサポートするように依頼することができます。これにより、あなたや他の人々のさらなる頭痛の種を減らすことができます。

現時点では、スコープの降順で次の可能性があります。

  1. すべてのユーザーのモジュール検索パスを変更します(方法1)

    Pythonインストールのモジュール検索パスを変更します。

    デフォルトのモジュール検索パスはバイナリに組み込まれています。アドオンパスは、実行時に、たとえばsite.pyファイルで構成できます。たとえば、Debianは/usr/lib/python2.6/site.py(デフォルトのpython 2.6インストール用))を使用してサイト固有の設定を行います。ファイルの先頭に記述されています

    Append module search paths for third-party packages to `sys.path`.
    
    ****************************************************************
    * This module is automatically imported during initialization. *
    ****************************************************************
    [...]
    
    This will append site-specific paths to the module search path.
    

    Debianパッチdebian/patches/site-locations.diffは言う

    Debianおよび派生物の場合、このsys.pathは、ディストリビューション内で配布されるパッケージのディレクトリで拡張されます。ローカルアドオンは/ usr/local/lib/python/dist-packagesに移動し、Debianアドオンは/ usr/{lib、share}/python/dist-packagesにインストールされます。/usr/lib/python/site-packagesは使用されません。

    問題のパッチは

                    sitedirs.append(os.path.join(prefix,
    "Lib", "site-packages"))
                 Elif os.sep == '/':
        +            sitedirs.append(os.path.join(prefix,
    "local/lib",
        +                                        "python" + sys.version[:3],
        +                                        "dist-packages"))
                     sitedirs.append(os.path.join(prefix,
    "lib",
                                                 "python" + sys.version[:3],
        -                                        "site-packages"))
        -            sitedirs.append(os.path.join(prefix,
    "lib", "site-python"))
        +                                        "dist-packages"))
        +            sitedirs.append(os.path.join(prefix,
    "lib", "dist-python"))
                 else:
                     sitedirs.append(prefix)
                     sitedirs.append(os.path.join(prefix,
    "lib", "site-packages"))
    

    したがって、システムパッケージのsite.pathを変更して、変更されたモジュール検索パスを作成できます。しかし、おそらくこれは望まないでしょう。まず、ディストリビューションのpythonパッケージを更新するたびに、これをマージする必要があります。

  2. すべてのユーザーのモジュール検索パスを変更します(方法2)

    相対パスまたは絶対パスのいずれかを含む、検索パスにすでに存在するディレクトリに、something.pth形式のファイルを追加します。例えば。

    /usr/local/lib/python2.6/dist-packages$ cat foo.pth 
    /home/faheem/dummypythonpath
    

    別の端末で

    >>> import sys
    >>> sys.path
        [...,'/home/faheem/dummypythonpath',...,]
    
  3. すべてのユーザーのモジュール検索パスを変更します(方法3)

    環境変数PYTHONPATHは通常、ユーザーレベルでシステムパスに追加するために使用されます。すべてのユーザーによって供給されるファイルにそれを置くことができます。例えば。 Debianには/etc/bash.bashrcがあります。

    # System-wide .bashrc file for interactive bash(1) shells.
    
    # To enable the settings / commands in this file for login shells as well,
    # this file has to be sourced in /etc/profile.
    

    したがって、そこにまたはPYTHONPATHを追加できます。ログインシェルとインタラクティブシェルの両方からソースを取得する必要があるので、それを確認する必要があります。残念ながら、ディストリビューションはこれを有効にすることについてしばしば不安定です。

    PYTHONPATHのパスは、システムの検索パスのデフォルトリストに追加されます(これは、たとえばsys.pathによって取得できます。以下を参照してください)。 PYTHONPATHがすでに設定されている可能性を考慮して、必要なディレクトリを追加するだけです。

    export PYTHONPATH=$PYTHONPATH:"/home/username/lib/python2.6/dist-packages"
    

    PYTHONPATH変数を取得してから、sys.pathを再度確認すると、次のようになります。
    追加されたパスを参照してください。パスが入っている位置に注意してください
    PYTHONPATHが既存のパスに追加され、によって規定されていないようです
    実装。

  4. ユーザーごとにモジュール検索パスを変更します。

    通常の方法は、ユーザーのbashrcのPYTHONPATH、つまり~/.bashrcを変更することです。繰り返しになりますが、ログインシェルとインタラクティブシェルの両方から供給されていることを確認してください。

  5. スクリプトごとにモジュール検索パスを変更します。これは、sys.pathに追加することによって行われます。

    import sys
    sys.path.append(some_additional_path)
    

    これは、これをインポートしているスクリプトでのみ機能します。これは、私の知る限り、通常、ホームディレクトリのどこかからなど、標準以外の場所にモジュールをインポートするときに使用されます。

Pythonの検索パスの変更 に関するGregWardも参照してください。これには、利用可能な代替案についての良い議論があります。

6
Faheem Mitha

使用する - sys.path

import sys
sys.path.append("/home/me/mypy")

site モジュールのドキュメントも確認できます。このドキュメントでは、サイト固有のパスの計算方法について説明しています。

3
zarkdav