web-dev-qa-db-ja.com

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

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

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

424
Daryl Spitzer

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

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

たとえば、Python 2.6の日時コードを見つけたい場合は、次のようにします。

Python-2.6/Modules/datetimemodule.c

また、Mercurialの最新バージョンは https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c にもあります。

336
Moe

コマンドラインから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が私のインストールに何があるのか​​わからない!

204
jblocksom

私はこの答えが4年遅れていることを認識していますが、既存の答えは誤解を招く人々です。

これを行う正しい方法は決して__file__、またはsys.pathを調べて自分自身を検索することなどではありません(2.1以上の後方互換性が必要でない限り)。

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

.pyc.pyファイルにマッピングするための規則(CPython 2.xでは文書化されていますが、他の実装では文書化されていない、3.x)を習得して実装したくない場合。 .zipアーカイブ、egg、そしてモジュールパッケージを扱う。 .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ファイルであることがわかったら、それをModulesディレクトリの中で調べることができます。厳密に言うと、どのファイルがどのモジュールを定義しているのかを確認する方法はありませんが、ほとんどすべてがfoo.cまたはfoomodule.cなので、 datetimemodule.c が望んでいることを推測するのは難しくありません。

108
abarnert

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

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.Zip', '/usr/local/lib/python2.5', ... ]
58
Greg Hewgill

モジュールのインストールにpipを使用している場合は、pip show $moduleの位置が返されるだけです。

44

標準ライブラリから 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))
29
Codespaced

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

.py(または.pyc)ファイルから来るモジュールの場合、mymodule.__file__を使うことができます。

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

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'

12
Vijay

Python 3.2の新機能です。 disモジュールのcode_info()http://docs.python.org/dev/whatsnew/3.2.html#dis

10
Tom

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

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

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

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
7
Ernest

Windowsでは、以下に示すようにpythonモジュールの場所を見つけることができます。すなわち、rest_frameworkモジュールを見つけます。 enter image description here

6
Dun0523

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

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

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

4
nexayq

GUIソリューションを好む人のために:あなたがSpyder(Anacondaインストールの一部)のようなguiを使っているなら、あなたはただモジュール名(例えば "import csv"の中の "csv")を右クリックして "go"を選ぶことができます定義に " - これはファイルを開きますが、上にもあなたは正確なファイルの場所を見ることができます(" C:.... csv.py ")

0
Alona

すべてのpythonモジュールがpythonで書かれているわけではありません。 datetimeはそうでないことのうちの1つであることが起こり、そして(Linuxでは)datetime.soです。

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

0
JimB