特定のPythonモジュールのソースファイルがインストールされている場所を知るにはどうすればよいですか?Windowsでの方法とLinuxでの方法は異なりますか?
datetime
特にモジュールのソースを探していますが、より一般的な答えにも興味があります。
特定のPythonモジュールのソースファイルがインストールされている場所を知るにはどうすればよいですか?Windowsでの方法とLinuxでの方法は異なりますか?
datetime
特にモジュールのソースを探していますが、より一般的な答えにも興味があります。
回答:
純粋な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でも見つけることができ ます。
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が何であるかわかりません!
built-in
モジュールはどこにありますか?
この答えは4年遅れであると思いますが、既存の答えは誤解を招く人々です。
これを行う正しい方法は、決して__file__
、またはsys.path
2.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が目的のものであることを推測するのは難しくありません。
__file__
非組み込みには適用されないのですか?(特にmeta_pathを知らなくても)sys.pathのクロールが苦痛になる可能性があることは理解していますが、__file__
定義とバイナリの間の名前空間に関する懸念はありますか?
__file__
機能し、inspect.getfile
機能します。使用するかどうかを推測する__file__
だけで、inspectモジュールを使用するよりも良い状況はありません。
sys.path
リストには、実行時にモジュールを検索するディレクトリのリストが含まれています。
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
python -c 'import sys; print "\n".join(sys.path)'
インタラクティブなpythonにドロップする必要なく、それを表示できます。
python -c 'import sys; print("\n".join(sys.path))'
pipを使用してモジュールをインストールしている場合pip show $module
は、場所のみが返されます。
$module
文字通り何を入力するかではなく、プレースホルダー変数として意図されたと思います。たとえば、m=numpy; pip show $m
...などm
)
標準ライブラリから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))
apt-get remove
D」DataDogとまだそれをインポートすることができます。これは、他の解決策が役に立たなかったときに、ファイルがどこにあるかを見つけるのに役立ちました(そのため、ファイルを削除することができました)。
import importlib
その後importlib.util.find_spec('fontTools')
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'
他
シェルのエイリアスに適したモジュールのファイル名を取得するためのワンライナーは次のとおりです。
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
Python 3.2の新機能、たとえばcode_info()
、disモジュールから使用できるようになりました:http :
//docs.python.org/dev/whatsnew/3.2.html#dis
この気のきいた "cdp"コマンドをチェックして、示されたPythonモジュールのソースを含むディレクトリにcdします。
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
インタープリターを使用していない場合は、以下のコードを実行できます。
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
SpyderのようなIDEでは、モジュールをインポートしてから、モジュールを個別に実行します。 ここに画像の説明を入力してください
str()
モデルのインポートと印刷は、スクリーンショットで行っていることのより正確な説明です。さらに、IDEはこのソリューションには関係がないようです