Python初期化構成
バージョン3.8の新機能。
構造:
関数:
PyConfig_Clear()
PyConfig_InitIsolatedConfig()
PyConfig_InitPythonConfig()
PyConfig_Read()
PyConfig_SetArgv()
PyConfig_SetBytesArgv()
PyConfig_SetBytesString()
PyConfig_SetString()
PyConfig_SetWideStringList()
PyPreConfig_InitIsolatedConfig()
PyPreConfig_InitPythonConfig()
PyStatus_Error()
PyStatus_Exception()
PyStatus_Exit()
PyStatus_IsError()
PyStatus_IsExit()
PyStatus_NoMemory()
PyStatus_Ok()
PyWideStringList_Append()
PyWideStringList_Insert()
Py_ExitStatusException()
Py_InitializeFromConfig()
Py_PreInitialize()
Py_PreInitializeFromArgs()
Py_PreInitializeFromBytesArgs()
Py_RunMain()
Py_GetArgcArgv()
事前設定(PyPreConfig
タイプ)は_PyRuntime.preconfig
に格納され、設定(PyConfig
タイプ)はPyInterpreterState.config
に格納されます。
初期化、ファイナライズ、およびスレッドも参照してください。
PyWideStringList
- type PyWideStringList
wchar_t*
文字列のリスト。length がゼロ以外の場合、 items は非
NULL
であり、すべての文字列は非NULL
である必要があります。方法:
- PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)
item を list に追加します。
この関数を呼び出すには、Pythonを事前に初期化する必要があります。
- PyStatus PyWideStringList_Insert(PyWideStringList *list, Py_ssize_t index, const wchar_t *item)
item を list の index に挿入します。
index が list の長さ以上の場合は、 item を list に追加します。
index は0以上である必要があります。
この関数を呼び出すには、Pythonを事前に初期化する必要があります。
構造フィールド:
- Py_ssize_t length
リストの長さ。
- wchar_t **items
アイテムを一覧表示します。
- PyStatus PyWideStringList_Append(PyWideStringList *list, const wchar_t *item)
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)
がゼロ以外の場合にのみ呼び出す必要があります。
- int exitcode
ノート
内部的には、PythonはPyStatus.func
を設定するマクロを使用しますが、関数はfunc
をNULL
に設定します。
例:
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_SET
(0
):メモリアロケータを変更しない(デフォルトを使用)PYMEM_ALLOCATOR_DEFAULT
(1
):デフォルトのメモリアロケータPYMEM_ALLOCATOR_DEBUG
(2
):デバッグフック付きのデフォルトのメモリアロケータPYMEM_ALLOCATOR_MALLOC
(3
):malloc()
の使用を強制しますPYMEM_ALLOCATOR_MALLOC_DEBUG
(4
):デバッグフックを使用してmalloc()
の使用を強制しますPYMEM_ALLOCATOR_PYMALLOC
(5
): PythonpymallocメモリアロケータPYMEM_ALLOCATOR_PYMALLOC_DEBUG
(6
):デバッグフック付きの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.allocator がPYMEM_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_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)
ワイド文字列のリスト list を length および 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
- wchar_t *base_executable
sys._base_executable
:__PYVENV_LAUNCHER__
環境変数値、または PyConfig.executable のコピー。
- wchar_t *base_prefix
- wchar_t *platlibdir
sys.platlibdir :プラットフォームライブラリディレクトリ名。構成時に
--with-platlibdir
で設定され、PYTHONPLATLIBDIR
環境変数で上書きできます。バージョン3.9の新機能。
- int buffered_stdio
0に等しい場合は、バッファなしモードを有効にして、stdoutストリームとstderrストリームをバッファなしにします。
stdinは常にバッファモードで開かれます。
- int bytes_warning
1に等しい場合、 bytes または bytearray を str と比較するとき、または bytes を int と比較するときに、警告を発行します。 ]。 2以上の場合、 BytesWarning 例外を発生させます。
- wchar_t *check_hash_pycs_mode
ハッシュベースの
.pyc
ファイルの検証動作を制御します( PEP 552 を参照): -check-hash-based-pycs コマンドラインオプション値。有効な値:
always
、never
、およびdefault
。デフォルト値は
default
です。
- int configure_c_stdio
ゼロ以外の場合は、C標準ストリーム(
stdio
、stdout
、stdout
)を構成します。 たとえば、WindowsではモードをO_BINARY
に設定します。
- int dev_mode
ゼロ以外の場合は、 Python開発モードを有効にします。
- int dump_refs
ゼロ以外の場合は、終了時にまだ生きているすべてのオブジェクトをダンプします。
Py_TRACE_REFS
マクロはビルドで定義する必要があります。
- wchar_t *exec_prefix
- wchar_t *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.stdin 、 sys.stdout 、および sys.stderrに
io.WindowsConsoleIO
の代わりに io.FileIO を使用します。Windowsでのみ使用できます。
#ifdef MS_WINDOWS
マクロは、Windows固有のコードに使用できます。
- int malloc_stats
ゼロ以外の場合は、終了時に Pythonpymallocメモリアロケータに統計をダンプします。
Pythonが
--without-pymalloc
を使用して構築されている場合、このオプションは無視されます。
- wchar_t *pythonpath_env
DELIM
(os.path.pathsep
)で区切られた文字列としてのモジュール検索パス。デフォルトでは、 PYTHONPATH 環境変数値から初期化されます。
- PyWideStringList module_search_paths
- int module_search_paths_set
sys.path 。 module_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
- wchar_t *program_name
プログラム名。 実行可能ファイルの初期化、および初期のエラーメッセージで使用されます。
- wchar_t *pycache_prefix
sys.pycache_prefix :
.pyc
キャッシュプレフィックス。NULL
の場合、 sys.pycache_prefix はNone
に設定されます。
- 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.stdin 、 sys.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
- int _use_peg_parser
PEGパーサーを有効にしますか? デフォルト:1。
-X oldparser および PYTHONOLDPARSER によって0に設定されます。
PEP 617 も参照してください。
- void PyConfig_InitIsolatedConfig(PyConfig *config)
parse_argv
がゼロ以外の場合、argv
引数は、通常のPythonがコマンドライン引数を解析するのと同じ方法で解析され、Python引数はargv
から削除されます。コマンドを参照してください。行引数。
xoptions
オプションは、他のオプションを設定するために解析されます。 -X オプションを参照してください。
バージョン3.9で変更: show_alloc_count
フィールドが削除されました。
PyConfigによる初期化
Pythonを初期化する関数:
- 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 には、パス構成用の複数のフィールドが含まれています。
- パス構成入力:
PyConfig.home
PyConfig.platlibdir
PyConfig.pathconfig_warnings
PyConfig.program_name
PyConfig.pythonpath_env
- 現在の作業ディレクトリ:絶対パスを取得する
- プログラムのフルパスを取得するための
PATH
環境変数( PyConfig.program_name から) __PYVENV_LAUNCHER__
環境変数- (Windowsのみ)HKEY_CURRENT_USERおよびHKEY_LOCAL_MACHINE(XYはPythonバージョン)の「SoftwarePythonPythonCoreX.YPythonPath」の下にあるレジストリ内のアプリケーションパス。
- パス構成の出力フィールド:
少なくとも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_filename を sys.path の前に追加します。 - 分離がゼロの場合:
- run_module が設定されている場合は、現在のディレクトリの前に sys.path を追加します。 現在のディレクトリを読み取れない場合は、何もしません。
- run_filename が設定されている場合は、ファイル名のディレクトリの前に sys.path を追加します。
- それ以外の場合は、 sys.path の前に空の文字列を追加します。
site_import がゼロ以外の場合、 sys.path は site モジュールによって変更できます。 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」:
- 「メイン」初期化フェーズ、Pythonは完全に初期化されます。
- importlib をインストールして構成します。
- パス構成を適用します。
- シグナルハンドラーをインストールします。
- sys モジュールの初期化を完了します(例: sys.stdout および sys.path を作成します)。
- faulthandler や tracemalloc などのオプション機能を有効にします。
- サイトモジュールをインポートします。
- 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);
}
}