Python初期化構成—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/c-api/init config
移動先:案内検索

Python初期化構成

バージョン3.8の新機能。


構造:

関数:

事前設定(PyPreConfigタイプ)は_PyRuntime.preconfigに格納され、設定(PyConfigタイプ)はPyInterpreterState.configに格納されます。

初期化、ファイナライズ、およびスレッドも参照してください。

も参照してください

PEP 587 「Python初期化構成」。


PyWideStringList

type PyWideStringList

wchar_t*文字列のリスト。

length がゼロ以外の場合、 items は非NULLであり、すべての文字列は非NULLである必要があります。

方法:

PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)

itemlist に追加します。

この関数を呼び出すには、Pythonを事前に初期化する必要があります。

PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item)

itemlistindex に挿入します。

indexlist の長さ以上の場合は、 itemlist に追加します。

index は0以上である必要があります。

この関数を呼び出すには、Pythonを事前に初期化する必要があります。

構造フィールド:

Py_ssize_t length

リストの長さ。

wchar_t **items

アイテムを一覧表示します。


PyStatus

type PyStatus

初期化関数のステータス(成功、エラー、または終了)を格納する構造。

エラーの場合、エラーの原因となったC関数名を格納できます。

構造フィールド:

int exitcode

終了コード。 exit()に渡された引数。

const char *err_msg

エラーメッセージ。

const char *func

エラーを発生させた関数の名前は、NULLにすることができます。

ステータスを作成する関数:

PyStatus PyStatus_Ok(void)

成功。

PyStatus PyStatus_Error(const char *err_msg)

メッセージ付きの初期化エラー。

PyStatus PyStatus_NoMemory(void)

メモリ割り当ての失敗(メモリ不足)。

PyStatus PyStatus_Exit(int exitcode)

指定された終了コードでPythonを終了します。

ステータスを処理する関数:

int PyStatus_Exception(PyStatus status)

ステータスはエラーですか、それとも終了ですか? trueの場合、例外を処理する必要があります。 たとえば、 Py_ExitStatusException()を呼び出します。

int PyStatus_IsError(PyStatus status)

結果はエラーですか?

int PyStatus_IsExit(PyStatus status)

結果は出口ですか?

void Py_ExitStatusException(PyStatus status)

status が出口の場合は、exit(exitcode)を呼び出します。 status がエラーの場合は、エラーメッセージを出力し、ゼロ以外の終了コードで終了します。 PyStatus_Exception(status)がゼロ以外の場合にのみ呼び出す必要があります。

ノート

内部的には、PythonはPyStatus.funcを設定するマクロを使用しますが、関数はfuncNULLに設定します。


例:

PyStatus alloc(void **ptr, size_t size)
{
    *ptr = PyMem_RawMalloc(size);
    if (*ptr == NULL) {
        return PyStatus_NoMemory();
    }
    return PyStatus_Ok();
}

int main(int argc, char **argv)
{
    void *ptr;
    PyStatus status = alloc(&ptr, 16);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }
    PyMem_Free(ptr);
    return 0;
}

PyPreConfig

type PyPreConfig

Pythonの事前初期化に使用される構造:

  • Pythonメモリアロケータを設定します

  • LC_CTYPEロケールを構成します

  • UTF-8モードを設定します

事前設定を初期化する機能:

void PyPreConfig_InitPythonConfig(PyPreConfig *preconfig)

Python構成を使用して事前構成を初期化します。

void PyPreConfig_InitIsolatedConfig(PyPreConfig *preconfig)

Isolated Configuration を使用して事前構成を初期化します。

構造フィールド:

int allocator

