Pythonモジュールのソースの場所を見つけるにはどうすればよいですか?


481

特定のPythonモジュールのソースファイルがインストールされている場所を知るにはどうすればよいですか?Windowsでの方法とLinuxでの方法は異なりますか?

datetime特にモジュールのソースを探していますが、より一般的な答えにも興味があります。

回答:


375

純粋なpythonモジュールの場合は、を見てソースを見つけることができますthemodule.__file__。ただし、datetimeモジュールはCで記述されているdatetime.__file__ため、.soファイルを指します(datetime.__file__ Windows)、ソースを表示できません。

Pythonソースのtarballをダウンロードして解凍すると、モジュールのコードはModulesサブディレクトリにあります。

たとえば、Python 2.6の日時コードを見つけたい場合は、

Python-2.6/Modules/datetimemodule.c

最新のMercurialバージョンは、https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.cのWebでも見つけることができ ます。


LinuxとMac OS Xでdatetime .__ file__が.soを指していることを示すように回答を編集した場合(Windowsではdatetimeモジュールオブジェクトにファイル属性がない)、回答を受け入れます。
ダリルスピッツァー

実際、Windowsでは(少なくとも、私が使用しているバージョンでは)、datetimeにはファイル属性がありません。
ダリルスピッツァー

221

python -vコマンドラインから実行すると、何がどこからインポートされているかがわかります。これはWindowsとMac OS Xで動作します。

C:\>python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:\Python24\lib\site.pyc has bad mtime
import site # from C:\Python24\lib\site.py
# wrote C:\Python24\lib\site.pyc
# C:\Python24\lib\os.pyc has bad mtime
import os # from C:\Python24\lib\os.py
# wrote C:\Python24\lib\os.pyc
import nt # builtin
# C:\Python24\lib\ntpath.pyc has bad mtime
...

私のインストールでこれらの悪いmtimeが何であるかわかりません!


8
涼しい!インタラクティブモードで開いた後で、独自の特定のインポートステートメントを入力して、特定のlibのソースを確認することもできます。
蠍座

3
built-inモジュールはどこにありますか?
loretoparisi

120

この答えは4年遅れであると思いますが、既存の答えは誤解を招く人々です。

これを行う正しい方法は、決して__file__、またはsys.path2.1を超えて下位互換性が必要な場合を除いて、自分自身を探索して検索することなどではありません。

これはinspectモジュールです(特に、getfileまたは)getsourcefile

ファイルにマッピング.pycするためのルール(CPython 2.xについては文書化されていますが、他の実装や3.xについてはまったく文書化されていません)を学習して実装する場合を除き.pyます。.zipアーカイブ、卵、およびモジュールパッケージの処理。サポートしていない.so/ .pydファイルへのパスを取得するためのさまざまな方法を試す__file__; Jython / IronPython / PyPyの機能を理解する。など。その場合、それのために行きます。

一方、2.0以降のすべてのPythonバージョンのソースはオンラインで入手できますhttp://hg.python.org/cpython/file/X.Y/(例:2.7または3.3)。だから、あなたが発見したら、それがinspect.getfile(datetime)ある.so.pydのようなファイルを/usr/local/lib/python2.7/lib-dynload/datetime.so使用すると、モジュールのディレクトリ内のそれを見ることができます。厳密に言えば、どのファイルがどのモジュールを定義しているかを確認する方法はありませんが、それらのほとんどすべてがfoo.cまたはfoomodule.cであるので、datetimemodule.cが目的のものであることを推測するのは難しくありません。


3
なぜ__file__非組み込みには適用されないのですか?(特にmeta_pathを知らなくても)sys.pathのクロールが苦痛になる可能性があることは理解していますが、__file__定義とバイナリの間の名前空間に関する懸念はありますか?

1
これをdatetimeの2.7.8で行い、getfileとgetsourcefileの両方に対してTypeErrorを取得します。個人的に...私は、Pythonの複数のバージョンがインストールされていて、今、私は、それが実行している特定のインタプリタのバージョンで指摘されるべきものでは指摘していない知っているので、私は、それが指さだWHICH datetimemodule.cのバージョン知っている必要があります
mmitchell

1
@mmitchell:inspect.getfile(datetime)からTypeErrorを受け取っている場合、datetimeが実際にはモジュールであり、同じ名前に割り当てられたものではないと想定すると、カスタムビルドを作成したことを意味しますロード可能モジュールにする代わりに、インタプリタに日時を静的にリンクします。しかし、私が考えていない他の理由があるかもしれません。あなたは新しい質問をし、これを再現するためにより多くの情報を与える必要があります。
abarnert 2015

@mmitchell:一方、datetimemodule.cを指しているのではなく、datetimemodule.cのどのバージョンを指しているのかを知る方法はありません。Cファイルからビルドされたコンパイル済みモジュールを指しているためです。Cファイルがシステム上に存在しないか、コンパイルしてから編集されている可能性があります。
abarnert 2015

