ここには、必要以上に詳細があります。
posix
は組み込みモジュールです。 「組み込みモジュール」が聞こえたら、普通の標準ライブラリモジュールを考えるか、C言語で書かれたモジュールを考えるかもしれませんが、posix
はほとんどのものよりも組み込みです。
posix
モジュールは、Cで書かれています(Modules/posixmodule.c
)。しかし、ほとんどのCモジュール(標準ライブラリCモジュールでさえ)は.so
または.pyd
のファイルにコンパイルされ、通常のPythonモジュールのようにインポートパスに配置されますが、posix
はPython実行可能ファイル自体にコンパイルされます。 CPythonのインポート・システムの内部の詳細の
つPyImport_Inittab
arrayされる:これはとモジュールの名前とCモジュールの初期化機能から成るstruct _inittab
Sのアレイである
extern struct _inittab _PyImport_Inittab[];
struct _inittab *PyImport_Inittab = _PyImport_Inittab;
その名前。ここにリストされているモジュールは組み込みです。
この配列の初期値は_PyImport_Inittab
です。これはModules/config.c
(またはご使用のOSによってはPC/config.c
)ですが、ここでは該当しません。残念ながら、Modules/config.c
はPythonのビルドプロセス中にModules/config.c.in
から生成されるので、私はあなたのソースコードのリンクを表示することはできませんが、ここで私は、ファイルを生成するとき、それがどのように見えるの一部です:
struct _inittab _PyImport_Inittab[] = {
{"_thread", PyInit__thread},
{"posix", PyInit_posix},
// ...
をあなたが見ることができるようにposix
モジュールのエントリが、モジュール初期化ファンクションPyInit_posix
とともにあります。インポート・システムの一部として
モジュールをロードしようとしたとき、Pythonはsys.meta_path
、モジュールfindersのリストを通過します。これらのファインダーの1つはsys.path
検索を実行する責任がありますが、他の1つは_frozen_importlib.BuiltinImporter
であり、posix
などの組み込みモジュールを検索します。
@classmethod
def find_spec(cls, fullname, path=None, target=None):
if path is not None:
return None
if _imp.is_builtin(fullname):
return spec_from_loader(fullname, cls, origin='built-in')
else:
return None
"posix"
名前をPyImport_Inittab
を検索する_imp.is_builtin
を使用しています:Pythonはそのファインダーをしようとすると、それはファインダーのfind_spec
メソッドを実行します。検索で名前が見つかるので、find_spec
は、組み込みモジュールのローダーがこのモジュールの作成を処理する必要があるという事実を表すモジュール仕様を返します。委譲
@classmethod
def create_module(self, spec):
"""Create a built-in module"""
if spec.name not in sys.builtin_module_names:
raise ImportError('{!r} is not a built-in module'.format(spec.name),
name=spec.name)
return _call_with_frames_removed(_imp.create_builtin, spec)
:(。。ローダspec_from_loader
第2引数でBuiltinImporter
ファインダーローダの両方であるので、それは、ここでcls
'S)
Pythonは、モジュールオブジェクトを生成するためにローダーのcreate_module
方法を実行します_imp.create_builtin
に変更され、モジュール名としてPyImport_Inittab
が検索され、対応する初期化関数が実行されます。
(_call_with_frames_removed(x, y)
だけx(y)
呼び出しますが、あなたはあなたの輸入が間違って行くスタックトレースにこれらのフレームを見ることはない理由ですスタックトレースからimportlib
フレームを除去するために魔法の指標としてpart of the import system扱い、それを。)
多くのコードパスを表示したい場合は、実装のC部分のほとんどが存在するPython/import.c
と、Python/ceval.c
というインポート実装のほとんどが存在するLib/importlib/_bootstrap.py
を参照してください。ここでは、バイトコードインタープリタループが生きているので、import
ステートメントが開始され、インポート機構のより多くのコア部分に到達します。
関連文書にはsection of the language reference on the import systemとPEP 451と302が含まれています。組み込みモジュールについてはあまり書かれていませんが、他のプログラムでPythonを埋め込んでいる人に向けてa bit of documentationをターゲットにしていましたが、PyImport_Inittab
を変更したいと思っていたので、sys.builtin_module_names
というリストがあります。
ソースコードをお探しの場合は、[こちら](https://github.com/python/cpython/blob/master/Modules/posixmodule.c#L2420)、それはC言語です。 – user2357112
ありがとう。また、CコードがPythonオブジェクトにどのようにバインドされているかを知ることにも興味があります。 – wim