オペレーティングシステムユーティリティ—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/c-api/sys
移動先:案内検索

オペレーティングシステムユーティリティ

PyObject *PyOS_FSPath(PyObject *path)

パスのファイルシステム表現を返します。 オブジェクトが str または bytes オブジェクトの場合、その参照カウントがインクリメントされます。 オブジェクトが os.PathLike インターフェイスを実装している場合、 str または bytes オブジェクトである限り、__fspath__()が返されます。 それ以外の場合は、 TypeError が発生し、NULLが返されます。

バージョン3.6の新機能。

int Py_FdIsInteractive(FILE *fp, const char *filename)
filename という名前の標準I / Oファイル fp がインタラクティブであると見なされる場合は、true(ゼロ以外)を返します。 これは、isatty(fileno(fp))が真であるファイルの場合です。 グローバルフラグ Py_InteractiveFlag がtrueの場合、 filename ポインタがNULLの場合、または名前が文字列'<stdin>'または'???'
void PyOS_BeforeFork()

プロセスフォークの前に内部状態を準備する関数。 これは、fork()または現在のプロセスのクローンを作成する同様の関数を呼び出す前に呼び出す必要があります。 fork()が定義されているシステムでのみ使用できます。

警告

C fork()呼び出しは、「メイン」スレッド「メイン」インタープリターの)からのみ行う必要があります。 PyOS_BeforeFork()についても同じことが言えます。

バージョン3.7の新機能。

void PyOS_AfterFork_Parent()

プロセスフォーク後に内部状態を更新する関数。 これは、プロセスの複製が成功したかどうかに関係なく、fork()または現在のプロセスを複製する同様の関数を呼び出した後、親プロセスから呼び出す必要があります。 fork()が定義されているシステムでのみ使用できます。

警告

C fork()呼び出しは、「メイン」スレッド「メイン」インタープリターの)からのみ行う必要があります。 PyOS_AfterFork_Parent()についても同じことが言えます。

バージョン3.7の新機能。

void PyOS_AfterFork_Child()

プロセスフォーク後に内部インタープリターの状態を更新する関数。 これは、fork()、または現在のプロセスを複製する同様の関数を呼び出した後、プロセスがPythonインタープリターにコールバックする可能性がある場合は、子プロセスから呼び出す必要があります。 fork()が定義されているシステムでのみ使用できます。

警告

C fork()呼び出しは、「メイン」スレッド「メイン」インタープリターの)からのみ行う必要があります。 PyOS_AfterFork_Child()についても同じことが言えます。

バージョン3.7の新機能。

も参照してください

os.register_at_fork()を使用すると、カスタムPython関数を登録して PyOS_BeforeFork()PyOS_AfterFork_Parent()PyOS_AfterFork_Child()から呼び出すことができます。

void PyOS_AfterFork()

プロセスフォーク後に内部状態を更新する関数。 Pythonインタープリターを引き続き使用する場合は、新しいプロセスでこれを呼び出す必要があります。 新しい実行可能ファイルが新しいプロセスにロードされる場合、この関数を呼び出す必要はありません。

バージョン3.7以降非推奨:この関数は PyOS_AfterFork_Child()に置き換えられました。

int PyOS_CheckStack()
インタプリタがスタックスペースを使い果たした場合はtrueを返します。 これは信頼できるチェックですが、USE_STACKCHECKが定義されている場合にのみ使用できます(現在、WindowsではMicrosoft Visual C ++コンパイラを使用しています)。 USE_STACKCHECKは自動的に定義されます。 独自のコードで定義を変更しないでください。
PyOS_sighandler_t PyOS_getsig(int i)
シグナル i の現在のシグナルハンドラーを返します。 これは、sigaction()またはsignal()のいずれかの薄いラッパーです。 これらの関数を直接呼び出さないでください。 PyOS_sighandler_tは、 void(*)(int)のtypedefエイリアスです。
PyOS_sighandler_t PyOS_setsig(int i, PyOS_sighandler_t h)
シグナル i のシグナルハンドラーを h に設定します。 古いシグナルハンドラを返します。 これは、sigaction()またはsignal()のいずれかの薄いラッパーです。 これらの関数を直接呼び出さないでください。 PyOS_sighandler_tは、 void(*)(int)のtypedefエイリアスです。
wchar_t *Py_DecodeLocale(const char *arg, size_t *size)

