回答:
グローバルとユーザーごとの 2種類のサイトパッケージディレクトリがあります。
実行すると、グローバルサイトパッケージ( " 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"])'
ユーザーごとの site-packagesディレクトリ(PEP 370)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
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(Python 2と3の両方で動作します)。
python -c "import site; print(site.getsitepackages()[0])"
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(またはの最初のアイテムのみsite.getsitepackages()[0]
)
hasattr(sys,'real_prefix')
し、その後から発見的にサイトのパッケージを決定[p for p in sys.path if p.endswith('site-packages')][-1]
(プラスワンが行う前に見つかっがあるかどうか確認してください[-1]
。
以下のソリューション:
...このワンライナーです:
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のインストールだけでなく、他にも便利です)
cdsitepackages
して、環境のsite-packagesディレクトリに直接変更できます。
/usr/lib/python3/dist-packages
代わりに/usr/lib/python3.5/dist-packages
。
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を使用しない場合は、最初のコードボックスを端末にコピーして安全に貼り付けることができます。
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
を
dist-packages
(L)Ubuntuの2つの違いを理解するための明確な説明。
これは私のために働いたものです:
python -m site --user-site
~/.local/lib/python2.7/site-packages
)。
virtualenv
、パッケージが存在しないと不平を言います。カスタムの場所にインストールされているパッケージを呼び出すにはどうすればよいですか?
'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用です。しかし、それは一般的にも機能するはずだと思います。
django.__file__
ではなく、これに使用し__path__
ます。そして、いいえ、これがサイトパッケージと関係があることを保証するものではありませんが、djangoなどの場合、pipがインストールされている可能性が高いため、急いでいるときに使用でき、その他の目的(たとえば、ファイルシステムからデフォルトの構成ファイルを読み取る)。
foo.bar
パッケージ:python -c "import foo.bar as _; print(_.__path__[0])"
他の人が指摘したように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で実行されている可能性があるため、システムサイトパッケージの直接使用を想定しないでください。
python2
virtualenvの有無にかかわらず、osxおよびubuntuで確実に動作しますが、まったく動作しませんpython3
。
python3
。
最新のstdlibの方法はsysconfig
、バージョン2.7および3.2+で利用可能なモジュールを使用することです。
注:sysconfig
(source)は、ここで他のいくつかの回答で言及されている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
platlib
たとえば、ローカル接頭辞を取得する方法はあり/usr/local/lib/python3.6/site-packages
ますか?伝統的に、ローカルにインストールされたものはに入るはず/usr/local
です。
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']
site.getsitepackages()
、システムインストール、つまりdist-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や他のdistsについて質問しないでください。ただし、easy_installがデフォルトで使用するディレクトリとまったく同じであるため、easy_installが動作するすべての場所(Macでさえも)で正しいと思われます。楽しんで。注:元のコードには多くの不名誉が含まれています。
easy_install
、使用できない場合は適切に失敗しません。これは不適切です:)
補足:(この記事で推奨されているように)distutils.sysconfig.get_python_lib()
サイトパッケージディレクトリが複数ある場合、提案されたソリューション()は機能しません。メインのサイトパッケージディレクトリのみが返されます。
悲しいかな、私にも良い解決策はありません。Pythonはsite-packagesディレクトリを追跡しているようには見えず、その中のパッケージを追跡しているだけです。
get_python_lib()
virtualenv内から実行したときに、virtualenvのサイトパッケージではなく、virtualenvの作成に使用される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']
これは「ローテク」の性質により、仮想環境に出入りするすべてのディストリビューションで機能するはずです。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'
get_python_lib
すでに述べた関数への追加の注記:一部のプラットフォームでは、プラットフォーム固有のモジュールに異なるディレクトリが使用されます(例:コンパイルが必要なモジュール)。plat_specific=True
関数に渡すと、プラットフォーム固有のパッケージのサイトパッケージが取得されます。
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip showはパッケージに関するすべての詳細を提供します:https : //pip.pypa.io/en/stable/reference/pip_show/ [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 show <package name>