メモリアロケータの名前:

  • PYMEM_ALLOCATOR_NOT_SET0):メモリアロケータを変更しない(デフォルトを使用)

  • PYMEM_ALLOCATOR_DEFAULT1):デフォルトのメモリアロケータ

  • PYMEM_ALLOCATOR_DEBUG2):デバッグフック付きのデフォルトのメモリアロケータ

  • PYMEM_ALLOCATOR_MALLOC3):malloc()の使用を強制します

  • PYMEM_ALLOCATOR_MALLOC_DEBUG4):デバッグフックを使用してmalloc()の使用を強制します

  • PYMEM_ALLOCATOR_PYMALLOC5): Pythonpymallocメモリアロケータ

  • PYMEM_ALLOCATOR_PYMALLOC_DEBUG6):デバッグフック付きのPythonpymallocメモリアロケータ

Pythonが--without-pymallocを使用して構成されている場合、PYMEM_ALLOCATOR_PYMALLOCおよびPYMEM_ALLOCATOR_PYMALLOC_DEBUGはサポートされません。

メモリ管理を参照してください。

int configure_locale

LC_CTYPEロケールをユーザー優先ロケールに設定しますか? 0に等しい場合は、 coerce_c_locale および coerce_c_locale_warn を0に設定します。

int coerce_c_locale

2に等しい場合は、Cロケールを強制します。 1に等しい場合は、LC_CTYPEロケールを読み取って、強制する必要があるかどうかを判断します。

int coerce_c_locale_warn

ゼロ以外の場合、Cロケールが強制されていると警告を発します。

int dev_mode

PyConfig.dev_mode を参照してください。

int isolated

PyConfig.isolated を参照してください。

int legacy_windows_fs_encoding(Windows only)

ゼロ以外の場合は、UTF-8モードを無効にし、Pythonファイルシステムエンコーディングをmbcsに設定し、ファイルシステムエラーハンドラーをreplaceに設定します。

Windowsでのみ使用できます。 #ifdef MS_WINDOWSマクロは、Windows固有のコードに使用できます。

int parse_argv

ゼロ以外の場合、 Py_PreInitializeFromArgs()および Py_PreInitializeFromBytesArgs()は、通常のPythonがコマンドライン引数を解析するのと同じ方法でargv引数を解析します。コマンドラインを参照してください。引数

int use_environment

PyConfig.use_environment を参照してください。

int utf8_mode

ゼロ以外の場合は、UTF-8モードを有効にします。


PyPreConfigによる事前初期化

Pythonを事前初期化する関数:

PyStatus Py_PreInitialize(const PyPreConfig *preconfig)
preconfig 事前設定からPythonを事前初期化します。
PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char *const *argv)
preconfig 事前構成およびコマンドライン引数(バイト文字列)からPythonを事前初期化します。
PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t *const *argv)
preconfig 事前構成およびコマンドライン引数(幅の広い文字列)からPythonを事前初期化します。

呼び出し元は、PyStatus_Exception()およびPy_ExitStatusException()を使用して例外(エラーまたは終了)を処理する責任があります。

Python構成PyPreConfig_InitPythonConfig())の場合、Pythonがコマンドライン引数で初期化されると、コマンドライン引数も渡してPythonを事前初期化する必要があります。これは、次のような事前構成に影響を与えるためです。エンコーディング。 たとえば、 -X utf8 コマンドラインオプションは、UTF-8モードを有効にします。

PyMem_SetAllocator()は、 Py_PreInitialize()の後、 Py_InitializeFromConfig()の前に呼び出して、カスタムメモリアロケータをインストールできます。 PyPreConfig.allocatorPYMEM_ALLOCATOR_NOT_SETに設定されている場合は、 Py_PreInitialize()の前に呼び出すことができます。

PyMem_RawMalloc()のようなPythonメモリ割り当て関数は、Pythonの事前初期化の前に使用しないでください。一方、malloc()およびfree()を直接呼び出すことは常に安全です。 Py_DecodeLocale()は、事前初期化の前に呼び出さないでください。

事前初期化を使用してUTF-8モードを有効にする例:

PyStatus status;
PyPreConfig preconfig;
PyPreConfig_InitPythonConfig(&preconfig);

preconfig.utf8_mode = 1;

status = Py_PreInitialize(&preconfig);
if (PyStatus_Exception(status)) {
    Py_ExitStatusException(status);
}

/* at this point, Python will speak UTF-8 */

Py_Initialize();
/* ... use Python API here ... */
Py_Finalize();

PyConfig

type PyConfig

Pythonを構成するためのほとんどのパラメーターを含む構造。

構造方法:

void PyConfig_InitPythonConfig(PyConfig *config)

Python構成を使用して構成を初期化します。

void PyConfig_InitIsolatedConfig(PyConfig *config)

Isolated Configuration を使用して構成を初期化します。

PyStatus PyConfig_SetString(PyConfig *config, wchar_t *const *config_str, const wchar_t *str)

ワイド文字列 str*config_strにコピーします。

必要に応じてPythonを事前初期化します。

PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t *const *config_str, const char *str)

Py_DecodeLocale()を使用して str をデコードし、結果を*config_strに設定します。

必要に応じてPythonを事前初期化します。

PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t *const *argv)

ワイド文字列からコマンドライン引数を設定します。

必要に応じてPythonを事前初期化します。

PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char *const *argv)

コマンドライン引数を設定します。 Py_DecodeLocale()を使用してバイトをデコードします。

必要に応じてPythonを事前初期化します。

PyStatus PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items)

ワイド文字列のリスト listlength および items に設定します。

必要に応じてPythonを事前初期化します。

PyStatus PyConfig_Read(PyConfig *config)

すべてのPython構成を読み取ります。

すでに初期化されているフィールドは変更されません。

必要に応じてPythonを事前初期化します。

void PyConfig_Clear(PyConfig *config)

構成メモリを解放します。

ほとんどのPyConfigメソッドは、必要に応じてPythonを事前初期化します。 その場合、Pythonの事前初期化構成は PyConfig に基づいています。 PyPreConfig と共通の構成フィールドを調整する場合は、 PyConfig メソッドを呼び出す前に設定する必要があります。

さらに、 PyConfig_SetArgv()または PyConfig_SetBytesArgv()を使用する場合、事前初期化構成はコマンドライン引数に依存するため、このメソッドを最初に呼び出す必要があります(の場合)。 parse_argv はゼロ以外です)。

これらのメソッドの呼び出し元は、PyStatus_Exception()およびPy_ExitStatusException()を使用して例外(エラーまたは終了)を処理する責任があります。

構造フィールド:

PyWideStringList argv

コマンドライン引数、 sys.argv 。 通常のPythonがPythonコマンドライン引数を解析するのと同じ方法で argv を解析するには、 parse_argv を参照してください。 argv が空の場合、空の文字列が追加され、 sys.argv が常に存在し、空になることはありません。

wchar_t *base_exec_prefix

sys.base_exec_prefix

wchar_t *base_executable

sys._base_executable__PYVENV_LAUNCHER__環境変数値、または PyConfig.executable のコピー。

wchar_t *base_prefix

sys.base_prefix

wchar_t *platlibdir

sys.platlibdir :プラットフォームライブラリディレクトリ名。構成時に--with-platlibdirで設定され、PYTHONPLATLIBDIR環境変数で上書きできます。

バージョン3.9の新機能。

int buffered_stdio

0に等しい場合は、バッファなしモードを有効にして、stdoutストリームとstderrストリームをバッファなしにします。

stdinは常にバッファモードで開かれます。

int bytes_warning

1に等しい場合、 bytes または bytearraystr と比較するとき、または bytesint と比較するときに、警告を発行します。 ]。 2以上の場合、 BytesWarning 例外を発生させます。

wchar_t *check_hash_pycs_mode

ハッシュベースの.pycファイルの検証動作を制御します( PEP 552 を参照): -check-hash-based-pycs コマンドラインオプション値。

有効な値:alwaysnever、およびdefault

デフォルト値はdefaultです。

int configure_c_stdio

ゼロ以外の場合は、C標準ストリーム(stdiostdoutstdout)を構成します。 たとえば、WindowsではモードをO_BINARYに設定します。

