特定の Python モジュールのソース ファイルがインストールされている場所を知るにはどうすればよいですか? Windows と Linux では方法が異なりますか?
特にモジュールのソースを探していdatetime
ますが、より一般的な回答にも興味があります。
純粋な python モジュールの場合は、 を参照してソースを見つけることができますthemodule.__file__
。ただし、datetime モジュールは C で記述されてdatetime.__file__
いるため、.so ファイルを指しているため ( datetime.__file__
Windows にはありません)、ソースを表示できません。
Python ソース tarball をダウンロードして展開すると、モジュールのコードはModulesサブディレクトリにあります。
たとえば、python 2.6 の datetime コードを見つけたい場合は、次のように表示できます。
Python-2.6/Modules/datetimemodule.c
最新の Mercurial バージョンは、Web の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
するためのルール(CPython 2.xについては文書化されていますが、苦痛であり、他の実装または3.xについてはまったく文書化されていません)を学習して実装する場合を除きます。.py
.zipアーカイブ、eggs、およびモジュールパッケージの処理。サポートしていない.so
/ファイルへのパスを取得するためのさまざまな方法を試します。Jython / IronPython/PyPyが何をするかを理解する。など。その場合は、それのために行きます。.pyd
__file__
一方、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
厳密に言えば、どのファイルがどのモジュールを定義しているかを確認する方法はありませんが、ほとんどすべてがまたはであるため、 datetimemodule.cfoomodule.c
が必要なものであると推測するのは難しいことではありません。
モジュールのインストールに pip を使用している場合はpip show $module
、場所だけが返されます。
リストには、実行時にモジュールを検索するディレクトリのsys.path
リストが含まれています。
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
標準ライブラリから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'
シェルのエイリアシングに適した、モジュールのファイル名を取得するためのワンライナーを次に示します。
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 モジュールを見つけます。
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'
その他
code_info()
Python 3.2 の新機能として、たとえばdis モジュールから
使用できるようになりました: http://docs.python.org/dev/whatsnew/3.2.html#dis
この気の利いた「cdp」コマンドをチェックして、指定された Python モジュールのソースを含むディレクトリに移動します。
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
Ubuntu 12.04 では、たとえば python2 の numpy パッケージは次の場所にあります。
/usr/lib/python2.7/dist-packages/numpy
もちろん、これは一般的な答えではありません
誰かが今それを必要とする場合に備えて答えを更新するだけで、私はPython 3.9にいて、Pipを使用してパッケージを管理しています。を使用するだけpip show
です。
pip show numpy
pip が他のすべてのパッケージを保存している場所のすべての詳細が表示されます。
すべての python モジュールが python で書かれているわけではありません。日時はたまたまそうでないものの1つであり、(Linuxでは)datetime.soです。
ソースコードを取得するには、Python 標準ライブラリにダウンロードする必要があります。
GUI ソリューションを好む場合: Spyder (Anaconda インストールの一部) などの GUI を使用している場合は、モジュール名 (「import csv」の「csv」など) を右クリックして、「go to definition" - これによりファイルが開きますが、上部にも正確なファイルの場所が表示されます ("C:....csv.py")