surrogateescapeエラーハンドラーを使用して、ロケールエンコーディングからバイト文字列をデコードします。デコードできないバイトは、U + DC80..U + DCFFの範囲の文字としてデコードされます。 バイトシーケンスを代理文字としてデコードできる場合は、デコードする代わりに、surrogateescapeエラーハンドラーを使用してバイトをエスケープします。

エンコーディング、最高の優先順位から最低の優先順位:

  • UTF-8(macOS、Android、およびVxWorks)。

  • Py_LegacyWindowsFSEncodingFlag がゼロの場合、WindowsではUTF-8

  • UTF-8 PythonUTF-8モードが有効になっている場合。

  • ASCII LC_CTYPEロケールが"C"の場合、nl_langinfo(CODESET)ASCIIエンコーディング(またはエイリアス)を返し、 [X112X ]およびwcstombs()関数は、ISO-8859-1エンコーディングを使用します。

  • 現在のロケールエンコーディング。

新しく割り当てられたワイド文字列へのポインタを返します。 PyMem_RawFree()を使用してメモリを解放します。 サイズがNULLでない場合は、ヌル文字を除くワイド文字の数を*sizeに書き込みます。

デコードエラーまたはメモリ割り当てエラーの場合はNULLを返します。 sizeNULLでない場合、*sizeはメモリエラー時に(size_t)-1に設定され、デコードエラー時に(size_t)-2に設定されます。

Cライブラリにバグがない限り、デコードエラーが発生することはありません。

Py_EncodeLocale()関数を使用して、文字列をエンコードしてバイト文字列に戻します。

も参照してください

PyUnicode_DecodeFSDefaultAndSize()および PyUnicode_DecodeLocaleAndSize()関数。

バージョン3.5の新機能。

バージョン3.7で変更:この関数は、UTF-8モードでUTF-8エンコーディングを使用するようになりました。

バージョン3.8で変更: Py_LegacyWindowsFSEncodingFlag がゼロの場合、関数はWindowsでUTF-8エンコーディングを使用するようになりました。

char *Py_EncodeLocale(const wchar_t *text, size_t *error_pos)

surrogateescapeエラーハンドラーを使用して、ワイド文字列をロケールエンコードにエンコードします。U+ DC80..U + DCFFの範囲の代理文字はバイト0x80..0xFFに変換されます。

エンコーディング、最高の優先順位から最低の優先順位:

  • UTF-8(macOS、Android、およびVxWorks)。

  • Py_LegacyWindowsFSEncodingFlag がゼロの場合、WindowsではUTF-8

  • UTF-8 PythonUTF-8モードが有効になっている場合。

  • ASCII LC_CTYPEロケールが"C"の場合、nl_langinfo(CODESET)ASCIIエンコーディング(またはエイリアス)を返し、 [X112X ]およびwcstombs()関数は、ISO-8859-1エンコーディングを使用します。

  • 現在のロケールエンコーディング。

この関数は、PythonUTF-8モードでUTF-8エンコーディングを使用します。

新しく割り当てられたバイト文字列へのポインタを返します。 PyMem_Free()を使用してメモリを解放します。 エンコーディングエラーまたはメモリ割り当てエラーでNULLを返します

error_posがNULLでない場合、*error_posは成功時に(size_t)-1に設定されるか、エンコードエラー時に無効な文字のインデックスに設定されます。

Py_DecodeLocale()関数を使用して、バイト文字列をワイド文字列にデコードします。