int dev_mode

ゼロ以外の場合は、 Python開発モードを有効にします。

int dump_refs

ゼロ以外の場合は、終了時にまだ生きているすべてのオブジェクトをダンプします。

Py_TRACE_REFSマクロはビルドで定義する必要があります。

wchar_t *exec_prefix

sys.exec_prefix

wchar_t *executable

sys.executable

int faulthandler

ゼロ以外の場合は、起動時に faulthandler.enable()を呼び出します。

wchar_t *filesystem_encoding

ファイルシステムエンコーディング、 sys.getfilesystemencoding()

wchar_t *filesystem_errors

ファイルシステムエンコーディングエラー、 sys.getfilesystemencodeerrors()

unsigned long hash_seed
int use_hash_seed

ランダム化されたハッシュ関数シード。

use_hash_seed がゼロの場合、シードはPythonstartupでランダムに選択され、 hash_seed は無視されます。

wchar_t *home

Pythonホームディレクトリ。

デフォルトでは、 PYTHONHOME 環境変数値から初期化されます。

int import_time

ゼロ以外の場合、プロファイルのインポート時間。

int inspect

スクリプトまたはコマンドを実行した後、インタラクティブモードに入ります。

int install_signal_handlers

シグナルハンドラーをインストールしますか?

int interactive

インタラクティブモード。

int isolated

0より大きい場合は、分離モードを有効にします。

  • sys.path には、スクリプトのディレクトリ(argv[0]または現在のディレクトリから計算)もユーザーのsite-packagesディレクトリも含まれていません。

  • Python REPLは、 readline をインポートせず、インタラクティブプロンプトでデフォルトのreadline構成を有効にしません。

  • use_environment および user_site_directory を0に設定します。

int legacy_windows_stdio

ゼロ以外の場合は、 sys.stdinsys.stdout 、および sys.stderrにio.WindowsConsoleIOの代わりに io.FileIO を使用します。

Windowsでのみ使用できます。 #ifdef MS_WINDOWSマクロは、Windows固有のコードに使用できます。

int malloc_stats

ゼロ以外の場合は、終了時に Pythonpymallocメモリアロケータに統計をダンプします。

Pythonが--without-pymallocを使用して構築されている場合、このオプションは無視されます。

wchar_t *pythonpath_env

DELIMos.path.pathsep)で区切られた文字列としてのモジュール検索パス。

デフォルトでは、 PYTHONPATH 環境変数値から初期化されます。

PyWideStringList module_search_paths
int module_search_paths_set

sys.pathmodule_search_paths_set が0に等しい場合、 module_search_paths は、パス構成を計算する関数によってオーバーライドされます。

int optimization_level

コンパイルの最適化レベル:

  • 0:のぞき穴オプティマイザー(および__debug__Trueに設定されています)

  • 1:アサーションを削除し、__debug__Falseに設定します

  • 2:docstringを削除します

int parse_argv

ゼロ以外の場合は、通常のPythonコマンドライン引数と同じ方法で argv を解析し、 argv からPython引数を削除します。コマンドライン引数を参照してください。

int parser_debug

ゼロ以外の場合は、パーサーのデバッグ出力をオンにします(コンパイルオプションに応じて、エキスパートのみ)。

int pathconfig_warnings

0に等しい場合、パス構成を計算するときに警告を抑制します(Unixのみ、Windowsは警告をログに記録しません)。 それ以外の場合、警告はstderrに書き込まれます。

wchar_t *prefix

sys.prefix

wchar_t *program_name

プログラム名。 実行可能ファイルの初期化、および初期のエラーメッセージで使用されます。

wchar_t *pycache_prefix

sys.pycache_prefix.pycキャッシュプレフィックス。

NULLの場合、 sys.pycache_prefixNoneに設定されます。

int quiet

静音モード。 たとえば、著作権メッセージとバージョンメッセージをインタラクティブモードで表示しないでください。

wchar_t *run_command

