GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing python.github.io — پرسشهای متداول دربارهی گسترش/تعبیه پرسشهای متداول دربارهی گسترش/تعبیه¶آیا میتوانم توابع خود را در C بسازم؟¶بله، شما میتوانید ماژولهای توکار حاوی توابع، متغیرها، استثناها و حتی انواع جدید را در C ایجاد کنید. این موضوع در سند توسعه و تعبیه مفسر پایتون توضیح داده شده است. بیشتر کتابهای سطح متوسط یا پیشرفته پایتون نیز به این موضوع میپردازند. آیا میتوانم توابع خودم را در C++ بسازم؟¶بله، با استفاده از ویژگیهای سازگاری با C موجود در C++. نوشتن C دشوار است؛ آیا جایگزینهایی وجود دارد؟¶بسته به اینکه شما میخواهید چه کاری انجام دهید، جایگزینهای متعددی برای نوشتن افزونههای C خودتان وجود دارد. ابزارهای شخص ثالث توصیهشده هم رویکردهایی سادهتر و هم پیشرفتهتر برای ایجاد افزونههای C و C++ برای پایتون ارائه میدهند. چگونه میتوانم دستورات دلخواه پایتون را از C اجرا کنم؟¶بالاترین تابع از نظر سطح برای انجام این کار چگونه میتوانم یک عبارت پایتون دلخواه را از C ارزیابی کنم؟¶تابع چگونه میتوانم مقادیر C را از یک شیء پایتون استخراج کنم؟¶این به نوع شیء بستگی دارد. اگر یک تاپل باشد، برای بایتها، برای بررسی نوع یک شیء، ابتدا مطمئن شوید که همچنین یک API سطح بالا برای اشیای پایتون وجود دارد که توسط رابط بهاصطلاح «انتزاعی» ارائه میشود — برای جزئیات بیشتر چگونه از Py_BuildValue() برای ایجاد تاپلی با طول دلخواه استفاده کنم؟¶نمیتوانید. بهجای آن از چگونه میتوانم متد یک شیء را از C فراخوانی کنم؟¶تابع PyObject * PyObject_CallMethod(PyObject *object, const char *method_name, const char *arg_format, ...); این برای هر شیءای که متد دارد، چه توکار و چه تعریفشده توسط کاربر، کار میکند. شما مسئولید که در نهایت مقدار بازگشتی را برای فراخوانی متد "seek" یک شیء پرونده، مثلاً با آرگومانهای ۱۰، ۰ (با فرض اینکه اشارهگر شیء پرونده "f" باشد): res = PyObject_CallMethod(f, "seek", "(ii)", 10, 0); if (res == NULL) { ... an exception occurred ... } else { Py_DECREF(res); } توجه داشته باشید که از آنجا که چگونه میتوانم خروجی PyErr_Print() (یا هر چیزی که به stdout/stderr چاپ میشود) را دریافت کنم؟¶در کد پایتون، شیءای تعریف کنید که از متد سادهترین راه برای انجام این کار استفاده از کلاس >>> import io, sys >>> sys.stdout = io.StringIO() >>> print('foo') >>> print('hello world!') >>> sys.stderr.write(sys.stdout.getvalue()) foo hello world! یک شیء سفارشی برای انجام همان کار به این شکل خواهد بود: >>> import io, sys >>> class StdoutCatcher(io.TextIOBase): ... def __init__(self): ... self.data = [] ... def write(self, stuff): ... self.data.append(stuff) ... >>> import sys >>> sys.stdout = StdoutCatcher() >>> print('foo') >>> print('hello world!') >>> sys.stderr.write(''.join(sys.stdout.data)) foo hello world! چگونه از C به یک ماژول نوشتهشده با Python دسترسی پیدا کنم؟¶میتوانید یک اشارهگر به شیء ماژول را به صورت زیر دریافت کنید: module = PyImport_ImportModule("<modulename>"); اگر ماژول هنوز ایمپورتنشده باشد (یعنی هنوز در سپس میتوانید به ویژگیهای ماژول (یعنی هر نام تعریفشده در ماژول) به صورت زیر دسترسی داشته باشید: attr = PyObject_GetAttrString(module, "<attrname>"); فراخوانی چگونه از پایتون با اشیاء C++ رابط برقرار کنم؟¶بسته به نیازمندیهای شما، رویکردهای زیادی وجود دارد. برای انجام این کار بهصورت دستی، با خواندن سند "Extending and Embedding" آغاز کنید. توجه داشته باشید که از نظر سیستم رانتایم پایتون، تفاوت چندانی میان C و C++ وجود ندارد — بنابراین راهبرد ساختن یک نوع جدید پایتون بر پایهی یک نوع ساختار C (اشارهگر) برای اشیاء C++ نیز کار خواهد کرد. برای کتابخانههای C++، نوشتن C دشوار است؛ آیا جایگزینهایی وجود دارد؟ را ببینید. من یک ماژول را با استفاده از پرونده Setup اضافه کردم و make شکست میخورد؛ چرا؟¶Setup باید با یک خط جدید پایان یابد؛ اگر خط جدیدی در آنجا نباشد، فرآیند ساخت شکست میخورد. (رفع این مشکل به چند ترفند زشت اسکریپت پوسته نیاز دارد، و این باگ آنقدر جزئی است که به نظر نمیرسد ارزش تلاش داشته باشد.) چگونه یک افزونه را اشکالزدایی کنم؟¶هنگام استفاده از GDB با افزونههای بارگذاریشده بهصورت پویا، تا زمانی که افزونهی شما بارگذاری نشود، نمیتوانید نقطه توقفی در افزونهی خود تنظیم کنید. در پرونده br _PyImport_LoadDynamicModule سپس، هنگامی که GDB را اجرا میکنید: $ gdb /local/bin/python gdb) run myscript.py gdb) continue # repeat until your extension is loaded gdb) finish # so that your extension is loaded gdb) br myfunction.c:50 gdb) continue میخواهم یک ماژول پایتون را روی سیستم لینوکسی خود کامپایل کنم، اما برخی پروندهها وجود ندارند. چرا؟¶بیشتر نسخههای بستهبندیشدهی پایتون، برخی از پروندههای مورد نیاز برای کامپایل افزونههای پایتون را شامل نمیشوند. برای Red Hat، بستهی RPM با نام python3-devel را نصب کنید تا پروندههای ضروری را دریافت کنید. برای دبیان، چگونه «ورودی ناقص» را از «ورودی نامعتبر» تشخیص دهم؟¶گاهی ممکن است بخواهید رفتار مفسر تعاملی پایتون را شبیهسازی کنید، که در آن وقتی ورودی ناقص است (مثلاً شروع یک دستور "if" را تایپ کردهاید یا پرانتزها یا علامتهای نقلقول سهگانهی رشته را نبستهاید)، یک اعلان ادامه به شما میدهد، اما وقتی ورودی نامعتبر است، بلافاصله یک پیام خطای سینتکس به شما میدهد. در پایتون میتوانید از ماژول سادهترین راه برای انجام این کار در C این است که چگونه میتوانم نمادهای تعریفنشدهی g++ یعنی __builtin_new یا __pure_virtual را پیدا کنم؟¶برای بارگذاری پویای ماژولهای توسعهای g++، باید پایتون را دوباره کامپایل کنید، آن را با استفاده از g++ دوباره لینک کنید (LINKCC را در Makefile ماژولهای پایتون تغییر دهید) و ماژول توسعهای خود را با استفاده از g++ لینک کنید (برای مثال، آیا میتوانم یک کلاس شیء بسازم که برخی از متدهای آن در C و برخی دیگر در Python پیادهسازیشده باشند (برای مثال از طریق وراثت)؟¶بله، شما میتوانید از کلاسهای توکار مانند کتابخانه Boost Python (BPL، https://www.boost.org/libs/python/doc/index.html) راهی برای انجام این کار از C++ فراهم میکند (یعنی میتوانید با استفاده از BPL از یک کلاس توسعه نوشتهشده به C++ ارثبری کنید).
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است. مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند. برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید. بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است. لطفاً کمک مالی کنید. آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC). آیا اشکالی یافتید؟ ساخته شده با Sphinx 9.1.0. |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |