Python サイト パッケージ ディレクトリの場所を見つけるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/122327

  •  02-07-2019
  •  | 
  •  

質問

サイトパッケージディレクトリの場所を見つけるにはどうすればよいですか?

役に立ちましたか?

解決

サイト パッケージ ディレクトリには 2 種類あります。 グローバル そして ユーザーごとの.

  1. グローバル サイトパッケージ ("dist-パッケージ") ディレクトリは次のとおりです。 sys.path 実行するとき:

    python -m site
    

    より簡潔なリストを実行するには getsitepackages から サイトモジュール Pythonコードでは:

    python -c "import site; print(site.getsitepackages())"
    

    注記: 仮想環境を使用する getsitepackages は利用できません, sys.path ただし、上記の方法では、virtualenv の site-packages ディレクトリが正しくリストされます。

  2. ユーザーごとの サイトパッケージディレクトリ (PEP370) は、Python がローカル パッケージをインストールする場所です。

    python -m site --user-site
    

    これが存在しないディレクトリを指している場合は、Python の終了ステータスを確認してください。 python -m site --help 説明用に。

    ヒント: ランニング pip list --user または pip freeze --user インストールされているすべてのリストが表示されます ユーザーごとの サイトパッケージ。


実践的なヒント

  • <package>.__path__ 特定のパッケージの場所を特定できます。(詳細)

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • <module>.__file__ 特定のモジュールの場所を特定できます。(違い)

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • 走る pip show <package> Debian スタイルのパッケージ情報を表示するには:

    $ pip show pytest
    Name: pytest
    Version: 3.8.2
    Summary: pytest: simple powerful testing with Python
    Home-page: https://docs.pytest.org/en/latest/
    Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others
    Author-email: None
    License: MIT license
    Location: /home/peter/.local/lib/python3.4/site-packages
    Requires: more-itertools, atomicwrites, setuptools, attrs, pathlib2, six, py, pluggy
    

他のヒント

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(または最初の項目だけ site.getsitepackages()[0])

から 「Django のインストール方法」ドキュメント (ただし、これは Django のインストール以外にも役立ちます) - シェルから次のコマンドを実行します。

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

(ワンライナーとして使用するのではなく) 読みやすいようにフォーマットされており、次のようになります。

from distutils.sysconfig import get_python_lib
print(get_python_lib())

Ubuntuの場合,

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

...それは正しくありません。

それはあなたに次のことを示します /usr/lib/pythonX.X/dist-packages

このフォルダーには、プログラムを実行するためにオペレーティング システムが自動的にインストールしたパッケージのみが含まれます。

ubuntu 上, 、setup_tools\easy_install\pip 経由でインストールされたパッケージを含む site-packages フォルダーは次の場所にあります。 /usr/local/lib/pythonX.X/dist-packages

使用例がインストールまたはソース コードの読み取りに関連する場合は、2 番目のフォルダーの方がおそらく便利です。

Ubuntu を使用していない場合は、最初のコード ボックスをコピーしてターミナルに貼り付けても問題ありません。

これが私にとってうまくいったことです:

python -m site --user-site

パッケージ「django」をインストールしたとします。それをインポートし、「dir(django)」と入力します。そのモジュールのすべての関数と属性が表示されます。Python インタープリターを入力します -

>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']

mercurial をインストールしている場合も同じことができます。

これはSnow Leopard用です。しかし、一般的にも同様に機能するはずだと思います。

他の人も指摘しているように、 distutils.sysconfig 関連する設定があります:

import distutils.sysconfig
print distutils.sysconfig.get_python_lib()

...デフォルトですが site.py 以下に言い換えると、もう少し大雑把なことを行います。

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(また追加します ${sys.prefix}/lib/site-python 両方のパスを追加します sys.exec_prefix 定数が異なる場合も同様です)。

そうは言っても、その文脈は何ですか?あなたのことをいじるべきではありません site-packages 直接;setuptools/distutils はインストールに機能し、プログラムは Python パスが完全にユーザーローカルである virtualenv で実行されている可能性があるため、システム サイト パッケージの直接使用を想定すべきではありません。

Debian ベースのシステムに Python をインストールするとインストールされるネイティブ システム パッケージは、次の場所にあります。

/usr/lib/python2.7/dist-packages/

OSXの場合 - /Library/Python/2.7/site-packages

この小さなコードを使用して:

from distutils.sysconfig import get_python_lib
print get_python_lib()

ただし、経由でインストールされたパッケージのリストは、 pip で見つけることができます:

/usr/local/bin/

または、単純に次のコマンドを記述して、Python パッケージが存在するすべてのパスをリストすることもできます。

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

注記:場所は、OSX など、OS によって異なる場合があります。

>>> import site; site.getsitepackages()
['/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/site-python', '/Library/Python/2.7/site-packages']

すべての答え (または:同じ答えを何度も繰り返す)は不適切です。あなたがやりたいことはこれです:

from setuptools.command.easy_install import easy_install
class easy_install_default(easy_install):
  """ class easy_install had problems with the fist parameter not being
      an instance of Distribution, even though it was. This is due to
      some import-related mess.
      """

  def __init__(self):
    from distutils.dist import Distribution
    dist = Distribution()
    self.distribution = dist
    self.initialize_options()
    self._dry_run = None
    self.verbose = dist.verbose
    self.force = None
    self.help = 0
    self.finalized = 0

e = easy_install_default()
import distutils.errors
try:
  e.finalize_options()
except distutils.errors.DistutilsError:
  pass

print e.install_dir

最後の行にはインストールディレクトリが表示されます。Ubuntu では動作しますが、上記のものは動作しません。Windows やその他の dist については聞かないでください。しかし、これは easy_install がデフォルトで使用するディレクトリとまったく同じなので、easy_install が動作する場所であればどこでも (つまり、どこでも、Mac でも) 正しいと思われます。楽しむ。注記:元のコードには多くの悪口が含まれています。