python3 -c COMMAND引数。 Py_RunMain()によって使用されます。

wchar_t *run_filename

python3 FILENAME引数。 Py_RunMain()によって使用されます。

wchar_t *run_module

python3 -m MODULE引数。 Py_RunMain()によって使用されます。

int show_ref_count

終了時に合計参照カウントを表示しますか?

-X showrefcount コマンドラインオプションで1に設定します。

Pythonのデバッグビルドが必要です(Py_REF_DEBUGマクロを定義する必要があります)。

int site_import

起動時に site モジュールをインポートしますか?

int skip_source_first_line

ソースの最初の行をスキップしますか?

wchar_t *stdio_encoding
wchar_t *stdio_errors

sys.stdinsys.stdout 、および sys.stderr のエンコードおよびエンコードエラー。

int tracemalloc

ゼロ以外の場合は、起動時に tracemalloc.start()を呼び出します。

int use_environment

0より大きい場合は、環境変数を使用します。

int user_site_directory

ゼロ以外の場合は、ユーザーサイトディレクトリを sys.path に追加します。

int verbose

ゼロ以外の場合は、冗長モードを有効にします。

PyWideStringList warnoptions

sys.warnoptions :警告フィルターを構築するための warnings モジュールのオプション:優先度の低いものから高いものへ。

warnings モジュールは、 sys.warnoptions を逆の順序で追加します。最後の PyConfig.warnoptions アイテムは、チェックされるwarnings.filtersの最初のアイテムになります。最初(最高の優先順位)。

int write_bytecode

ゼロ以外の場合は、.pycファイルを書き込みます。

sys.dont_write_bytecode は、 write_bytecode の反転値に初期化されます。

PyWideStringList xoptions

sys._xoptions

int _use_peg_parser

PEGパーサーを有効にしますか? デフォルト:1。

-X oldparser および PYTHONOLDPARSER によって0に設定されます。

PEP 617 も参照してください。

parse_argvがゼロ以外の場合、argv引数は、通常のPythonがコマンドライン引数を解析するのと同じ方法で解析され、Python引数はargvから削除されます。コマンドを参照してください。行引数

xoptionsオプションは、他のオプションを設定するために解析されます。 -X オプションを参照してください。

バージョン3.9で変更: show_alloc_countフィールドが削除されました。


PyConfigによる初期化

Pythonを初期化する関数:

PyStatus Py_InitializeFromConfig(const PyConfig *config)
config 構成からPythonを初期化します。

呼び出し元は、PyStatus_Exception()およびPy_ExitStatusException()を使用して例外(エラーまたは終了)を処理する責任があります。

PyImport_FrozenModules()PyImport_AppendInittab()、または PyImport_ExtendInittab()を使用する場合は、Pythonの事前初期化後、Pythonの初期化前に設定または呼び出す必要があります。 Pythonが複数回初期化される場合は、各Python初期化の前に PyImport_AppendInittab()または PyImport_ExtendInittab()を呼び出す必要があります。

プログラム名の設定例:

void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name. Implicitly preinitialize Python. */
    status = PyConfig_SetString(&config, &config.program_name,
                                L"/path/to/my_program");
    if (PyStatus_Exception(status)) {
        goto fail;
    }

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) {
        goto fail;
    }
    PyConfig_Clear(&config);
    return;

fail:
    PyConfig_Clear(&config);
    Py_ExitStatusException(status);
}

デフォルト構成を変更し、構成を読み取り、いくつかのパラメーターをオーバーライドする、より完全な例:

PyStatus init_python(const char *program_name)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);

    /* Set the program name before reading the configuration
       (decode byte string from the locale encoding).

       Implicitly preinitialize Python. */
    status = PyConfig_SetBytesString(&config, &config.program_name,
                                  program_name);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Read all configuration at once */
    status = PyConfig_Read(&config);
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Append our custom search path to sys.path */
    status = PyWideStringList_Append(&config.module_search_paths,
                                     L"/path/to/more/modules");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    /* Override executable computed by PyConfig_Read() */
    status = PyConfig_SetString(&config, &config.executable,
                                L"/path/to/my_executable");
    if (PyStatus_Exception(status)) {
        goto done;
    }

    status = Py_InitializeFromConfig(&config);

