web-dev-qa-db-ja.com

Pythonのsite-packagesディレクトリの場所を見つけるにはどうすればよいですか

Site-packagesディレクトリの場所を見つけるにはどうすればいいですか?

784
Daryl Spitzer

サイトパッケージディレクトリには、globalper userの2種類があります。

  1. グローバル site-packages( " dist-packages ")ディレクトリは、実行時にsys.pathに表示されます。

    python -m site
    

    より簡潔なリストを得るには、Pythonコードの siteモジュール からgetsitepackagesを実行してください。

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

    注: virtualenvs getsitepackagesが利用できない の場合、上のsys.pathはvirtualenvのsite-packagesディレクトリを正しくリストします。

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

    python -m site --user-site
    

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

    ヒント:pip list --userまたはpip freeze --userを実行すると、インストールされているすべてのuser site-packagesの一覧が表示されます。


実用的なヒント

  • <package>.__path__を使用すると、特定のパッケージの場所を特定できます。( details

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

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

    $ 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
    
295
Peterino
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(またはsite.getsitepackages()[0]の付いた最初の項目のみ)

633
eudoxos

"How to Install 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())
305
Daryl Spitzer

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を使用していない場合は、おそらく最初のコードボックスを端末に安全にコピーペーストできます。

98
David Hollander

これは私のために働いたものです:

python -m site --user-site
65
Ramashri

パッケージ '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用です。しかし、私はそれが一般的にもうまくいくはずだと思います。

23
Sumod

他の人が指摘したように、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はインストールのためにはたらくでしょう、そしてあなたのプログラムはあなたのpythonpathが完全にユーザローカルであるvirtualenvで走っているかもしれないので、それは直接システムsite-packagesの使用も想定するべきではありません。

21
Charles Duffy

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']
16
fnatic_shank

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

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や他のものについて私に聞かないでください、それはeasy_installがデフォルトで使うのとまったく同じdirなので、おそらくeasy_installが動くところならどこでも(つまり、どこでも、Macでも)正しいでしょう。楽しむ。注意:オリジナルのコードには多くの誓いがあります。

13
cheater

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

残念ながら、私はこれ以上の解決策はありません。 Pythonはsite-packagesディレクトリを追跡するのではなく、その中のパッケージだけを追跡します。

11
user147100

これは私のために働きます。それはあなたに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']
10
just_an_old_guy

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

8
Armin Ronacher

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

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

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

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
8
Pyramid Newbie
from distutils.sysconfig import get_python_lib
print get_python_lib()
7
Florian Bösch

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

場所を取得するには:

pip show <package_name>| grep Location
5
Sourabh Potnis

最新のstdlibの方法は sysconfig モジュールを使うことで、これはバージョン2.7と3.2+で利用可能です。 Pythonは現在eightpaths( docs )を使用しています。

  • stdlib:プラットフォーム固有ではない標準Pythonライブラリファイルを含むディレクトリ。
  • platstdlib:プラットフォーム固有の標準Pythonライブラリファイルを含むディレクトリ。
  • platlib:サイト固有、プラットフォーム固有のファイル用のディレクトリ。
  • purelib:サイト固有の、プラットフォーム固有ではないファイル用のディレクトリー。
  • include:プラットフォーム固有ではないヘッダーファイル用のディレクトリ。
  • platinclude:プラットフォーム固有のヘッダファイル用のディレクトリ。
  • scripts:スクリプトファイル用のディレクトリ。
  • data:データファイル用のディレクトリ。

ほとんどの場合、この質問を見つけたユーザーは '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

注:sysconfigsource )は、他のいくつかの回答で言及されているdistutils.sysconfigサブモジュール( source )と混同しないようにしてください。上記のget_paths関数が欠けています。

4
wim

古い質問への回答しかし、これには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
2
Sahil Agarwal

私が取り組んでいたプロジェクトでは、少し違ったことをしなければなりませんでした: relative site-packagesディレクトリをベースインストールプレフィックスからの相対パスで探します。 site-packagesフォルダーが/usr/lib/python2.7/site-packagesにある場合は、/lib/python2.7/site-packages部分が欲しいと思いました。実際、私はsite-packages/usr/lib64にあるシステムに遭遇しました、そして、受け入れられた答えはそれらのシステムでうまくいきませんでした。

詐欺師の答えと同様に、私の解決策は実際にはsetup.pyの中を通り過ぎるパスを見つけるために、Distutilsの奥深くを覗いています。私は誰もこれを二度と考え出す必要がないようにするのを理解するのはとても苦痛でした。

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のようなものが表示されるはずです。

0

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

import sys
print('\n'.join(sys.path))
0
filtfilt

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

Python 2

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

Python 3

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