2017-11-29 2 views
1

私はCPythonソースコードを見てきましたが、ほとんどのモジュールではpython.hがインポートを行います。コードをトレースするだけで、Py_Main()ルーチンがスコープに配置されるポイントを見つけることができません。CPythonでは、Py_Mainはどこでスコープに入れられますか?

私はModules/main.c内部Py_Mainの定義だけでなく、include/pylifecycle.hでプロトタイプを見つけた、私はちょうどそれがからインポートなってきた場合、またはこれがmakeとリンカレベルで行われている場合つなぎ合わせるように見えることはできません。

TLDR: #include "python.h",現在、そこに注入されたのはどの時点ですか?

答えて

1

Py_Mainpylifecycle.hに宣言されています。

PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); 

pylifecycle.hPython.hに含まれている:あなたは#include "Python.h"を書くたび

#include "pylifecycle.h" 

pylifecycle.hは自動的に含まれますと、あなたはPy_Mainを取得します。

これは関数宣言に関するものでしたが、コードについてはどうですか?

パイソンが構築されると、Python directory.cファイルがオブジェクトCコンパイラによって(.o)ファイルにコンパイルされます:。CPythonの自体の

オブジェクトファイルは、statically linkedと一緒にスタンドアロンの実行可能ファイルになります。 Linuxでは、通常のリンカーはGNU ldです。サードパーティのモジュールの場合

:PythonのAPIを使用するモジュールの場合

Py_Mainのためのコードが含まれていません:それはdynamic linkerにより、実行時にロードされます。

Linuxでは(同様に、他のシステムでも)コンパイルされたPythonコードは、スタンドアロンの実行可能ファイルとしてpythonと共有ライブラリpython.soの2つの方法で出荷されます。どちらもPy_Mainのコードと他のすべての機能を含んでいます。

+0

私はそれに気付きました。しかし、実際の定義は 'Modules/main.c'ファイルにあります。これはコード内での参照がありません。 – SamuelN

+0

@ SamuelN:関数がどのようにコンパイルされ、リンクされているのか疑問に思っているなら、それはあなたが尋ねたものとはまったく異なる問題です。 – user2357112

+0

@ user2357112そうです、それは私の質問に含めましたか、またはこれがリンカーレベルでmake "で行われた場合です。明確にしてくれてありがとう! – SamuelN

関連する問題