done:
    PyConfig_Clear(&config);
    return status;
}

分離された構成

PyPreConfig_InitIsolatedConfig()およびPyConfig_InitIsolatedConfig()関数は、Pythonをシステムから分離するための構成を作成します。 たとえば、Pythonをアプリケーションに埋め込む場合です。

この構成では、グローバル構成変数、環境変数、コマンドライン引数( PyConfig.argv は解析されません)、およびユーザーサイトディレクトリは無視されます。 C標準ストリーム(例:stdout)とLC_CTYPEロケールは変更されません。 シグナルハンドラーがインストールされていません。

構成ファイルは、この構成でも引き続き使用されます。 パス構成(「出力フィールド」)を設定して、これらの構成ファイルを無視し、デフォルトのパス構成を計算する機能を回避します。


Python構成

PyPreConfig_InitPythonConfig()およびPyConfig_InitPythonConfig()関数は、通常のPythonとして動作するカスタマイズされたPythonを構築するための構成を作成します。

環境変数とコマンドライン引数はPythonの構成に使用されますが、グローバル構成変数は無視されます。

この関数は、LC_CTYPEロケールに応じて、Cロケール強制( PEP 538 )およびUTF-8モード( PEP 540 )を有効にします。 X145X] PYTHONUTF8 および PYTHONCOERCECLOCALE 環境変数。

常に分離モードで実行されるカスタマイズされたPythonの例:

int main(int argc, char **argv)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);
    config.isolated = 1;

    /* Decode command line arguments.
       Implicitly preinitialize Python (in isolated mode). */
    status = PyConfig_SetBytesArgv(&config, argc, argv);
    if (PyStatus_Exception(status)) {
        goto fail;
    }

    status = Py_InitializeFromConfig(&config);
    if (PyStatus_Exception(status)) {
        goto fail;
    }
    PyConfig_Clear(&config);

    return Py_RunMain();

fail:
    PyConfig_Clear(&config);
    if (PyStatus_IsExit(status)) {
        return status.exitcode;
    }
    /* Display the error message and exit the process with
       non-zero exit code */
    Py_ExitStatusException(status);
}

パス構成

PyConfig には、パス構成用の複数のフィールドが含まれています。

少なくとも1つの「出力フィールド」が設定されていない場合、Pythonは未設定のフィールドを埋めるためにパス構成を計算します。 module_search_paths_set が0に等しい場合、 module_search_paths はオーバーライドされ、 module_search_paths_set は1に設定されます。

上記のすべてのパス構成出力フィールドを明示的に設定することにより、デフォルトのパス構成を計算する機能を完全に無視することができます。 文字列は、空でなくてもセットされていると見なされます。 module_search_pathsは設定されていると見なされます。 この場合、パス構成入力フィールドも無視されます。

pathconfig_warnings を0に設定して、パス構成を計算するときの警告を抑制します(Unixのみ、Windowsは警告をログに記録しません)。

base_prefix または base_exec_prefix フィールドが設定されていない場合、それらはそれぞれ prefix および exec_prefix から値を継承します。

Py_RunMain()および Py_Main()sys.path を変更します。

  • run_filename が設定されていて、__main__.pyスクリプトを含むディレクトリである場合は、 run_filenamesys.path の前に追加します。
  • 分離がゼロの場合:
    • run_module が設定されている場合は、現在のディレクトリの前に sys.path を追加します。 現在のディレクトリを読み取れない場合は、何もしません。
    • run_filename が設定されている場合は、ファイル名のディレクトリの前に sys.path を追加します。
    • それ以外の場合は、 sys.path の前に空の文字列を追加します。