補足:提案された解決策 (distutils.sysconfig.get_python_lib()) は、複数の site-packages ディレクトリがある場合には機能しません ( この記事で推奨されている)。メインの site-packages ディレクトリのみが返されます。

残念ながら、これ以上の解決策はありません。Python はサイト パッケージ ディレクトリを追跡せず、そのディレクトリ内のパッケージだけを追跡しているようです。

これは私にとってはうまくいきます。dist-packages フォルダーと site-packages フォルダーの両方を取得します。フォルダーがPythonのパス上にない場合、とにかくあまりうまくいきません。

import sys; 
print [f for f in sys.path if f.endswith('packages')]

出力 (Ubuntu インストール):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']

への追加メモ get_python_lib すでに述べた関数:一部のプラットフォームでは、プラットフォーム固有のモジュールに異なるディレクトリが使用されます (例:コンパイルが必要なモジュール)。合格したら plat_specific=True この関数を使用すると、プラットフォーム固有のパッケージのサイト パッケージを取得できます。

これは「ローテク」な性質のため、仮想環境内外のすべてのディストリビューションで機能するはずです。OS モジュールは常に「site-packages」の親ディレクトリに存在します。

import os; print(os.path.dirname(os.__file__) + '/site-packages')

dir を site-packages ディレクトリに変更するには、次のエイリアスを使用します (*nix システムの場合)。

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
from distutils.sysconfig import get_python_lib
print get_python_lib()

最新の stdlib の方法では、 sysconfig モジュール、バージョン 2.7 および 3.2+ で利用可能。Pythonは現在使用しています パス (ドキュメント):

  • 標準ライブラリ:プラットフォーム固有ではない標準の Python ライブラリ ファイルを含むディレクトリ。
  • プラットstdlib:プラットフォーム固有の標準 Python ライブラリ ファイルを含むディレクトリ。
  • プラットリブ:サイト固有、プラットフォーム固有のファイルのディレクトリ。
  • ピュアリブ:サイト固有の、プラットフォーム固有ではないファイルのディレクトリ。
  • 含む:プラットフォーム固有ではないヘッダー ファイルのディレクトリ。
  • プラットホームを含む:プラットフォーム固有のヘッダー ファイルのディレクトリ。
  • スクリプト:スクリプトファイルのディレクトリ。
  • データ:データファイル用のディレクトリ。

ほとんどの場合、この質問を見つけたユーザーは、「purelib」パス ( ある場合, 、「platlib」にも興味があるかもしれません)。現在受け入れられている回答とは異なり、このメソッドは、virtualenv がアクティブ化されているかどうかに応じて誤動作するべきではありません。

システム レベル (これは Mac OS 上の Python 3.7.0):

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'

venv を使用すると、次のような結果が得られます

>>> import sysconfig                                                                                                                                                
>>> sysconfig.get_paths()['purelib']                                                                                                                                
'/private/tmp/.venv/lib/python3.7/site-packages'

これらの詳細を表示するシェル スクリプトも使用できます。これは、次のコマンドを実行して呼び出すことができます。 sysconfig モジュールとして:

python -m sysconfig

注記: sysconfig (ソース) と混同しないでください。 distutils.sysconfig サブモジュール (ソース)ここの他のいくつかの回答で言及されています。これはまったく異なるモジュールであり、 get_paths 上で説明した関数。

pip show は、パッケージに関するすべての詳細を表示します。https://pip.pypa.io/en/stable/reference/pip_show/ [ピップショー][1]

場所を取得するには:

pip show <package_name>| grep Location

古い質問への回答。ただし、これには ipython を使用してください。

pip install ipython
ipython 
import imaplib
imaplib?

これにより、imaplib パッケージに関する次の出力が得られます。

Type:        module
String form: <module 'imaplib' from '/usr/lib/python2.7/imaplib.py'>
File:        /usr/lib/python2.7/imaplib.py
Docstring:  
IMAP4 client.

Based on RFC 2060.

Public class:           IMAP4
Public variable:        Debug
Public functions:       Internaldate2tuple
                        Int2AP
                        ParseFlags
                        Time2Internaldate

私が取り組んでいたプロジェクトでは、少し違うことをする必要がありました。を見つける 相対的 ベース インストール プレフィックスに相対的な site-packages ディレクトリ。site-packages フォルダーが次の場所にあった場合 /usr/lib/python2.7/site-packages, 、私が欲しかったのは、 /lib/python2.7/site-packages 一部。実際、私は次のようなシステムに遭遇したことがあります。 site-packages にいた /usr/lib64, 、受け入れられた回答はそれらのシステムでは機能しませんでした。

詐欺師の答えと同様に、私のソリューションはDistutilsの内部を深く覗いて、実際に内部で渡されるパスを見つけます setup.py. 。それを理解するのはとても大変だったので、もう誰にもこれを理解してほしくないのです。

import sys
import os
from distutils.command.install import INSTALL_SCHEMES

if os.name == 'nt':
    scheme_key = 'nt'
else:
    scheme_key = 'unix_prefix'

print(INSTALL_SCHEMES[scheme_key]['purelib'].replace('$py_version_short', (str.split(sys.version))[0][0:3]).replace('$base', ''))

次のようなものが出力されるはずです /Lib/site-packages または /lib/python3.6/site-packages.

pip のインストール場所を確認するには、このコマンドを試してください。

パイソン2

pip show six | grep "Location:" | cut -d " " -f2

パイソン 3

pip3 show six | grep "Location:" | cut -d " " -f2

すでに追加されている場合は、 PYTHONPATH 次のようなこともできます

import sys
print('\n'.join(sys.path))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top