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


回答:


532

グローバルユーザーごとの 2種類のサイトパッケージディレクトリがあります

  1. 実行すると、グローバルサイトパッケージ( " dist-packages ")ディレクトリがリストされsys.pathます。

    python -m site

    Pythonコードのサイトモジュールgetsitepackagesから実行するより簡潔なリストについては、次のようにします。

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

    注: virtualenvsを使用するとgetsitepackagesは使用できませんsys.path。ただし、上記の場合、virtualenvのサイトパッケージディレクトリが正しくリストされます。Python 3では、代わりにsysconfigモジュールを使用できます。

    python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
  2. ユーザーごとの site-packagesディレクトリ(PEP 370)Pythonがあなたの地元のパッケージをインストールする場所です。

    python -m site --user-site

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

    ヒント:実行するpip list --userpip 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

17
virtualenvにサイトパッケージディレクトリがあります。を使用して、virtualenv内外のサイト固有モジュールのディレクトリを取得できますpython -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(Python 2と3の両方で動作します)。
jfs '13

4
いいね。そして最初のものを得るために:python -c "import site; print(site.getsitepackages()[0])"
ブレントファウスト

2
これは、Pythonの使用に関する基本的なチュートリアルにあるはずです。私は何年もパイソンをやっていて、サイトモジュールについて知りませんでした。頭痛の種をたくさん節約できただろう...
salotz

1
Pythonの公式チュートリアルへの変更を提案しました。詳細についてはPR#16974を参照してください。提案@salotzに感謝します。
Peterino、

1
私は、stackoverflow.com / a / 52638888/1365918がこの質問に対する最良の答えであると思います。
kapad

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