も参照してください

PyUnicode_EncodeFSDefault()および PyUnicode_EncodeLocale()関数。

バージョン3.5の新機能。

バージョン3.7で変更:この関数は、UTF-8モードでUTF-8エンコーディングを使用するようになりました。

バージョン3.8で変更: Py_LegacyWindowsFSEncodingFlag がゼロの場合、関数はWindowsでUTF-8エンコーディングを使用するようになりました。


システム機能

これらは、 sys モジュールの機能をCコードにアクセスできるようにするユーティリティ関数です。 これらはすべて、内部スレッド状態構造に含まれている現在のインタープリタースレッドの sys モジュールのdictで機能します。

PyObject *PySys_GetObject(const char *name)
sys モジュールからオブジェクト name を返します。存在しない場合は、例外を設定せずにNULLを返します。
int PySys_SetObject(const char *name, PyObject *v)
vNULLでない限り、 sys モジュールの namev に設定します。 X113X]がsysモジュールから削除されます。 成功した場合は0を返し、エラーの場合は-1を返します。
void PySys_ResetWarnOptions()
sys.warnoptions を空のリストにリセットします。 この関数は、 Py_Initialize()の前に呼び出すことができます。
void PySys_AddWarnOption(const wchar_t *s)
ssys.warnoptions に追加します。 警告フィルターリストに影響を与えるには、 Py_Initialize()の前にこの関数を呼び出す必要があります。
void PySys_AddWarnOptionUnicode(PyObject *unicode)

unicodesys.warnoptions に追加します。

注:この関数は、 Py_Initialize()warnings を暗黙的にインポートする前に呼び出す必要があるため、現在CPython実装の外部からは使用できませんが、使用できません。 Unicodeオブジェクトの作成を許可するのに十分なランタイムが初期化されるまで呼び出されます。

void PySys_SetPath(const wchar_t *path)
sys.path を、 path で見つかったパスのリストオブジェクトに設定します。これは、プラットフォームの検索パス区切り文字(Unixでは:、[ X175X] (Windowsの場合)。
void PySys_WriteStdout(const char *format, ...)

format で記述された出力文字列を sys.stdout に書き込みます。 切り捨てが発生した場合でも、例外は発生しません(以下を参照)。

format は、フォーマットされた出力文字列の合計サイズを1000バイト以下に制限する必要があります。1000バイトを超えると、出力文字列は切り捨てられます。 特に、これは無制限の「%s」形式が発生してはならないことを意味します。 これらは「%」を使用して制限する必要があります。 s」ここでは、次のように計算された10進数です。 さらに、他のフォーマットされたテキストの最大サイズは1000バイトを超えません。 また、非常に大きな数に対して数百桁を印刷できる「%f」にも注意してください。

問題が発生した場合、または sys.stdout が設定されていない場合、フォーマットされたメッセージは実際の(Cレベル) stdout に書き込まれます。

void PySys_WriteStderr(const char *format, ...)
PySys_WriteStdout()と同じですが、代わりに sys.stderr または stderr に書き込みます。
void PySys_FormatStdout(const char *format, ...)

PySys_WriteStdout()と同様の機能ですが、 PyUnicode_FromFormatV()を使用してメッセージをフォーマットし、メッセージを任意の長さに切り捨てないでください。

バージョン3.2の新機能。

void PySys_FormatStderr(const char *format, ...)

PySys_FormatStdout()と同じですが、代わりに sys.stderr または stderr に書き込んでください。

バージョン3.2の新機能。

void PySys_AddXOption(const wchar_t *s)

s-X オプションのセットとして解析し、 PySys_GetXOptions()によって返される現在のオプションマッピングに追加します。 この関数は、 Py_Initialize()の前に呼び出すことができます。

バージョン3.2の新機能。

PyObject *PySys_GetXOptions()

sys._xoptions と同様に、 -X オプションの現在の辞書を返します。 エラーの場合、NULLが返され、例外が設定されます。

バージョン3.2の新機能。

int PySys_Audit(const char *event, const char *format, ...)

アクティブなフックを使用して監査イベントを発生させます。 成功した場合はゼロを返し、失敗した場合は例外を設定してゼロ以外を返します。

フックが追加されている場合は、 format およびその他の引数を使用して、渡すタプルを作成します。 Nを除いて、 Py_BuildValue()で使用されているのと同じフォーマット文字を使用できます。 構築された値がタプルでない場合は、単一要素のタプルに追加されます。 (N形式オプションは参照を消費しますが、この関数の引数が消費されるかどうかを知る方法がないため、これを使用すると参照リークが発生する可能性があります。)

#形式の文字は、PY_SSIZE_T_CLEANが定義されているかどうかに関係なく、常にPy_ssize_tとして扱われる必要があることに注意してください。

sys.audit()は、Pythonコードから同じ機能を実行します。

バージョン3.8の新機能。

バージョン3.8.2で変更: #形式の文字にはPy_ssize_tが必要です。 以前は、やむを得ない非推奨の警告が出されていました。

int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)

