特定のPythonモジュールのソースファイルがどこにインストールされているかを知るにはどうすればよいですか? WindowsとLinuxでは方法が異なりますか?
私は特にdatetime
モジュールのソースを探そうとしていますが、もっと一般的な答えにも興味があります。
純粋な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 にもあります。
コマンドラインから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が私のインストールに何があるのかわからない!
私はこの答えが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 が望んでいることを推測するのは難しくありません。
sys.path
リストには、実行時にモジュールを探すディレクトリのリストが含まれています。
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.Zip', '/usr/local/lib/python2.5', ... ]
モジュールのインストールにpipを使用している場合は、pip show $module
の位置が返されるだけです。
標準ライブラリから 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))
datetime
は組み込みモジュールなので、(Python)ソースファイルはありません。
.py
(または.pyc
)ファイルから来るモジュールの場合、mymodule.__file__
を使うことができます。
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
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'
ら
Python 3.2の新機能です。 disモジュールのcode_info()
: http://docs.python.org/dev/whatsnew/3.2.html#dis
この nifty "cdp"コマンド をチェックして、指示されたPythonモジュールのソースを含むディレクトリにcdします。
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
これはシェルエイリアスに適した、モジュールのファイル名を取得するためのワンライナーです。
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
Windowsでは、以下に示すようにpythonモジュールの場所を見つけることができます。すなわち、rest_frameworkモジュールを見つけます。
Ubuntu 12.04では、たとえばpython2用のnumpyパッケージは、次の場所にあります。
/usr/lib/python2.7/dist-packages/numpy
もちろん、これは一般的な答えではありません
GUIソリューションを好む人のために:あなたがSpyder(Anacondaインストールの一部)のようなguiを使っているなら、あなたはただモジュール名(例えば "import csv"の中の "csv")を右クリックして "go"を選ぶことができます定義に " - これはファイルを開きますが、上にもあなたは正確なファイルの場所を見ることができます(" C:.... csv.py ")
すべてのpythonモジュールがpythonで書かれているわけではありません。 datetimeはそうでないことのうちの1つであることが起こり、そして(Linuxでは)datetime.soです。
入手するには、ソースコードをpython標準ライブラリにダウンロードする必要があります。