0
>>> import distutils.sysconfig
>>> distutils.sysconfig.get_python_lib()
/usr/lib/python2.7/dist-packages

しかし、私はこのパスが欲しい: /usr/local/lib/python2.7/dist-packages. sysconfigこのモジュールは python2.7 でのみサポートされており、そのモジュールへの PyPI ダウンロードがないため、使用できません。そのため、要件ファイルを使用して、他のユーザーが pip でダウンロードできるようにすることさえできませんでした。

では、Linux および OS X オペレーティング システムで動作するインストール済みパッケージへのパスを取得する方法はありますか? (またはすべての Unix ベースの os でさえも)

4

2 に答える 2

1

関数の特定の機能が必要な場合、そのモジュールget_python_libソースはかなり単純で、Python2.7固有の構文をまったく使用しません。あなたは単にそれをバックポートすることができます。

基本的に、次の定義と2つの関数が必要です。

import os
import sys
from distutils.errors import DistutilsPlatformError


PREFIX = os.path.normpath(sys.prefix)
EXEC_PREFIX = os.path.normpath(sys.exec_prefix)


def get_python_version():
    """Return a string containing the major and minor Python version,
    leaving off the patchlevel.  Sample return values could be '1.5'
    or '2.2'.
    """
    return sys.version[:3]

def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
    """Return the directory containing the Python library (standard or
    site additions).

    If 'plat_specific' is true, return the directory containing
    platform-specific modules, i.e. any module from a non-pure-Python
    module distribution; otherwise, return the platform-shared library
    directory.  If 'standard_lib' is true, return the directory
    containing standard Python library modules; otherwise, return the
    directory for site-specific modules.

    If 'prefix' is supplied, use it instead of sys.prefix or
    sys.exec_prefix -- i.e., ignore 'plat_specific'.
    """
    if prefix is None:
        prefix = plat_specific and EXEC_PREFIX or PREFIX

    if os.name == "posix":
        libpython = os.path.join(prefix,
                                 "lib", "python" + get_python_version())
        if standard_lib:
            return libpython
        else:
            return os.path.join(libpython, "site-packages")

    elif os.name == "nt":
        if standard_lib:
            return os.path.join(prefix, "Lib")
        else:
            if get_python_version() < "2.2":
                return prefix
            else:
                return os.path.join(prefix, "Lib", "site-packages")

    elif os.name == "os2":
        if standard_lib:
            return os.path.join(prefix, "Lib")
        else:
            return os.path.join(prefix, "Lib", "site-packages")

    else:
        raise DistutilsPlatformError(
            "I don't know where Python installs its library "
            "on platform '%s'" % os.name)

もちろん、長い関数をプラットフォームに必要なブランチだけに減らすことができます。OS Xの場合:

def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
    if prefix is None:
        prefix = plat_specific and EXEC_PREFIX or PREFIX

    libpython = os.path.join(prefix,
                             "lib", "python" + get_python_version())
    if standard_lib:
        return libpython
    else:
        return os.path.join(libpython, "site-packages")

Debianはこの関数にパッチを適用してデフォルトの場合に返すことに注意してくださいdist-packages。これは、OSXには適用されません。

于 2012-09-01T12:02:37.403 に答える
0

パスが必要な場合は、sys.path を使用できます。

import sys
print sys.path

これを構成したい場合は、環境変数 PYTHON_PATH を設定できます。

export PYTHON_PATH=/usr/local/lib/python2.7/dist-packages

PYTHON_PATH を変更せずに動的に追加したい場合は、Python で拡張することもできます。

import sys
sys.path.extend(['/usr/local/lib/python2.7/dist-packages'])
于 2012-09-01T11:09:07.360 に答える