呼び出し可能なフックをアクティブな監査フックのリストに追加します。 成功した場合はゼロを返し、失敗した場合はゼロ以外を返します。 ランタイムが初期化されている場合は、失敗時にエラーも設定します。 このAPIを介して追加されたフックは、ランタイムによって作成されたすべてのインタープリターに対して呼び出されます。

userData ポインターがフック関数に渡されます。 フック関数は異なるランタイムから呼び出される可能性があるため、このポインターはPythonの状態を直接参照しないでください。

この関数は、 Py_Initialize()の前に安全に呼び出すことができます。 ランタイムの初期化後に呼び出されると、既存の監査フックに通知され、 Exception からサブクラス化されたエラーを発生させることで操作をサイレントに中止できます(他のエラーはサイレンシングされません)。

フック関数のタイプは int(*)(const char * event、PyObject * args、void * userData)です。ここで、 argsPyTupleObject であることが保証されています。 ]。 フック関数は常に、イベントを発生させたPythonインタープリターによって保持されているGILで呼び出されます。

監査の詳細については、 PEP 578 を参照してください。 イベントを発生させるランタイムおよび標準ライブラリの関数は、監査イベントテーブルにリストされています。 詳細は、各関数のドキュメントに記載されています。

バージョン3.8の新機能。


プロセス制御

void Py_FatalError(const char *message)
致命的なエラーメッセージを出力し、プロセスを強制終了します。 クリーンアップは実行されません。 この関数は、Pythonインタープリターの使用を継続するのが危険になる条件が検出された場合にのみ呼び出す必要があります。 たとえば、オブジェクト管理が破損しているように見える場合。 Unixでは、標準Cライブラリ関数abort()が呼び出され、coreファイルの生成が試みられます。
void Py_Exit(int status)

現在のプロセスを終了します。 これにより、 Py_FinalizeEx()が呼び出され、次に標準Cライブラリ関数exit(status)が呼び出されます。 Py_FinalizeEx()がエラーを示している場合、終了ステータスは120に設定されます。

バージョン3.6で変更:ファイナライズからのエラーは無視されなくなりました。

int Py_AtExit(void (*func)())
Py_FinalizeEx()によって呼び出されるクリーンアップ関数を登録します。 クリーンアップ関数は引数なしで呼び出され、値を返さないはずです。 最大32個のクリーンアップ機能を登録できます。 登録が成功すると、 Py_AtExit()0を返します。 失敗すると、-1を返します。 最後に登録されたクリーンアップ関数が最初に呼び出されます。 各クリーンアップ関数は、最大で1回呼び出されます。 Pythonの内部ファイナライズはクリーンアップ関数の前に完了するため、 func によってPythonAPIを呼び出さないでください。