(またはの最初のアイテムのみsite.getsitepackages()[0]


17
これは良いことですが、残念ながらこの関数はpython2.7からしか利用できません。したがって、python2.7以降を使用しているがpython 2.6以下では機能しない場合の良い解決策
Dan Niero

15
python -c "インポートサイト; print(site.getsitepackages())"
Lars Schneider

29
私はAttributeErrorを取得します。virtualenv(python 2.7.8)で使用すると、 'module'オブジェクトに属性 'getsitepackages'がありませんが、以下のdistutilsソリューションは機能します。
radtek、2014

8
@radtek:venvのために、私は経由venvを検出hasattr(sys,'real_prefix')し、その後から発見的にサイトのパッケージを決定[p for p in sys.path if p.endswith('site-packages')][-1](プラスワンが行う前に見つかっがあるかどうか確認してください[-1]
eudoxos

4
@radtekサイトモジュールがvirtualenv github.com/pypa/virtualenv/issues/355で
Guillem Cucurull

319

以下のソリューション:

  • virtualenvの外- グローバルなサイトパッケージのパスを提供します。
  • virtualenvを含む-virtualenvのサイトパッケージを提供する

...このワンライナーです:

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

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

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


ソース:「Djangoのインストール方法」ドキュメントの非常に古いバージョン(これはDjangoのインストールだけでなく、他にも便利です)


1
virtualenvはサイトパッケージを見つける方法を提供していますか?
ダリルスピッツァー

10
コマンドが含まれているvirtualenvwrapperを使用cdsitepackagesして、環境のsite-packagesディレクトリに直接変更できます。
john2x

6
@PiotrDobrogost:Linux上のvirtualenvでPython 2.7を使用して動作します
RichVel

2
最初のコメントはもう適用されません:これは、virtualenvの外側と内側の両方で正しい場所を示しました。
astrojuanlu 2016

2
Linuxのbashを使用してWindows 10上で私のために動作しませんでした、それは返す/usr/lib/python3/dist-packages代わりに/usr/lib/python3.5/dist-packages
Delgan

99

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を使用しない場合は、最初のコードボックスを端末にコピーして安全に貼り付けることができます。


3
質問者が特定のパッケージの場所の後にある場合module.__file__は、より良い方法です。彼らが物をインストールしようとしているなら…ただツールを使ってください。
東武

'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()Ubuntuでは(リストの後に続き /usr/local/...ますが)。あなただけに何かを得る/usr/localを経由してsudo pip、あなたは使用しないでくださいsudo pip、あなたがあなた自身のディストリビューションを作ることを決めない限り、Ubuntuの上:あなたが使用している場合sudo pip、必ず、現在のすべての依存ことを確認する責任があり、将来の Pythonモジュールが経由でインストールsudo aptまたはsudo pip互換性があります。解決するために作成された問題virtualenv
jfs

dist-packages(L)Ubuntuの2つの違いを理解するための明確な説明。
Timo

69

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

python -m site --user-site

15
私にとって、これは存在しないフォルダを指します(~/.local/lib/python2.7/site-packages)。
Neil Traft、2014

1
同じように、OS X Mavericksでは、私の.localは私が見つけたいものではありませんでした。
radtek、2014

メインの/ Libraryフォルダーにあるため、何らかの理由でダイレクトフルパスが機能していませんでした
efwjames

ここにインストールされたパッケージをどのように使用しますか?私が行う場合virtualenv、パッケージが存在しないと不平を言います。カスタムの場所にインストールされているパッケージを呼び出すにはどうすればよいですか?
AbtPst

2
これは、Pythonがユーザー固有のパッケージを探す場所を示します。「存在しない」「私が見つけてほしくないもの」などのコメントは、このコンテキストでは意味がありません。
Honest Abe

28

'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用です。しかし、それは一般的にも機能するはずだと思います。


>>> import pg >>> print pg .__ path__ Traceback(most latest call last):File "<stdin>"、line 1、in <module> AttributeError: 'module' object has no attribute ' path '
Dannid

うまくいきました。ありがとう、PYDEVパスに追加するsklearnパッケージを見つける必要があります。
バーケイ

django.__file__ではなく、これに使用し__path__ます。そして、いいえ、これがサイトパッケージと関係があることを保証するものではありませんが、djangoなどの場合、pipがインストールされている可能性が高いため、急いでいるときに使用でき、その他の目的(たとえば、ファイルシステムからデフォルトの構成ファイルを読み取る)。
JLペイレ

これと他の回答に基づいて、あなたへのパスを取得するには、コマンドラインから1つのラインでこれを行うことができますfoo.barパッケージ:python -c "import foo.bar as _; print(_.__path__[0])"
スナーク

23

他の人が指摘したように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で実行されている可能性があるため、システムサイトパッケージの直接使用を想定しないでください。


3
python2virtualenvの有無にかかわらず、osxおよびubuntuで確実に動作しますが、まったく動作しませんpython3
ジッタ

2
2008年は少し前のことです。この回答はPython 3.0のリリースの3か月前でした。
Charles Duffy、

確かに、今日は私のコメントが役立つかもしれません。間違っている場合は修正してください。さらに、私はこの回答やその他に関しては反対票を投じませんでしたpython3
ジッタ

22

最新のstdlibの方法はsysconfig、バージョン2.7および3.2+で利用可能なモジュールを使用することです。

sysconfigsource)は、ここで他のいくつかの回答で言及されているdistutils.sysconfigサブモジュール(source)と混同しないでください。後者は完全に異なるモジュールであり、get_paths以下で説明する機能がます。

Pythonは現在8つのパスを使用しています(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

これは素晴らしい答えです。新しいsysconfigモジュールがこれを簡単にしてくれて嬉しいです。platlibたとえば、ローカル接頭辞を取得する方法はあり/usr/local/lib/python3.6/site-packagesますか?伝統的に、ローカルにインストールされたものはに入るはず/usr/localです。
eudoxos

この質問への最良の答えは簡単です!ありがとうございました。欠けているのは、インポートステートメントが検出されたときにこれらの場所がチェックされる順序だけでした。また、Pythonが読み込まれるときに、これらの場所のいずれかが事前に検索/キャッシュされていますか?それを知ることもIMOに役立つでしょう。
kapad

21

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

私の記憶が正しければ、dist-packagesはDebianに固有のものであり、派生物です。
サミュエル

1
@SamuelSantana正解です。dist-packagesはdebianベースのシステムに固有です。この場合site.getsitepackages()、システムインストール、つまりdist-packagesから起動しましたが、他のインストールではサイトパッケージが表示されます。
fnatic_shank 2018年

15

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

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や他のdistsについて質問しないでください。ただし、easy_installがデフォルトで使用するディレクトリとまったく同じであるため、easy_installが動作するすべての場所(Macでさえも)で正しいと思われます。楽しんで。注:元のコードには多くの不名誉が含まれています。


1
おかげで、これはかなり便利です。印刷用のブラケットが付いたpy3では、/ usr / local / lib / python3.4 / dist-packagesが取得されます/usr/lib/python3.4/distを取得する方法を模索しています-パッケージなので、さらにプレイする必要があります。
Stuart Axon、2015

4
外部ライブラリが必要でありeasy_install、使用できない場合は適切に失敗しません。これは不適切です:)
ジッター

1
確かに、これは完璧ではありませんが、私にとってはうまくいき、理解するのに多くの時間を費やしたので、他の誰かが私がすでに費やした時間に基づいて構築できることを願ってここに配置しました。
詐欺師、

13

補足:(この記事で推奨されているようにdistutils.sysconfig.get_python_lib()サイトパッケージディレクトリが複数ある場合、提案されたソリューション()は機能しません。メインのサイトパッケージディレクトリのみが返されます。

悲しいかな、私にも良い解決策はありません。Pythonはsite-packagesディレクトリを追跡しているようには見えず、その中のパッケージを追跡しているだけです。


1
get_python_lib()virtualenv内から実行したときに、virtualenvのサイトパッケージではなく、virtualenvの作成に使用されるPythonのサイトパッケージが表示されるのは、このためだと思います
Piotr Dobrogost

3
@Piotrそれはおそらくdistutils.sysconfigのバグでした。私はそれをテストしたところ、予想通り内部のサイトパッケージを取得しました。
東武

LinuxのvirtualenvにインストールされたPython 2.7でもテストされ、distutils.sysconfigメソッドが正常に機能して内部のPythonのサイトパッケージを取得します。
RichVel 2013年

12

これでうまくいきます。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']

2
受け入れられた回答が推奨される方法です。少しハックなので、なぜあなたの回答が優れているのかを説明する必要があります
CharlesB

ハックの何が問題になっていますか?;)インタラクティブに作業している場合は、理解が簡単で覚えやすいです。
just_an_old_guy

11

これは「ローテク」の性質により、仮想環境に出入りするすべてのディストリビューションで機能するはずです。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'

10

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




3

古い質問に答えます。ただし、これには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

1
これは、site-packagesディレクトリではなく、パッケージがインストールされているディレクトリです。これは、iPythonを使用していて、プログラムでインストールディレクトリを取得できない場合にのみ役立ちます。
danielunderwood 2016

3

このコマンドを試して、pipのインストール場所を決定する必要があります

Python 2

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

Python 3

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

1

私が取り組んでいるプロジェクトに対して少し異なることをしなければなりませんでした:ベースインストールプレフィックスに対して相対的 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ます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.