site_import がゼロ以外の場合、 sys.pathsite モジュールによって変更できます。 user_site_directory がゼロ以外で、ユーザーのサイトパッケージディレクトリが存在する場合、 site モジュールはユーザーのサイトパッケージディレクトリを sys.path に追加します。

次の構成ファイルは、パス構成で使用されます。

  • pyvenv.cfg
  • python._pth(Windowsのみ)
  • pybuilddir.txt(Unixのみ)

__PYVENV_LAUNCHER__環境変数は、 PyConfig.base_executable を設定するために使用されます


Py_RunMain()

int Py_RunMain(void)

コマンド( PyConfig.run_command )、スクリプト( PyConfig.run_filename )、またはコマンドラインまたは構成。

デフォルトで、 -i オプションが使用されている場合は、REPLを実行します。

最後に、Pythonをファイナライズし、exit()関数に渡すことができる終了ステータスを返します。

Py_RunMain()を使用して常に分離モードで実行されるカスタマイズされたPythonの例については、 Python構成を参照してください。


Py_GetArgcArgv()

void Py_GetArgcArgv(int *argc, wchar_t ***argv)
Pythonが変更する前に、元のコマンドライン引数を取得します。


マルチフェーズ初期化プライベート暫定API

このセクションは、 PEP 432 のコア機能であるマルチフェーズ初期化を紹介するプライベート暫定APIです。

  • 「コア」初期化フェーズ、「ベアミニマムPython」:
    • 組み込みタイプ;
    • 組み込みの例外。
    • 組み込みおよび凍結モジュール。
    • sys モジュールは部分的にのみ初期化されます(例: sys.path はまだ存在しません)。
  • 「メイン」初期化フェーズ、Pythonは完全に初期化されます。
    • importlib をインストールして構成します。
    • パス構成を適用します。
    • シグナルハンドラーをインストールします。
    • sys モジュールの初期化を完了します(例: sys.stdout および sys.path を作成します)。
    • faulthandlertracemalloc などのオプション機能を有効にします。
    • サイトモジュールをインポートします。
    • NS。

プライベート暫定API:

  • PyConfig._init_main:0に設定すると、 Py_InitializeFromConfig()は「コア」初期化フェーズで停止します。
  • PyConfig._isolated_interpreter:ゼロ以外の場合、スレッド、サブプロセス、およびフォークを許可しません。
PyStatus _Py_InitializeMain(void)
「メイン」初期化フェーズに移動し、Pythonの初期化を終了します。

「コア」フェーズではモジュールはインポートされず、importlibモジュールは構成されません。パス構成は「メイン」フェーズでのみ適用されます。 PythonでPythonをカスタマイズして、パス構成をオーバーライドまたは調整したり、カスタム sys.meta_path インポーターやインポートフックをインストールしたりできる場合があります。

PEP 432 の動機の1つであるコアフェーズの後、メインフェーズの前に、Pythonでパス構成を計算できるようになる可能性があります。

「コア」フェーズは適切に定義されていません。このフェーズで何を使用できるか、何を使用できないかはまだ指定されていません。 APIはプライベートおよび暫定としてマークされています。適切なパブリックAPIが設計されるまで、APIはいつでも変更したり、削除したりすることができます。

「コア」と「メイン」の初期化フェーズ間でPythonコードを実行する例:

void init_python(void)
{
    PyStatus status;

    PyConfig config;
    PyConfig_InitPythonConfig(&config);
    config._init_main = 0;

    /* ... customize 'config' configuration ... */

    status = Py_InitializeFromConfig(&config);
    PyConfig_Clear(&config);
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }

    /* Use sys.stderr because sys.stdout is only created
       by _Py_InitializeMain() */
    int res = PyRun_SimpleString(
        "import sys; "
        "print('Run Python code before _Py_InitializeMain', "
               "file=sys.stderr)");
    if (res < 0) {
        exit(1);
    }

    /* ... put more configuration code here ... */

    status = _Py_InitializeMain();
    if (PyStatus_Exception(status)) {
        Py_ExitStatusException(status);
    }
}