@tristan:私はあなたが何を求めているのか理解しているのかわかりませんが、多分これはそれに答えるでしょう:いつでも__file__機能し、inspect.getfile機能します。使用するかどうかを推測する__file__だけで、inspectモジュールを使用するよりも良い状況はありません。
abarnert 2015

67

sys.pathリストには、実行時にモジュールを検索するディレクトリのリストが含まれています。

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]

10
python -c 'import sys; print "\n".join(sys.path)'インタラクティブなpythonにドロップする必要なく、それを表示できます。
ジョーブロック

6
Python 3:python -c 'import sys; print("\n".join(sys.path))'
arudzinska 2018

61

pipを使用してモジュールをインストールしている場合pip show $moduleは、場所のみが返されます。


10
$module文字通り何を入力するかではなく、プレースホルダー変数として意図されたと思います。たとえば、m=numpy; pip show $m...などm
michael

これは、尋ねられた質問に対する最も正確な回答としてマークする必要があります。
Rahul Goyal

37

標準ライブラリからimp.find_moduleを試してください

>>> import imp
>>> imp.find_module('fontTools')
(None, 'C:\\Python27\\lib\\site-packages\\FontTools\\fontTools', ('', '', 5))
>>> imp.find_module('datetime')
(None, 'datetime', ('', '', 6))

1
これは素晴らしいです。I apt-get removeD」DataDogとまだそれをインポートすることができます。これは、他の解決策が役に立たなかったときに、ファイルがどこにあるかを見つけるのに役立ちました(そのため、ファイルを削除することができました)。
sg

python3.xの場合、impパッケージは非推奨になり(バージョン3.4以降)、importlib(3.1以降)docs.python.org/3.6/library/imp.html
マイケル・

次に、この方法でpython3を使用する必要があります。 import importlibその後importlib.util.find_spec('fontTools')
メドハット

33

datetime は組み込みモジュールであるため、(Python)ソースファイルはありません。

.py(または.pyc)ファイルからのモジュールの場合、を使用できますmymodule.__file__

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'

12

Pythonインタープリターでは、特定のモジュールをインポートして、help(module)と入力できます。名前、ファイル、モジュールドキュメント、説明などの詳細が表示されます。

例:

import os

help(os)


Help on module os:

NAME

os - OS routines for Mac, NT, or Posix depending on what system we're on.

FILE

/usr/lib/python2.6/os.py

MODULE DOCS

http://docs.python.org/library/os

DESCRIPTION

This exports:

- all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.

- os.path is one of the modules posixpath, or ntpath

- os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'


これは私にモジュールファイルへのフルパスを与えましたが、他の回答は相対パスしか与えませんでした。ありがとう。
Jerther 2017年

12

シェルのエイリアスに適したモジュールのファイル名を取得するためのワンライナーは次のとおりです。

echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - 

エイリアスとして設定:

alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - "

使用するには:

$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc


9

この気のきいた "cdp"コマンドをチェックして、示されたPythonモジュールのソースを含むディレクトリにcdします。

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}

ありがとう!それはまさに私が探していたものです。奇妙なことに、Pythonディストリビューションにそのようなものを含めないでしょう。
アントニーハッチキンス

9

Windowsでは、下に示すようにpythonモジュールの場所を見つけることができます:ie rest_frameworkモジュールを見つける ここに画像の説明を入力してください


4

Ubuntu 12.04では、たとえばpython2のnumpyパッケージは次の場所にあります。

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

もちろん、これは一般的な答えではありません


0

すべてのPythonモジュールがPythonで作成されているわけではありません。Datetimeはそうではないものの1つであり、(Linuxでは)datetime.soです。

ソースコードを入手するには、Python標準ライブラリにソースコードをダウンロードする必要があります。


2
ダリル:「Datetimeはたまたまpythonで書かれていないpythonモジュールの1つだ」とJimの答えを誤って解析しました。
マシュートレバー

0

GUIソリューションを好む人のために:Spyder(Anacondaインストールの一部)などのGUIを使用している場合は、モジュール名(「csvのインポート」の「csv」など)を右クリックして、「go to definition "-これによりファイルが開きますが、上部には正確なファイルの場所(" C:.... csv.py ")も表示されます


0

インタープリターを使用していない場合は、以下のコードを実行できます。

import site
print (site.getsitepackages())

出力:

['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

配列の2番目の要素は、パッケージの場所になります。この場合:

C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages

0

端末から複数のpythonバージョンがインストールされているかどうかを確認する別の方法。

-MBP:〜python3 -m pip show pyperclip

場所:/ライブラリ/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-

MBP:〜python -m pip show pyperclip

場所:/Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages


-1

SpyderのようなIDEでは、モジュールをインポートしてから、モジュールを個別に実行します。 ここに画像の説明を入力してください


str()モデルのインポートと印刷は、スクリーンショットで行っていることのより正確な説明です。さらに、IDEはこのソリューションには関係がないようです
mousetail

2
StackOverflowへようこそ!画像を使用してコードを投稿しないでください。画像は読みにくく、検索できず、一部の読者には表示できません。代わりに、関連するコードを回答の本文に直接含めてください。
ブライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.