مقداردهی اولیه و نهاییسازی مفسر¶
برای جزئیات دربارهی چگونگی پیکربندی مفسر پیش از مقداردهی اولیه، به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.
پیش از مقداردهی اولیه پایتون¶
در برنامهای که پایتون را تعبیه میکند، تابع Py_Initialize() باید پیش از استفاده از هر تابع دیگری از Python/C API فراخوانی شود؛ به استثنای چند تابع و متغیرهای پیکربندی سراسری.
توابع زیر را میتوان پیش از مقداردهی اولیه پایتون بهطور ایمن فراخوانی کرد:
توابعی که مفسر را راهاندازی میکنند:
توابع پیشمقداردهی رانتایم که در پیکربندی راهاندازی پایتون شرح داده شدهاند
توابع پیکربندی:
PyInitFrozenExtensions()توابع پیکربندی که در پیکربندی راهاندازی پایتون شرح داده شدهاند
توابع اطلاعاتی:
ابزارها:
توابع گزارشدهی وضعیت و توابع ابزاری که در پیکربندی راهاندازی پایتون پوشش داده شدهاند
تخصیصدهندههای حافظه:
همگامسازی:
توجه
با وجود شباهت ظاهری آنها به برخی از توابع فهرستشده در بالا، توابع زیر پیش از مقداردهی اولیهی مفسر نباید فراخوانی شوند: Py_EncodeLocale()، PyEval_InitThreads() و Py_RunMain().
متغیرهای پیکربندی سراسری¶
پایتون برای پیکربندی سراسری، متغیرهایی دارد که قابلیتها و گزینههای مختلف را کنترل میکنند. بهطور پیشفرض، این پرچمها توسط گزینههای خط فرمان کنترل میشوند.
هنگامی که یک پرچم توسط گزینهای تنظیم میشود، مقدار پرچم برابر با تعداد دفعاتی است که آن گزینه مشخص شده است. برای مثال، -b مقدار Py_BytesWarningFlag را روی ۱ تنظیم میکند و -bb مقدار Py_BytesWarningFlag را روی ۲ تنظیم میکند.
-
int Py_BytesWarningFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن، باید از تنظیم
PyConfig.bytes_warningاستفاده کرد؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.هنگام مقایسهی
bytesیاbytearrayباstr، یاbytesباintهشدار صادر میکند. در صورت بزرگتر یا مساوی2بودن، خطا صادر میکند.توسط گزینهی
-bتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_DebugFlag¶
این API برای سازگاری با نسخههای قبلی حفظ شده است: به جای آن باید
PyConfig.parser_debugرا تنظیم کنید؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.فعال کردن خروجی اشکالزدایی پارسر (فقط برای متخصصان، بسته به گزینههای کامپایل).
توسط گزینهی
-dو متغیر محیطیPYTHONDEBUGتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_DontWriteBytecodeFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید از تنظیم
PyConfig.write_bytecodeاستفاده شود؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.اگر روی مقدار غیرصفر تنظیم شود، پایتون هنگام ایمپورت ماژولهای منبع تلاش نمیکند پروندههای
.pycرا بنویسد.توسط گزینهی
-Bو متغیر محیطیPYTHONDONTWRITEBYTECODEتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_FrozenFlag¶
این API برای سازگاری با نسخههای قبلی حفظ شده است: به جای آن باید
PyConfig.pathconfig_warningsرا تنظیم کنید؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.پرچم خصوصی استفادهشده توسط برنامههای
_freeze_moduleوfrozenmain.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_HashRandomizationFlag¶
این API برای سازگاری با نسخههای پیشین نگه داشته شده است: به جای آن باید از تنظیم
PyConfig.hash_seedوPyConfig.use_hash_seedاستفاده شود؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.اگر متغیر محیطی
PYTHONHASHSEEDبه یک رشتهی غیرخالی تنظیم شده باشد، روی1تنظیم میشود.اگر پرچم ناصفر باشد، متغیر محیطی
PYTHONHASHSEEDبرای مقداردهی اولیهی بذر هش مخفی خوانده میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_IgnoreEnvironmentFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید
PyConfig.use_environmentتنظیم شود؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.نادیده گرفتن تمام متغیرهای محیطی
PYTHON*، مانندPYTHONPATHوPYTHONHOME، که ممکن است تنظیم شده باشند.توسط گزینههای
-Eو-Iتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_InspectFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید از تنظیم
PyConfig.inspectاستفاده کرد؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.وقتی یک اسکریپت بهعنوان آرگومان اول داده شود یا از گزینهی
-cاستفاده شود، پس از اجرای اسکریپت یا دستور وارد حالت تعاملی میشود، حتی زمانی که به نظر نمیرسدsys.stdinیک پایانه باشد.تنظیم میشود توسط گزینهی
-iو متغیر محیطیPYTHONINSPECT.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_InteractiveFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید
PyConfig.interactiveرا تنظیم کنید؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.با گزینهی
-iتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_IsolatedFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید از تنظیم
PyConfig.isolatedاستفاده شود؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.پایتون را در حالت ایزوله اجرا کنید. در حالت ایزوله،
sys.pathنه پوشهی اسکریپت و نه پوشهی site-packages کاربر را در بر میگیرد.توسط گزینهی
-Iتنظیم میشود.اضافه شده در نسخهی 3.4.
منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_LegacyWindowsFSEncodingFlag¶
این API برای سازگاری با نسخههای قبلی حفظ شده است: به جای آن باید
PyPreConfig.legacy_windows_fs_encodingرا تنظیم کرد؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.اگر پرچم ناصفر باشد، بهجای کدگذاری UTF-8 با هندلر خطای
surrogatepass، از کدگذاریmbcsبا هندلر خطایreplaceبرای filesystem encoding and error handler استفاده میشود.اگر متغیر محیطی
PYTHONLEGACYWINDOWSFSENCODINGبه یک رشته غیرخالی تنظیم شده باشد، به1تنظیم میشود.برای جزئیات بیشتر به PEP 529 مراجعه کنید.
دسترسپذیری: Windows.
منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_LegacyWindowsStdioFlag¶
این API برای سازگاری با گذشته حفظ شده است: به جای آن باید
PyConfig.legacy_windows_stdioتنظیم شود؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.اگر پرچم ناصفر باشد، برای جریانهای استاندارد
sysبهجایio._WindowsConsoleIOازio.FileIOاستفاده میشود.اگر متغیر محیطی
PYTHONLEGACYWINDOWSSTDIOروی یک رشتهی غیرخالی تنظیم شده باشد، روی1تنظیم میشود.برای جزئیات بیشتر به PEP 528 مراجعه کنید.
دسترسپذیری: Windows.
منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_NoSiteFlag¶
این API برای سازگاری به عقب نگه داشته شده است: به جای آن باید
PyConfig.site_importرا تنظیم کنید؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.ایمپورت ماژول
siteو دستکاریهای وابسته به site درsys.pathکه این ایمپورت به همراه دارد را غیرفعال میکند. همچنین اگرsiteبعداً بهطور صریح ایمپورت شود، این دستکاریها را غیرفعال میکند (اگر میخواهید این دستکاریها انجام شوند،site.main()را فراخوانی کنید).توسط گزینهی
-Sتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_NoUserSiteDirectory¶
این API برای سازگاری با نسخههای قبلی حفظ شده است: به جای آن باید
PyConfig.user_site_directoryرا تنظیم کنید؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.پوشهی site-packages کاربررا بهsys.pathاضافه نکنید.با گزینههای
-sو-Iو متغیر محیطیPYTHONNOUSERSITEتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_OptimizeFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید
PyConfig.optimization_levelرا تنظیم کرد؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.توسط گزینهی
-Oو متغیر محیطیPYTHONOPTIMIZEتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_QuietFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید
PyConfig.quietرا تنظیم کنید؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.پیامهای حق نشر و نسخه را حتی در حالت تعاملی نمایش ندهید.
توسط گزینهی
-qتنظیم میشود.اضافه شده در نسخهی 3.2.
منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_UnbufferedStdioFlag¶
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید
PyConfig.buffered_stdioرا تنظیم کنید؛ به پیکربندی راهاندازی پایتون مراجعه کنید.جریانهای stdout و stderr را مجبور کنید که بدون بافر باشند.
با گزینهی
-uو متغیر محیطیPYTHONUNBUFFEREDتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
-
int Py_VerboseFlag¶
این API برای سازگاری با نسخههای قبلی نگه داشته شده است: به جای آن باید
PyConfig.verboseرا تنظیم کنید؛ برای جزئیات به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.هر بار که یک ماژول مقداردهی اولیه میشود، پیامی چاپ میکند که نشان میدهد ماژول از کدام مکان (نام پرونده یا ماژول توکار) بارگذاری شده است. اگر بزرگتر یا مساوی
2باشد، برای هر پروندهای که هنگام جستجوی یک ماژول بررسی میشود پیامی چاپ میکند. همچنین اطلاعاتی درباره پاکسازی ماژولها هنگام خروج ارائه میدهد.با گزینهی
-vو متغیر محیطیPYTHONVERBOSEتنظیم میشود.منسوخ شده از نسخهی 3.12, در نسخهی 3.15 حذف خواهد شد.
راهاندازی و نهاییسازی مفسر¶
-
void Py_Initialize()¶
- قسمتی از ABI پایدار.
مفسر پایتون را راهاندازی میکند. در برنامهای که پایتون را تعبیه میکند، این تابع باید پیش از استفاده از هر تابع دیگری از Python/C API فراخوانی شود؛ برای استثناهای معدود، پیش از راهاندازی پایتون را ببینید.
این کار جدول ماژولهای بارگذاریشده (
sys.modules) را مقداردهی اولیه میکند و ماژولهای بنیادیbuiltins،__main__وsysرا ایجاد میکند. همچنین مسیر جستجوی ماژول (sys.path) را مقداردهی اولیه میکند. این کارsys.argvرا تنظیم نمیکند؛ برای این منظور از API پیکربندی مقداردهی اولیه پایتون استفاده کنید. این کار هنگام فراخوانی برای بار دوم (بدون فراخوانیPy_FinalizeEx()پیش از آن) یک عملیات بیاثر است. هیچ مقدار بازگشتی وجود ندارد؛ در صورت شکست مقداردهی اولیه، خطای مهلک رخ میدهد.از
Py_InitializeFromConfig()برای سفارشیسازی پیکربندی راهاندازی پایتون استفاده کنید.توجه
در ویندوز، حالت کنسول را از
O_TEXTبهO_BINARYتغییر میدهد که بر استفادههای غیرپایتونی از کنسول با استفاده از زمان اجرای C (C Runtime) نیز تأثیر میگذارد.
-
void Py_InitializeEx(int initsigs)¶
- قسمتی از ABI پایدار.
اگر initsigs برابر
1باشد، این تابع مانندPy_Initialize()عمل میکند. اگر initsigs برابر0باشد، از ثبت هندلرهای سیگنال در زمان راهاندازی صرفنظر میکند، که این امر میتواند زمانی مفید باشد که سیپایتون بهعنوان بخشی از یک برنامه بزرگتر تعبیه شده باشد.از
Py_InitializeFromConfig()برای سفارشیسازی پیکربندی راهاندازی پایتون استفاده کنید.
-
PyStatus Py_InitializeFromConfig(const PyConfig *config)¶
پایتون را از پیکربندی config مقداردهی اولیه کنید، همانطور که در مقداردهی اولیه با PyConfig توضیح دادهشده است.
برای جزئیات دربارهی پیشراهاندازی مفسر، پر کردن ساختار پیکربندی رانتایم و پرسوجو از ساختار وضعیت بازگشتی، به بخش پیکربندی راهاندازی پایتون مراجعه کنید.
-
int Py_IsInitialized()¶
- قسمتی از ABI پایدار.
هنگامی که مفسر پایتون مقداردهی اولیه شده باشد، true (غیرصفر) را برمیگرداند و در غیر این صورت false (صفر) را برمیگرداند. پس از فراخوانی
Py_FinalizeEx()، این تابع تا زمانی کهPy_Initialize()دوباره فراخوانی شود، false برمیگرداند.
-
int Py_IsFinalizing()¶
- قسمتی از ABI پایدار از نسخهی 3.13.
اگر مفسر اصلی پایتون در حال خاموش شدن باشد، مقدار true (غیرصفر) را برمیگرداند. در غیر این صورت مقدار false (صفر) را برمیگرداند.
اضافه شده در نسخهی 3.13.
-
int Py_FinalizeEx()¶
- قسمتی از ABI پایدار از نسخهی 3.6.
تمام مقداردهیهای اولیهای که توسط
Py_Initialize()و استفادههای بعدی از توابع Python/C API انجام شدهاند را لغو میکند، و تمام زیرمفسرهایی (بهPy_NewInterpreter()در ادامه مراجعه کنید) که از آخرین فراخوانیPy_Initialize()ایجاد شدهاند و هنوز نابود نشدهاند را نابود میکند. این تابع در صورت فراخوانی برای بار دوم (بدون فراخوانی مجددPy_Initialize()در ابتدا) یک عملیات بیاثر است.از آنجا که این تابع معکوسِ
Py_Initialize()است، باید در همان نخ و با همان مفسرِ فعال فراخوانی شود. این به معنای نخ اصلی و مفسر اصلی است. این تابع هرگز نباید در حین اجرایPy_RunMain()فراخوانی شود.معمولاً مقدار بازگشتی
0است. اگر هنگام نهاییسازی (تخلیه دادههای بافرشده) خطاهایی رخ داده باشد،-1بازگردانده میشود.توجه داشته باشید که پایتون تلاش حداکثری خود را برای آزادسازی تمام حافظهای که توسط مفسر پایتون تخصیص یافته است، انجام میدهد. بنابراین، هر ماژول توسعهای C باید مطمئن شود که همهی اشیای PyObject که پیشتر تخصیص یافتهاند، پیش از استفاده از آنها در فراخوانیهای بعدی
Py_Initialize()بهدرستی پاکسازی میشوند. در غیر این صورت، ممکن است آسیبپذیریها و رفتار نادرست ایجاد شود.این تابع به دلایل متعددی ارائه شده است. یک برنامه جاساز ممکن است بخواهد پایتون را از نو راهاندازی کند، بدون آنکه لازم باشد خودِ برنامه را راهاندازی مجدد کند. برنامهای که مفسر پایتون را از یک کتابخانه بارگذاریپذیر پویا (یا DLL) بارگذاری کرده است، ممکن است بخواهد پیش از تخلیه DLL، تمام حافظه تخصیصیافته توسط پایتون را آزاد کند. در جریان ردیابی نشت حافظه در یک برنامه، ممکن است توسعهدهندهای بخواهد پیش از خروج از برنامه، تمام حافظه تخصیصیافته توسط پایتون را آزاد کند.
باگها و هشدارها: تخریب ماژولها و اشیاء موجود در ماژولها به ترتیب تصادفی انجام میشود؛ این ممکن است باعث شود مخربها (متدهای
__del__()) هنگامی که به اشیاء دیگر (حتی توابع) یا ماژولها وابستهاند، شکست بخورند. ماژولهای توسعهای که بهصورت پویا توسط پایتون بارگذاری شدهاند، تخلیه نمیشوند. مقادیر کمی از حافظهی تخصیصیافته توسط مفسر پایتون ممکن است آزاد نشوند (اگر نشتی حافظه پیدا کردید، لطفاً آن را گزارش کنید). حافظهی درگیر در ارجاعهای چرخهای میان اشیاء آزاد نمیشود. همهی رشتههای درونیسازیشده (interned strings) صرفنظر از شمارش ارجاعشان آزاد میشوند. مقداری از حافظهی تخصیصیافته توسط ماژولهای توسعهای ممکن است آزاد نشود. برخی ماژولهای توسعهای ممکن است اگر روال مقداردهی اولیهشان بیش از یک بار فراخوانی شود، بهدرستی کار نکنند؛ این میتواند در صورتی رخ دهد که برنامهایPy_Initialize()وPy_FinalizeEx()را بیش از یک بار فراخوانی کند.Py_FinalizeEx()نباید بهصورت بازگشتی از درون خود فراخوانی شود. بنابراین، هیچ کدی که ممکن است بهعنوان بخشی از فرایند خاموششدن مفسر اجرا شود، نباید آن را فراخوانی کند؛ مانند هندلرهایatexit، نهاییسازهای شیء، یا هر کدی که ممکن است هنگام تخلیهی پروندههای stdout و stderr اجرا شود.یک رویداد حسابرسی
cpython._PySys_ClearAuditHooksرا بدون هیچ آرگومانی ایجاد میکند.اضافه شده در نسخهی 3.6.
-
void Py_Finalize()¶
- قسمتی از ABI پایدار.
این نسخهای سازگار با نسخههای پیشین از
Py_FinalizeEx()است که مقدار بازگشتی را نادیده میگیرد.
-
int Py_BytesMain(int argc, char **argv)¶
- قسمتی از ABI پایدار از نسخهی 3.8.
مشابه
Py_Main()است، اما argv آرایهای از رشتههای بایت است و به برنامهی فراخواننده اجازه میدهد مرحلهی کدگشایی متن را به رانتایم سیپایتون واگذار کند.اضافه شده در نسخهی 3.8.
-
int Py_Main(int argc, wchar_t **argv)¶
- قسمتی از ABI پایدار.
برنامه اصلی مفسر استاندارد که یک چرخه کامل مقداردهی اولیه/نهاییسازی را در بر میگیرد، و همچنین رفتار اضافی برای پیادهسازی خواندن تنظیمات پیکربندی از محیط و خط فرمان و سپس اجرای
__main__مطابق با خط فرمان.این برای برنامههایی فراهم شده است که میخواهند از رابط کامل خط فرمان سیپایتون پشتیبانی کنند، نه صرفاً رانتایم پایتون را در برنامهای بزرگتر تعبیه کنند.
پارامترهای argc و argv مشابه پارامترهایی هستند که به تابع
main()یک برنامهی C پاس داده میشوند، با این تفاوت که ورودیهای argv ابتدا با استفاده ازPy_DecodeLocale()بهwchar_tتبدیل میشوند. همچنین توجه به این نکته مهم است که ورودیهای فهرست آرگومانها ممکن است بهگونهای تغییر داده شوند که به رشتههایی غیر از رشتههای پاسدادهشده اشاره کنند (با این حال، محتویات رشتههایی که فهرست آرگومانها به آنها اشاره میکند، تغییر نمیکنند).اگر فهرست آرگومانها نمایانگر خط فرمان معتبر پایتون نباشد، مقدار بازگشتی
2است و در غیر این صورت همانندPy_RunMain()است.بر اساس APIهای پیکربندی رانتایم سیپایتون که در بخش پیکربندی رانتایم مستند شدهاند (و بدون در نظر گرفتن مدیریت خطا)،
Py_Mainتقریباً معادل است با:PyConfig config; PyConfig_InitPythonConfig(&config); PyConfig_SetArgv(&config, argc, argv); Py_InitializeFromConfig(&config); PyConfig_Clear(&config); Py_RunMain();
در استفادهی معمول، یک برنامه تعبیهکننده این تابع را بهجای فراخوانی مستقیم
Py_Initialize()،Py_InitializeEx()یاPy_InitializeFromConfig()فراخوانی میکند و تمام تنظیمات همانگونه که در جای دیگر این مستندات توضیح داده شده است، اعمال خواهند شد. اگر این تابع در عوض پس از یک فراخوانی قبلی از API مقداردهی اولیهی رانتایم فراخوانی شود، دقیقاً اینکه کدام تنظیمات پیکربندی محیطی و خط فرمان بهروزرسانی خواهند شد، وابسته به نسخه است (زیرا به این بستگی دارد که کدام تنظیمات بهدرستی از این پشتیبانی میکنند که پس از آنکه یکبار در نخستین مقداردهی اولیهی رانتایم تنظیم شدهاند، تغییر کنند).
-
int Py_RunMain(void)¶
ماژول اصلی را در یک رانتایم سیپایتون کاملاً پیکربندیشده اجرا میکند.
دستور (
PyConfig.run_command)، اسکریپت (PyConfig.run_filename) یا ماژول (PyConfig.run_module) مشخصشده در خط فرمان یا در پیکربندی را اجرا میکند. اگر هیچکدام از این مقادیر تنظیم نشده باشند، پوسته تعاملی پایتون (REPL) را با استفاده از فضای نام سراسری ماژول__main__اجرا میکند.اگر
PyConfig.inspectتنظیم نشده باشد (پیشفرض)، مقدار بازگشتی در صورت خروج عادی مفسر (یعنی بدون ایجاد استثنا)0خواهد بود، در صورت وقوع استثنای مدیریتنشدهیSystemExitبرابر با وضعیت خروج آن، و برای هر استثنای مدیریتنشدهی دیگر1.اگر
PyConfig.inspectتنظیم شده باشد (مانند زمانی که از گزینهی-iاستفاده میشود)، بهجای آنکه هنگام خروج مفسر بازگشت رخ دهد، اجرا در یک اعلان تعاملی پایتون (REPL) با استفاده از فضای نام سراسری ماژول__main__از سر گرفته میشود. اگر مفسر با یک استثنا خارج شده باشد، آن استثنا بلافاصله در نشست REPL پرتاب میشود. سپس مقدار بازگشتی تابع بر اساس نحوهی خاتمهی نشست REPL تعیین میشود:0،1، یا وضعیت یکSystemExit، همانطور که در بالا مشخص شده است.این تابع همیشه پیش از بازگشت، مفسر پایتون را نهاییسازی میکند.
برای مثالی از یک پایتون سفارشیشده که همیشه در حالت ایزوله با استفاده از
Py_RunMain()اجرا میشود، به پیکربندی پایتون مراجعه کنید.
-
int PyUnstable_AtExit(PyInterpreterState *interp, void (*func)(void*), void *data)¶
- این است API ناپایداراین ممکن است بدون هشدار در نسخههای جزئی تغییر کند.
برای مفسر هدف interp یک کالبک
atexitثبت میکند. این مشابهPy_AtExit()است، اما یک مفسر صریح و اشارهگر داده برای کالبک دریافت میکند.باید یک attached thread state برای interp وجود داشته باشد.
اضافه شده در نسخهی 3.13.
هشدارهایی دربارهی نهاییسازی رانتایم¶
در مرحلهی پایانیِ خاموشی مفسر، پس از تلاش برای منتظر ماندن تا خروج نخهای غیر دِیمِن (هرچند این انتظار ممکن است توسط KeyboardInterrupt قطع شود) و اجرای توابع atexit، رانتایم بهعنوان در حال نهاییسازی علامتگذاری میشود: Py_IsFinalizing() و sys.is_finalizing() مقدار true را برمیگردانند. در این نقطه، تنها نخ نهاییسازی که نهاییسازی را آغاز کرده است (معمولاً نخ اصلی) مجاز است قفل مفسر سراسری (GIL) را به دست آورد.
اگر نخی غیر از نخ نهاییسازی، در حین نهاییسازی، چه بهطور صریح و چه بهطور ضمنی، تلاش کند یک thread state را متصل کند، آن نخ وارد وضعیت مسدود دائمی میشود و تا زمان خروج برنامه در همان وضعیت باقی میماند. در بیشتر موارد این بیضرر است، اما اگر مرحلهای بعدی از نهاییسازی تلاش کند قفلی را که در اختیار نخ مسدود است به دست آورد یا به نحوی دیگر منتظر نخ مسدود بماند، این میتواند منجر به بنبست شود.
زشت است؟ بله. این کار از فروپاشیهای تصادفی و/یا رد شدن غیرمنتظرهی نهاییسازیهای C++ در بخشهای بالاتر پشته فراخوانی جلوگیری میکند؛ همان مشکلاتی که در سیپایتون 3.13 و نسخههای پیشین، هنگامی که چنین نخهایی در اینجا بهاجبار خارج میشدند، پیش میآمدند. APIهای C مربوط به وضعیت نخ در رانتایم سیپایتون هیچگاه در زمان اتصال وضعیت نخ هیچگونه انتظاری برای گزارش یا مدیریت خطا نداشتهاند که خروج منظم از این وضعیت را ممکن میساخت. تغییر این امر نیازمند ایجاد APIهای C پایدار جدید و بازنویسی بخش عمدهی کدهای C در اکوسیستم سیپایتون برای استفاده از آنها همراه با مدیریت خطا خواهد بود.
پارامترهای در سطح فرایند¶
-
void Py_SetProgramName(const wchar_t *name)¶
- قسمتی از ABI پایدار.
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید
PyConfig.program_nameرا تنظیم کنید؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.این تابع، اگر اصلاً فراخوانی شود، باید پیش از آنکه
Py_Initialize()برای نخستین بار فراخوانی شود، فراخوانی شود. این تابع مقدار آرگومانargv[0]تابعmain()برنامه را به مفسر اطلاع میدهد (تبدیلشده به نویسههای پهن). این مقدار توسطPy_GetPath()و برخی توابع دیگر در ادامه برای یافتن کتابخانههای زمان اجرای پایتون نسبت به پرونده اجرایی مفسر استفاده میشود. مقدار پیشفرض'python'است. این آرگومان باید به یک رشتهی نویسههای پهن خاتمهیافته با نویسهی تهی (zero-terminated) در حافظهی ایستا اشاره کند که محتوای آن در طول اجرای برنامه تغییر نخواهد کرد. هیچ کدی در مفسر پایتون محتوای این حافظه را تغییر نخواهد داد.برای کدگشایی یک رشته بایتی و بهدست آوردن یک رشتهی wchar_t* از
Py_DecodeLocale()استفاده کنید.منسوخ شده از نسخهی 3.11, در نسخهی 3.15 حذف خواهد شد.
-
wchar_t *Py_GetProgramName()¶
- قسمتی از ABI پایدار.
نام برنامهی تنظیمشده با
PyConfig.program_nameیا مقدار پیشفرض را برمیگرداند. رشتهی بازگرداندهشده به فضای ذخیرهسازی ایستا اشاره میکند؛ فراخواننده نباید مقدار آن را تغییر دهد.این تابع نباید پیش از
Py_Initialize()فراخوانی شود، در غیر این صورتNULLرا برمیگرداند.تغییر یافته در نسخهی 3.10: اکنون اگر پیش از
Py_Initialize()فراخوانی شود،NULLرا برمیگرداند.منسوخ شده از نسخهی 3.13, در نسخهی 3.15 حذف خواهد شد: به جای آن از
PyConfig_Get("executable")(sys.executable) استفاده کنید.
-
wchar_t *Py_GetPrefix()¶
- قسمتی از ABI پایدار.
پیشوند پروندههای نصبشدهی مستقل از پلتفرم را برمیگرداند. این پیشوند بر اساس تعدادی قاعدهی پیچیده، از نام برنامهای که با
PyConfig.program_nameتنظیمشده است و برخی متغیرهای محیطی به دست میآید؛ برای نمونه، اگر نام برنامه'/usr/local/bin/python'باشد، پیشوند'/usr/local'است. رشتهی بازگرداندهشده به حافظهی ایستا اشاره میکند؛ فراخواننده نباید مقدار آن را تغییر دهد. این مقدار با متغیر prefix درMakefileسطح بالا و آرگومان--prefixاسکریپت configure در زمان ساخت مطابقت دارد. این مقدار برای کد پایتون بهصورتsys.base_prefixدر دسترس است. فقط روی یونیکس کاربرد دارد. همچنین تابع بعدی را ببینید.این تابع نباید پیش از
Py_Initialize()فراخوانی شود، در غیر این صورتNULLرا برمیگرداند.تغییر یافته در نسخهی 3.10: اکنون اگر پیش از
Py_Initialize()فراخوانی شود،NULLرا برمیگرداند.منسوخ شده از نسخهی 3.13, در نسخهی 3.15 حذف خواهد شد: بهجای آن از
PyConfig_Get("base_prefix")(sys.base_prefix) استفاده کنید. اگر لازم است محیطهای مجازی مدیریت شوند، ازPyConfig_Get("prefix")(sys.prefix) استفاده کنید.
-
wchar_t *Py_GetExecPrefix()¶
- قسمتی از ABI پایدار.
پیشوند اجرا (exec-prefix) را برای پروندههای نصبشدهی وابسته به پلتفرم برمیگرداند. این مقدار بر اساس تعدادی قاعدهی پیچیده از نام برنامهی تنظیمشده با
PyConfig.program_nameو برخی متغیرهای محیطی به دست میآید؛ برای مثال، اگر نام برنامه'/usr/local/bin/python'باشد، پیشوند اجرا'/usr/local'است. رشتهی بازگرداندهشده به حافظهی ایستا اشاره میکند؛ فراخواننده نباید مقدار آن را تغییر دهد. این مقدار با متغیر exec_prefix درMakefileسطح بالا و آرگومان--exec-prefixاسکریپت configure در زمان ساخت مطابقت دارد. این مقدار در کد پایتون بهصورتsys.base_exec_prefixدر دسترس است. این مقدار فقط در یونیکس کاربرد دارد.پیشزمینه: پیشوند اجرا هنگامی از پیشوند متفاوت است که پروندههای وابسته به پلتفرم (مانند پروندههای اجرایی و کتابخانههای اشتراکی) در درخت پوشهی متفاوتی نصب شوند. در یک نصب معمولی، ممکن است پروندههای وابسته به پلتفرم در زیردرخت
/usr/local/platنصب شوند، در حالی که پروندههای مستقل از پلتفرم ممکن است در/usr/localنصب شوند.بهطور کلی، یک پلتفرم ترکیبی از خانوادههای سختافزاری و نرمافزاری است؛ برای مثال، ماشینهای Sparc که سیستمعامل Solaris 2.x را اجرا میکنند، یک پلتفرم واحد محسوب میشوند، اما ماشینهای Intel که Solaris 2.x را اجرا میکنند، پلتفرم دیگری هستند و ماشینهای Intel که لینوکس را اجرا میکنند، پلتفرمی دیگر. نسخههای اصلی مختلف یک سیستمعامل واحد نیز بهطور کلی پلتفرمهای متفاوتی را تشکیل میدهند. سیستمعاملهای غیر یونیکسی داستان دیگری دارند؛ راهبردهای نصب در این سیستمها چنان متفاوت است که پیشوند و پیشوند اجرا بیمعنا هستند و روی رشته خالی تنظیم میشوند. توجه داشته باشید که پروندههای بایتکد کامپایلشده پایتون مستقل از پلتفرم هستند (اما از نسخه پایتونی که آنها را کامپایل کرده است، مستقل نیستند!).
مدیران سیستم میدانند چگونه برنامههای mount یا automount را پیکربندی کنند تا
/usr/localمیان پلتفرمها به اشتراک گذاشته شود، در حالی که/usr/local/platبرای هر پلتفرم یک سامانه فایلبندی متفاوت باشد.این تابع نباید پیش از
Py_Initialize()فراخوانی شود، در غیر این صورتNULLرا برمیگرداند.تغییر یافته در نسخهی 3.10: اکنون اگر پیش از
Py_Initialize()فراخوانی شود،NULLرا برمیگرداند.منسوخ شده از نسخهی 3.13, در نسخهی 3.15 حذف خواهد شد: بهجای آن از
PyConfig_Get("base_exec_prefix")(sys.base_exec_prefix) استفاده کنید. اگر لازم باشد محیطهای مجازی مدیریت شوند، ازPyConfig_Get("exec_prefix")(sys.exec_prefix) استفاده کنید.
-
wchar_t *Py_GetProgramFullPath()¶
- قسمتی از ABI پایدار.
نام کامل برنامهی اجرایی پایتون را برمیگرداند؛ این نام بهعنوان یک عارضهی جانبی از استخراج مسیر جستجوی پیشفرض ماژول از نام برنامه (که توسط
PyConfig.program_nameتنظیم میشود) محاسبه میشود. رشتهی بازگرداندهشده به حافظهی ایستا اشاره میکند؛ فراخواننده نباید مقدار آن را تغییر دهد. این مقدار برای کد پایتون به صورتsys.executableدر دسترس است.این تابع نباید پیش از
Py_Initialize()فراخوانی شود، در غیر این صورتNULLرا برمیگرداند.تغییر یافته در نسخهی 3.10: اکنون اگر پیش از
Py_Initialize()فراخوانی شود،NULLرا برمیگرداند.منسوخ شده از نسخهی 3.13, در نسخهی 3.15 حذف خواهد شد: به جای آن از
PyConfig_Get("executable")(sys.executable) استفاده کنید.
-
wchar_t *Py_GetPath()¶
- قسمتی از ABI پایدار.
مسیر جستجوی پیشفرض ماژول را برمیگرداند؛ این مسیر از نام برنامه (که توسط
PyConfig.program_nameتنظیم میشود) و برخی متغیرهای محیطی محاسبه میشود. رشتهی بازگرداندهشده از مجموعهای از نام پوشهها تشکیل شده است که با نویسهی جداکنندهای وابسته به پلتفرم از هم جدا شدهاند. نویسهی جداکننده در یونیکس و مکاواس':'و در ویندوز';'است. رشتهی بازگرداندهشده به داخل ذخیرهگاه ایستا اشاره میکند؛ فراخوانکننده نباید مقدار آن را تغییر دهد. فهرستsys.pathهنگام راهاندازی مفسر با این مقدار مقداردهی اولیه میشود؛ این فهرست میتواند (و معمولاً نیز چنین میشود) بعداً برای تغییر مسیر جستجو جهت بارگذاری ماژولها تغییر کند.این تابع نباید پیش از
Py_Initialize()فراخوانی شود، در غیر این صورتNULLرا برمیگرداند.تغییر یافته در نسخهی 3.10: اکنون اگر پیش از
Py_Initialize()فراخوانی شود،NULLرا برمیگرداند.منسوخ شده از نسخهی 3.13, در نسخهی 3.15 حذف خواهد شد: به جای آن از
PyConfig_Get("module_search_paths")(sys.path) استفاده کنید.
-
const char *Py_GetVersion()¶
- قسمتی از ABI پایدار.
نسخهی این مفسر پایتون را برمیگرداند. این رشتهای است که چیزی شبیه به این است
"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \n[GCC 4.2.3]"
نخستین واژه (تا نخستین نویسه فاصله) نسخه فعلی پایتون است؛ نویسههای نخست، نسخه اصلی و فرعی هستند که با نقطه از هم جدا شدهاند. رشته بازگرداندهشده به حافظه ایستا اشاره میکند؛ فراخواننده نباید مقدار آن را تغییر دهد. این مقدار در کد پایتون به صورت
sys.versionدر دسترس است.همچنین ثابت
Py_Versionرا ببینید.
-
const char *Py_GetPlatform()¶
- قسمتی از ABI پایدار.
شناسه پلتفرم را برای پلتفرم فعلی برمیگرداند. در یونیکس، این شناسه از نام «رسمی» سیستمعامل — که به حروف کوچک تبدیل شده — و به دنبال آن شماره بازنگری اصلی تشکیل میشود؛ برای مثال، برای Solaris 2.x که با نام SunOS 5.x نیز شناخته میشود، مقدار
'sunos5'است. در macOS این مقدار'darwin'است. در ویندوز این مقدار'win'است. رشتهی بازگرداندهشده به حافظهی ایستا اشاره میکند؛ فراخوانکننده نباید مقدار آن را تغییر دهد. این مقدار در کد پایتون بهصورتsys.platformدر دسترس است.
-
const char *Py_GetCopyright()¶
- قسمتی از ABI پایدار.
رشتهی رسمی حق نشر برای نسخهی فعلی پایتون را برمیگرداند، برای مثال
'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'رشتهی بازگشتی به حافظهی ایستا اشاره میکند؛ فراخوانکننده نباید مقدار آن را تغییر دهد. این مقدار برای کد پایتون بهصورت
sys.copyrightدر دسترس است.
-
const char *Py_GetCompiler()¶
- قسمتی از ABI پایدار.
بازگرداندن نشانهای از کامپایلر استفادهشده برای ساخت نسخهی فعلی پایتون، داخل کروشه، برای مثال:
[GCC 2.7.2.2]
رشتهی بازگرداندهشده به حافظهی ایستا اشاره میکند؛ فراخواننده نباید مقدار آن را تغییر دهد. این مقدار بهعنوان بخشی از متغیر
sys.versionبرای کد پایتون در دسترس است.
-
const char *Py_GetBuildInfo()¶
- قسمتی از ABI پایدار.
اطلاعات مربوط به شماره ترتیبی و تاریخ و زمان ساخت نمونهی فعلی مفسر پایتون را برمیگرداند، برای مثال
#67, Aug 1 1997, 22:34:28رشتهی بازگرداندهشده به حافظهی ایستا اشاره میکند؛ فراخواننده نباید مقدار آن را تغییر دهد. این مقدار بهعنوان بخشی از متغیر
sys.versionبرای کد پایتون در دسترس است.
-
void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)¶
- قسمتی از ABI پایدار.
این API برای سازگاری با نسخههای پیشین نگه داشته شده است: به جای آن باید
PyConfig.argv،PyConfig.parse_argvوPyConfig.safe_pathتنظیم شوند؛ به پیکربندی راهاندازی پایتون مراجعه کنید.مقدار
sys.argvرا بر اساس argc و argv تنظیم میکند. این پارامترها مشابه پارامترهایی هستند که به تابعmain()برنامه پاس داده میشوند، با این تفاوت که نخستین ورودی باید به پروندهی اسکریپتی که قرار است اجرا شود اشاره کند، نه به پروندهی اجرایی میزبان مفسر پایتون. اگر اسکریپتی برای اجرا وجود نداشته باشد، نخستین ورودی در argv میتواند یک رشتهی خالی باشد. اگر این تابع نتواندsys.argvرا مقداردهی اولیه کند، یک وضعیت مهلک با استفاده ازPy_FatalError()اعلام میشود.اگر updatepath صفر باشد، تمام کاری که تابع انجام میدهد همین است. اگر updatepath غیرصفر باشد، تابع همچنین
sys.pathرا مطابق الگوریتم زیر تغییر میدهد:اگر نام یک اسکریپت موجود در
argv[0]ارسال شود، مسیر مطلق پوشهای که اسکریپت در آن قرار دارد به ابتدایsys.pathاضافه میشود.در غیر این صورت (یعنی اگر argc برابر
0باشد یاargv[0]به نام یک پروندهی موجود اشاره نکند)، یک رشتهی خالی به ابتدایsys.pathافزوده میشود، که معادل افزودن پوشهی کاری جاری (".") به ابتدای آن است.
برای کدگشایی یک رشته بایتی و بهدست آوردن یک رشتهی wchar_t* از
Py_DecodeLocale()استفاده کنید.همچنین اعضای
PyConfig.orig_argvوPyConfig.argvاز پیکربندی مقداردهی اولیه پایتون را ببینید.توجه
توصیه میشود برنامههایی که مفسر پایتون را برای اهدافی غیر از اجرای یک اسکریپت واحد درونسازی میکنند، مقدار
0را بهعنوان updatepath عبور دهند و در صورت تمایل، خودشانsys.pathرا بهروزرسانی کنند. به CVE 2008-5983 مراجعه کنید.در نسخههای پیش از 3.1.3، میتوانید همان اثر را با حذف دستی نخستین عنصر
sys.pathپس از فراخوانیPySys_SetArgv()به دست آورید، برای مثال با استفاده از:PyRun_SimpleString("import sys; sys.path.pop(0)\n");
اضافه شده در نسخهی 3.1.3.
منسوخ شده از نسخهی 3.11, در نسخهی 3.15 حذف خواهد شد.
-
void PySys_SetArgv(int argc, wchar_t **argv)¶
- قسمتی از ABI پایدار.
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید
PyConfig.argvوPyConfig.parse_argvرا تنظیم کرد؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.این تابع مانند
PySys_SetArgvEx()با updatepath برابر با1کار میکند، مگر آنکه مفسر python با گزینهی-Iراهاندازی شده باشد.برای کدگشایی یک رشته بایتی و بهدست آوردن یک رشتهی wchar_t* از
Py_DecodeLocale()استفاده کنید.همچنین اعضای
PyConfig.orig_argvوPyConfig.argvاز پیکربندی مقداردهی اولیه پایتون را ببینید.تغییر یافته در نسخهی 3.4: مقدار updatepath به
-Iبستگی دارد.منسوخ شده از نسخهی 3.11, در نسخهی 3.15 حذف خواهد شد.
-
void Py_SetPythonHome(const wchar_t *home)¶
- قسمتی از ABI پایدار.
این API برای سازگاری با نسخههای پیشین حفظ شده است: به جای آن باید
PyConfig.homeرا تنظیم کرد؛ به پیکربندی مقداردهی اولیه پایتون مراجعه کنید.پوشهی «home» پیشفرض را تنظیم میکند، یعنی مکان کتابخانههای استاندارد پایتون. برای معنای رشتهی آرگومان،
PYTHONHOMEرا ببینید.آرگومان باید به یک رشتهی نویسهای پایانیافته با نویسهی تهی در حافظهی ایستا اشاره کند که محتوای آن در طول مدت اجرای برنامه تغییر نخواهد کرد. هیچ کدی در مفسر پایتون محتوای این حافظه را تغییر نخواهد داد.
برای کدگشایی یک رشته بایتی و بهدست آوردن یک رشتهی wchar_t* از
Py_DecodeLocale()استفاده کنید.منسوخ شده از نسخهی 3.11, در نسخهی 3.15 حذف خواهد شد.
-
wchar_t *Py_GetPythonHome()¶
- قسمتی از ABI پایدار.
بازگرداندن «home» پیشفرض، یعنی مقداری که توسط
PyConfig.homeتنظیم شده است، یا مقدار متغیر محیطیPYTHONHOMEدر صورتی که تنظیم شده باشد.این تابع نباید پیش از
Py_Initialize()فراخوانی شود، در غیر این صورتNULLرا برمیگرداند.تغییر یافته در نسخهی 3.10: اکنون اگر پیش از
Py_Initialize()فراخوانی شود،NULLرا برمیگرداند.منسوخ شده از نسخهی 3.13, در نسخهی 3.15 حذف خواهد شد: بهجای آن از
PyConfig_Get("home")یا متغیر محیطیPYTHONHOMEاستفاده کنید.