'\" t .\" Man page generated from reStructuredText .\" by the Docutils 0.23 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "VIRTUALENV" "1" "September 01, 2026" "21.7" "virtualenv" .SH "نام (NAME)" virtualenv \- ابزاری برای ایجاد محیط‌های ایزوله پایتون [تصویر: آخرین نسخه در PyPI] [تصویر] \%[تصویر: پیاده‌سازی در PyPI] [تصویر] [تصویر: نسخه پایتون در PyPI] [تصویر] [تصویر: وضعیت مستندات] [تصویر] \%[تصویر: دیسکورد] [تصویر] \%[تصویر: دریافت‌های PyPI] [تصویر] \%[تصویر: پروانه PyPI] [تصویر] \%[تصویر: مسائل باز] [تصویر] \%[تصویر: درخواست‌های ادغام باز] [تصویر] \%[تصویر: محبوبیت بسته] [تصویر] \% .sp \fBvirtualenv\fP ابزاری برای ایجاد محیط‌های ایزوله پایتون است. از نسخه ۳.۳ پایتون، زیرمجموعه‌ای از آن در قالب ماژول \fBvenv\fP در کتابخانه استاندارد ادغام شده است. برای بررسی مقایسه \fBvirtualenv\fP با ماژول \fBvenv\fP در کتابخانه استاندارد، به بخش توضیحات (Explanation) \%<>\& مراجعه کنید. .SH "پیمایش سریع (QUICK NAVIGATION)" .sp \fBTutorials (آموزش‌ها)\fP \- یادگیری با تمرین عملی .INDENT 0.0 .IP \(bu 2 شروع به کار (Getting started) \%<> — ایجاد اولین محیط مجازی و یادگیری گردش کار پایه .UNINDENT .sp \fBHow\-to guides (راهنماهای کاربردی)\fP \- حل مشکلات مشخص .INDENT 0.0 .IP \(bu 2 نصب virtualenv \%<> — نصب virtualenv روی سیستم شما .IP \(bu 2 استفاده از virtualenv \%<> — انتخاب نسخه‌های پایتون، فعال‌سازی محیط‌ها، پیکربندی مقادیر پیش‌فرض و استفاده از کدهای پایتون .UNINDENT .sp \fBReference (مرجع)\fP \- اطلاعات فنی .INDENT 0.0 .IP \(bu 2 سازگاری (Compatibility) \%<> — نسخه‌های پایتون و سیستم‌عامل‌های پشتیبانی‌شده .IP \(bu 2 خط فرمان (Command line) \%<> — گزینه‌ها و پرچم‌های خط فرمان .IP \(bu 2 پایتون (Python) \%<> — مرجع رابط برنامه‌نویسی (API) پایتون .UNINDENT .sp \fBExplanation (توضیحات)\fP \- درک مفاهیم .INDENT 0.0 .IP \(bu 2 توضیحات (Explanation) \%<> — نحوه کارکرد درونی virtualenv و دلیل وجود آن .UNINDENT .sp \fBExtensions (افزونه‌ها)\fP .INDENT 0.0 .IP \(bu 2 پلاگین‌ها (Plugins) \%<> — گسترش virtualenv با creators، seeders و activators سفارشی .UNINDENT.SH "پروژه‌های مرتبط (RELATED PROJECTS)" .sp ابزارهای متعددی بر پایه virtualenv ساخته شده‌اند تا جریان‌های کاری سطح بالاتری را ارائه دهند: .INDENT 0.0 .IP \(bu 2 virtualenvwrapper \% — یک پوشش شل برای ایجاد و مدیریت چندین محیط مجازی .IP \(bu 2 pew \% — پوشش محیط پایتون (Python Env Wrapper)، مجموعه‌ای از دستورها برای مدیریت چندین محیط مجازی .IP \(bu 2 tox \% — خودکارسازی آزمایش‌ها در چندین نسخه مختلف پایتون .IP \(bu 2 nox \% — خودکارسازی انعطاف‌پذیر آزمایش در پایتون .UNINDENT .SH "منابع خارجی (EXTERNAL RESOURCES)" .sp درباره virtualenv از این منابع جامعه کاربری بیشتر بیاموزید: .INDENT 0.0 .IP \(bu 2 آموزش virtualenv کوری شفر (Corey Schafer) \% — راهنمای ویدئویی برای مبتدیان .IP \(bu 2 وضعیت کنونی پایتون از برنات گابور (Bernat Gabor) \% — سخنرانی پیرامون وضعیت فعلی بسته‌بندی در پایتون .IP \(bu 2 مهندسی معکوس کارل مایر (Carl Meyer) \% — بررسی دقیق و عمیق سازوکار درونی virtualenv .UNINDENT .SS "شروع کار (Getting started)" .sp این آموزش مبانی virtualenv را از طریق تمرین عملی به شما می‌آموزد. شما نخستین محیط مجازی خود را ایجاد خواهید کرد، بسته‌ها را نصب می‌کنید و با نحوه مدیریت وابستگی‌های پروژه آشنا می‌شوید. .SS "پیش‌نیازها (Prerequisites)" .sp پیش از آغاز این آموزش، شما به موارد زیر نیاز دارید: .INDENT 0.0 .IP \(bu 2 نصب بودن پایتون نسخه 3.9 یا جدیدتر روی سیستم شما. اگر از یک ابزار مدیریت نسخه مانند pyenv \%، mise \% یا asdf \% استفاده می‌کنید، virtualenv به‌طور خودکار نسخه پایتون مدیریت‌شده توسط آن‌ها را شناسایی می‌کند. .IP \(bu 2 نصب بودن virtualenv (بخش Install virtualenv \%<> را ببینید). .UNINDENT .SS "ایجاد اولین محیط مجازی (Create your first virtual environment)" .sp بیایید یک محیط مجازی به نام \fBmyproject\fP ایجاد کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv myproject created virtual environment CPython3.13.2.final.0\-64 in 200ms creator CPython3Posix(dest=/home/user/myproject, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, via=copy, app_data_dir=/home/user/.cache/virtualenv) activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator .EE .UNINDENT .UNINDENT .sp این کار یک دایرکتوری جدید به نام \fBmyproject\fP ایجاد می‌کند که شامل یک محیط پایتون کامل و ایزوله‌شده به همراه نسخه اختصاصی پایتون، pip و سایر ابزارها است. .sp مفسر به چندین نام پاسخ می‌دهد، بنابراین اسکریپتی که انتظار هر یک از آن‌ها را داشته باشد در داخل محیط به کار خود ادامه می‌دهد: .INDENT 0.0 .INDENT 3.5 .sp .EX $ ls myproject/bin/python* myproject/bin/python myproject/bin/python3 myproject/bin/python3.13 .EE .UNINDENT .UNINDENT .sp بخش ساختار محیط (Environment layout) \%<> فهرست کامل را ارائه می‌دهد که این موارد در ویندوز متفاوت است. .SS "فعال‌سازی محیط (Activate the environment)" .sp برای استفاده از محیط مجازی خود، می‌توانید آن را فعال کنید. دستور فعال‌سازی بسته به بستر و پلتفرم متفاوت است: [Linux/macOS] .INDENT 0.0 .INDENT 3.5 .sp .EX $ source myproject/bin/activate .EE .UNINDENT .UNINDENT [Windows (PowerShell)] .INDENT 0.0 .INDENT 3.5 .sp .EX PS> .\emyproject\eScripts\eActivate.ps1 .EE .UNINDENT .UNINDENT [Windows (CMD)] .INDENT 0.0 .INDENT 3.5 .sp .EX C:\e> .\emyproject\eScripts\eactivate.bat .EE .UNINDENT .UNINDENT .sp پس از فعال‌سازی، اعلان خط فرمان (prompt) شما برای نمایش محیط فعال تغییر می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX (myproject) $ .EE .UNINDENT .UNINDENT .sp می‌توانید بررسی کنید که پایتون اکنون از داخل محیط مجازی اجرا می‌شود: [Linux/macOS] .INDENT 0.0 .INDENT 3.5 .sp .EX (myproject) $ which python /home/user/myproject/bin/python .EE .UNINDENT .UNINDENT [Windows (PowerShell)] .INDENT 0.0 .INDENT 3.5 .sp .EX (myproject) PS> where.exe python C:\eUsers\euser\emyproject\eScripts\epython.exe .EE .UNINDENT .UNINDENT [Windows (CMD)] .INDENT 0.0 .INDENT 3.5 .sp .EX (myproject) C:\e> where.exe python C:\eUsers\euser\emyproject\eScripts\epython.exe .EE .UNINDENT .UNINDENT.SS نصب یک بسته .sp با فعال بودن محیط، یک بسته را با استفاده از pip نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX (myproject) $ pip install requests Collecting requests Using cached requests\-2.32.3\-py3\-none\-any.whl (64 kB) Installing collected packages: requests Successfully installed requests\-2.32.3 .EE .UNINDENT .UNINDENT .sp بررسی کنید که بسته تنها درون محیط مجازی شما نصب شده باشد: .INDENT 0.0 .INDENT 3.5 .sp .EX (myproject) $ python \-c \(dqimport requests; print(requests.__file__)\(dq /home/user/myproject/lib/python3.13/site\-packages/requests/__init__.py .EE .UNINDENT .UNINDENT .sp این مسیر نشان می‌دهد که \fBrequests\fP در محیط مجازی نصب شده است، نه در Python سیستم شما. .SS غیرفعال‌سازی .sp هنگامی که کارتان در محیط مجازی به پایان رسید، آن را غیرفعال کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX (myproject) $ deactivate $ .EE .UNINDENT .UNINDENT .sp اعلان خط فرمان به حالت عادی بازمی‌گردد و دستورهای Python مجدداً از Python سیستم شما استفاده می‌کنند. .SS استفاده بدون فعال‌سازی .sp فعال‌سازی تنها برای راحتی است و الزامی نیست. شما می‌توانید هر فایل اجرایی را مستقیماً با استفاده از مسیر کامل آن از محیط مجازی اجرا کنید: [Linux/macOS] .INDENT 0.0 .INDENT 3.5 .sp .EX $ myproject/bin/python \-c \(dqimport sys; print(sys.prefix)\(dq /home/user/myproject $ myproject/bin/pip install httpx .EE .UNINDENT .UNINDENT [Windows (PowerShell)] .INDENT 0.0 .INDENT 3.5 .sp .EX PS> .\emyproject\eScripts\epython.exe \-c \(dqimport sys; print(sys.prefix)\(dq C:\eUsers\euser\emyproject PS> .\emyproject\eScripts\epip.exe install httpx .EE .UNINDENT .UNINDENT [Windows (CMD)] .INDENT 0.0 .INDENT 3.5 .sp .EX C:\e> .\emyproject\eScripts\epython.exe \-c \(dqimport sys; print(sys.prefix)\(dq C:\eUsers\euser\emyproject C:\e> .\emyproject\eScripts\epip.exe install httpx .EE .UNINDENT .UNINDENT .sp این روش به‌ویژه در اسکریپت‌ها، خطوط لوله CI و خودکارسازی که در آن‌ها نیازی به دستکاری محیط شل نیست، بسیار کاربردی است..SS راه‌اندازی یک پروژه واقعی .sp اکنون بیایید آنچه آموخته‌اید را در گردش کار یک پروژه واقعی به کار بگیریم: .INDENT 0.0 .INDENT 3.5 .sp .EX $ mkdir myapp && cd myapp $ virtualenv venv $ source venv/bin/activate # or use the appropriate command for your platform (venv) $ pip install flask requests (venv) $ pip freeze > requirements.txt .EE .UNINDENT .UNINDENT .sp فایل \fBrequirements.txt\fP اکنون شامل وابستگی‌های پروژه شما است: .INDENT 0.0 .INDENT 3.5 .sp .EX blinker==1.9.0 certifi==2025.1.31 charset\-normalizer==3.4.1 click==8.1.8 flask==3.1.0 idna==3.10 itsdangerous==2.2.0 Jinja2==3.1.5 MarkupSafe==3.0.2 requests==2.32.3 urllib3==2.3.0 werkzeug==3.1.3 .EE .UNINDENT .UNINDENT .sp این فایل به شما امکان می‌دهد بعداً دقیقاً همان محیط را بازسازی کنید. بیایید این را آزمایش کنیم: .INDENT 0.0 .INDENT 3.5 .sp .EX (venv) $ deactivate $ rm \-rf venv $ virtualenv venv $ source venv/bin/activate (venv) $ pip install \-r requirements.txt .EE .UNINDENT .UNINDENT .sp تمام بسته‌ها دقیقاً مانند قبل دوباره نصب می‌شوند. گردش کار کامل در ادامه آمده است: [graph] .SS آنچه آموختید .sp در این آموزش، شما یاد گرفتید چگونه: .INDENT 0.0 .IP \(bu 2 یک محیط مجازی با \fBvirtualenv\fP ایجاد کنید. .IP \(bu 2 محیط‌های مجازی را در پلتفرم‌های مختلف فعال و غیرفعال کنید. .IP \(bu 2 بسته‌ها را به‌صورت ایزوله‌شده از پایتون سیستم خود نصب کنید. .IP \(bu 2 وابستگی‌های پروژه را با \fBpip freeze\fP ذخیره کنید. .IP \(bu 2 محیط‌ها را با استفاده از \fBrequirements.txt\fP بازتولید کنید. .UNINDENT .SS گام‌های بعدی .sp اکنون که با مبانی آشنا شدید، این موضوعات را کاوش کنید: .INDENT 0.0 .IP \(bu 2 بخش Use virtualenv \%<> برای انتخاب نگارش‌های خاص پایتون، پیکربندی پیش‌فرض‌ها و الگوهای استفاده پیشرفته. .IP \(bu 2 بخش Explanation \%<> برای درک نحوه کارکرد درونی virtualenv و مقایسه آن با \fBvenv\fP\&. .IP \(bu 2 بخش Command line \%<> برای تمام گزینه‌ها و پرچم‌های موجود در خط فرمان. .UNINDENT .SS نصب virtualenv .sp ابزار virtualenv یک ابزار خط فرمانی است، بنابراین باید به جای پایتون سیستم شما، در یک محیط ایزوله نصب شود. روشی را که با ساختار شما سازگار است انتخاب کنید: .INDENT 0.0 .IP \(bu 2 ابزار uv \% \-\- مدیر بسته سریع و مدرن پایتون. اگر از قبل \fBuv\fP را دارید یا می‌خواهید تازه شروع کنید از این گزینه استفاده کنید. .IP \(bu 2 ابزار pipx \% \-\- ابزارهای خط فرمان پایتون را در محیط‌های ایزوله نصب می‌کند. اگر از قبل \fBpipx\fP را راه‌اندازی کرده‌اید از این گزینه استفاده کنید. .IP \(bu 2 ابزار pip \% \-\- نصاب استاندارد بسته‌های پایتون. از گزینه \fB\-\-user\fP استفاده کنید تا از تغییر بسته‌های سیستم جلوگیری شود. ممکن است در توزیع‌هایی با محیط‌های پایتون مدیریت‌شده از خارج کار نکند. .IP \(bu 2 بسته zipapp \% \-\- یک فایل اجرایی مستقل بدون نیاز به نصب. از این در CI یا محیط‌هایی که نمی‌توانید بسته‌ها را نصب کنید استفاده کنید. .UNINDENT [graph][uv] نصب virtualenv به عنوان یک ابزار uv \%: .INDENT 0.0 .INDENT 3.5 .sp .EX $ uv tool install virtualenv .EE .UNINDENT .UNINDENT .sp نصب نگارش توسعه: .INDENT 0.0 .INDENT 3.5 .sp .EX $ uv tool install git+https://github.com/pypa/virtualenv.git@main .EE .UNINDENT .UNINDENT [pipx] نصب virtualenv با استفاده از pipx \%: .INDENT 0.0 .INDENT 3.5 .sp .EX $ pipx install virtualenv .EE .UNINDENT .UNINDENT .sp نصب نگارش توسعه: .INDENT 0.0 .INDENT 3.5 .sp .EX $ pipx install git+https://github.com/pypa/virtualenv.git@main .EE .UNINDENT .UNINDENT [pip] نصب virtualenv با استفاده از pip \%: .INDENT 0.0 .INDENT 3.5 .sp .EX $ python \-m pip install \-\-user virtualenv .EE .UNINDENT .UNINDENT .sp نصب نگارش توسعه: .INDENT 0.0 .INDENT 3.5 .sp .EX $ python \-m pip install git+https://github.com/pypa/virtualenv.git@main .EE .UNINDENT .UNINDENT .sp \fBهشدار:\fP .INDENT 0.0 .INDENT 3.5 برخی از توزیع‌های لینوکس از محیط‌های پایتون مدیریت‌شده توسط سیستم استفاده می‌کنند. اگر با خطاهایی درباره محیط‌های مدیریت‌شده از خارج (externally\-managed) روبرو شدید، به جای آن از \fBuv tool\fP یا \fBpipx\fP استفاده کنید. .UNINDENT .UNINDENT [zipapp] فایل zipapp را بارگیری کرده و آن را مستقیماً اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ python virtualenv.pyz \-\-help .EE .UNINDENT .UNINDENT .sp آخرین نگارش را از \% یا یک نگارش خاص را از \fBhttps://bootstrap.pypa.io/virtualenv/x.y/virtualenv.pyz\fP\& بارگیری کنید..SS بررسی نصب .sp بررسی نسخه نصب‌شده: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-version .EE .UNINDENT .UNINDENT .sp برای نسخه‌های پشتیبانی‌شده Python بخش Compatibility \%<> را ببینید. .SS استفاده از virtualenv .SS انتخاب یک نسخه Python .sp به‌طور پیش‌فرض، virtualenv از همان نسخه Python که تحت آن اجرا می‌شود استفاده می‌کند. این مقدار را با \fB\-\-python\fP یا \fB\-p\fP تغییر دهید. .SS استفاده از مشخص‌کننده‌های نسخه .sp تعیین یک نسخه Python با نام یا شماره نسخه: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-p python3.14 venv $ virtualenv \-p 3.10 venv $ virtualenv \-p pypy3 venv $ virtualenv \-p rustpython venv .EE .UNINDENT .UNINDENT .SS استفاده از مشخص‌کننده‌های PEP 440 .sp از مشخص‌کننده‌های نسخه PEP 440 \% برای مطابقت دادن نسخه‌های Python استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-python \(dq>=3.12\(dq venv $ virtualenv \-\-python \(dq~=3.11.0\(dq venv $ virtualenv \-\-python \(dqcpython>=3.10\(dq venv .EE .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 \fB>=3.12\fP \-\- هر نسخه Python 3.12 یا بالاتر. .IP \(bu 2 \fB~=3.11.0\fP \-\- انتشار سازگار، معادل \fB>=3.11.0, <3.12.0\fP (هر وصله 3.11.x). .IP \(bu 2 \fBcpython>=3.10\fP \-\- محدود به پیاده‌سازی CPython، نسخه 3.10 یا بالاتر. .UNINDENT .SS استفاده از Python با قابلیت free\-threading .sp ایجاد یک محیط با Python دارای قابلیت free\-threading \%: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-p 3.13t venv .EE .UNINDENT .UNINDENT .SS تعیین یک معماری پردازنده مشخص .sp روی دستگاه‌هایی که از چندین معماری پشتیبانی می‌کنند — مانند Apple Silicon (ترکیب arm64 + x86_64 از طریق Rosetta) یا Windows on ARM — می‌توانید با الحاق آن به انتهای رشته مشخصات، معماری پردازنده مشخصی را درخواست کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-p cpython3.12\-64\-arm64 venv $ virtualenv \-p 3.11\-64\-x86_64 venv .EE .UNINDENT .UNINDENT .sp نام‌های مستعار چندسکویی به‌طور خودکار عادی‌سازی می‌شوند، بنابراین با \fBamd64\fP و \fBx86_64\fP معادل یکدیگر رفتار می‌شود، همان‌طور که با \fBaarch64\fP و \fBarm64\fP\&. در صورت حذف، هر معماری مطابقت داده می‌شود (حفظ رفتار موجود). .SS استفاده از مسیرهای مطلق .sp تعیین مسیر کامل به یک مفسر Python: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-p /usr/bin/python3.9 venv .EE .UNINDENT .UNINDENT.SS استفاده از \fB\-\-try\-first\-with\fP .sp از \fB\-\-try\-first\-with\fP برای ارائه یک راهنمایی درباره این‌که کدام پایتون ابتدا بررسی شود استفاده کنید. بر خلاف \fB\-\-python\fP، این یک پیشنهاد است تا یک قانون قطعی. مفسر موجود در این مسیر ابتدا بررسی می‌شود، اما تنها در صورتی استفاده خواهد شد که با قید \fB\-\-python\fP مطابقت داشته باشد. .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-python \(dq>=3.10\(dq \-\-try\-first\-with /usr/bin/python3.9 venv .EE .UNINDENT .UNINDENT .sp در این مثال، ابتدا /usr/bin/python3.9 بررسی می‌شود اما به دلیل برآورده نکردن شرط >=3.10 رد می‌شود. .SS استفاده از مدیرهای نسخه (pyenv، mise، asdf) .sp ابزار virtualenv به‌طور خودکار شیم‌های (shims) مربوط به pyenv \%، mise \% و asdf \% را به باینری واقعی پایتون ارجاع می‌دهد. نسخه فعال پایتون را با استفاده از هر یک از سازوکارهای استاندارد تنظیم کنید تا virtualenv آن را شناسایی کند: .INDENT 0.0 .INDENT 3.5 .sp .EX $ pyenv local 3.12.0 $ virtualenv venv # uses pyenv\(aqs 3.12.0, not the system Python $ PYENV_VERSION=3.11.0 virtualenv venv # uses 3.11.0 .EE .UNINDENT .UNINDENT .sp این قابلیت با mise و asdf نیز کار می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX $ mise use python@3.12 $ virtualenv venv .EE .UNINDENT .UNINDENT .sp هیچ پیکربندی اضافی نیاز نیست. برای جزئیات در مورد نحوه عملکرد تفکیک شیم (shim resolution)، بخش Explanation \%<> را ببینید. .SS فعال‌سازی یک محیط مجازی .sp برای تغییر متغیرهای محیطی و PATH پوسته خود، محیط مجازی را فعال کنید. [Bash/Zsh] .INDENT 0.0 .INDENT 3.5 .sp .EX $ source venv/bin/activate .EE .UNINDENT .UNINDENT [Fish] .INDENT 0.0 .INDENT 3.5 .sp .EX $ source venv/bin/activate.fish .EE .UNINDENT .UNINDENT [PowerShell] .INDENT 0.0 .INDENT 3.5 .sp .EX PS> .\evenv\eScripts\eActivate.ps1 .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 اگر با خطای execution policy مواجه شدید، دستور \fBSet\-ExecutionPolicy RemoteSigned\fP را برای مجاز کردن اسکریپت‌های محلی اجرا کنید. .UNINDENT .UNINDENT [CMD] .INDENT 0.0 .INDENT 3.5 .sp .EX > .\evenv\eScripts\eactivate.bat .EE .UNINDENT .UNINDENT [Nushell] .INDENT 0.0 .INDENT 3.5 .sp .EX $ overlay use venv/bin/activate.nu .EE .UNINDENT .UNINDENT [Xonsh] .INDENT 0.0 .INDENT 3.5 .sp .EX @ source venv/bin/activate.xsh .EE .UNINDENT .UNINDENT.SS غیرفعال‌سازی محیط .sp خروج از محیط مجازی: .INDENT 0.0 .INDENT 3.5 .sp .EX $ deactivate .EE .UNINDENT .UNINDENT .SS استفاده بدون فعال‌سازی .sp استفاده از محیط بدون نیاز به فعال‌سازی آن، با فراخوانی مستقیم فایل‌های اجرایی از طریق مسیر کامل آن‌ها: .INDENT 0.0 .INDENT 3.5 .sp .EX $ venv/bin/python script.py $ venv/bin/pip install package .EE .UNINDENT .UNINDENT .sp \fBpython\fP، \fBpython3\fP و نام‌های دارای شماره نسخه، همگی به یک مفسر یکسان اشاره می‌کنند؛ همچنین در ویندوز، فایل‌های اجرایی با پسوند \fB\&.exe\fP در پوشهٔ \fBvenv\eScripts\fP قرار دارند. هر زمان که به فرایندی بدون پنجرهٔ کنسول نیاز داشتید، از \fBpythonw.exe\fP در آن مسیر استفاده کنید. طرح‌بندی محیط \%<> تمام نام‌ها را فهرست می‌کند. .SS سفارشی‌سازی پرامپت (Prompt) .sp تنظیم یک پیشوند سفارشی برای پرامپت: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-prompt myproject venv .EE .UNINDENT .UNINDENT .sp غیرفعال‌سازی تغییر پرامپت خط فرمان با مقداردهی متغیر محیطی \fBVIRTUAL_ENV_DISABLE_PROMPT\fP. .sp دسترسی به رشتهٔ پرامپت از طریق متغیر محیطی \fBVIRTUAL_ENV_PROMPT\fP. .SS فعال‌سازی از طریق کد (Programmatic) .sp فعال‌سازی محیط از درون یک فرایند در حال اجرای پایتون با استفاده از \fBactivate_this.py\fP\&. این اسکریپت \fBsys.path\fP و متغیرهای محیطی را در فرایند جاری تغییر می‌دهد، به‌گونه‌ای که درون‌ریزی‌های (import) بعدی از محیط مجازی بارگذاری شوند. .INDENT 0.0 .INDENT 3.5 .sp .EX import runpy runpy.run_path(\(dqvenv/bin/activate_this.py\(dq) .EE .UNINDENT .UNINDENT .sp یک کاربرد رایج، برنامه‌های تحت وبی هستند که توسط یک وب‌سرور سراسری WSGI در سیستم (مانند mod_wsgi یا uWSGI) میزبانی می‌شوند و نیاز دارند بسته‌ها را از یک محیط مجازی بارگذاری کنند: .INDENT 0.0 .INDENT 3.5 .sp .EX import runpy from pathlib import Path runpy.run_path(str(Path(\(dq/var/www/myapp/venv/bin/activate_this.py\(dq))) from myapp import create_app # noqa: E402 application = create_app() .EE .UNINDENT .UNINDENT .SS پیکربندی مقادیر پیش‌فرض .sp استفاده از یک فایل پیکربندی برای تعیین گزینه‌های پیش‌فرض virtualenv. .SS مکان فایل پیکربندی .sp فایل پیکربندی \fBvirtualenv.ini\fP نام دارد و در دایرکتوری app config مربوط به platformdirs قرار گرفته است. دستور \fBvirtualenv \-\-help\fP را اجرا کنید تا مسیر دقیق آن را در سیستم خود بیابید. .sp تغییر مسیر فایل پیکربندی با استفاده از متغیر محیطی \fBVIRTUALENV_CONFIG_FILE\fP..SS قالب پیکربندی .sp کلیدهای پیکربندی را می‌توان با حذف \fB\-\fP از ابتدای گزینه‌های خط فرمان و جایگزین کردن \fB\-\fPهای باقی‌مانده با \fB_\fP به دست آورد: .INDENT 0.0 .INDENT 3.5 .sp .EX [virtualenv] python = /opt/python\-3.14/bin/python .EE .UNINDENT .UNINDENT .SS گزینه‌های چندمقداری .sp مقادیر چندگانه را در خطوط جداگانه مشخص کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [virtualenv] extra_search_dir = /path/to/dists /path/to/other/dists .EE .UNINDENT .UNINDENT .SS متغیرهای محیطی .sp گزینه‌ها را با استفاده از متغیرهای محیطی دارای پیشوند \fBVIRTUALENV_\fP و نام‌های کلید با حروف بزرگ تنظیم کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ export VIRTUALENV_PYTHON=/opt/python\-3.14/bin/python .EE .UNINDENT .UNINDENT .sp برای گزینه‌های چندمقداری، مقادیر را با ویرگول یا خطوط جدید از هم جدا کنید. .SS تغییر مکان app\-data .sp متغیر محیطی \fBVIRTUALENV_OVERRIDE_APP_DATA\fP را برای تغییر مکان پیش‌فرض دایرکتوری حافظه موقت (cache) app\-data تنظیم کنید. .SS مجاز کردن HTTPS تأییدنشده برای به‌روزرسانی‌های دوره‌ای .sp به‌روزرسانی دوره‌ای با واکشی \fBhttps://pypi.org/pypi//json\fP\& بسته‌های اولیهٔ (seed wheels) جدیدتر را بررسی می‌کند. این درخواست با اعتبارسنجی کامل TLS انجام می‌شود و در صورت شکست درخواست تأییدشده، virtualenv اکنون به‌جای تنزل دادن امنیت اتصال، از به‌روزرسانی صرف‌نظر می‌کند. مقدار \fBVIRTUALENV_PERIODIC_UPDATE_INSECURE=1\fP را تنظیم کنید تا رفتار پیشین بازیابی شده و درخواست مجدداً با یک بافت (context) تأییدنشدهٔ SSL تلاش شود. این یک راه گریز برای میزبان‌هایی با مخازن اعتماد (trust stores) معیوب است؛ آن را روی میزبان‌هایی که تحت کنترل شما نیستند تنظیم نکنید. .SS اولویت پیکربندی .sp گزینه‌ها به این ترتیب حل‌وفصل می‌شوند (از بالاترین به پایین‌ترین اولویت): [graph] .SS کنترل بسته‌های اولیه (seed packages) .SS ارتقای wheelهای تعبیه‌شده .sp فایل‌های wheel تعبیه‌شده را به آخرین نسخه‌ها به‌روزرسانی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-upgrade\-embed\-wheels .EE .UNINDENT .UNINDENT .SS ارائهٔ wheelهای سفارشی .sp از فایل‌های wheel سفارشی از یک دایرکتوری محلی استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-extra\-search\-dir /path/to/wheels venv .EE .UNINDENT .UNINDENT .SS دانلود آخرین نسخه از PyPI .sp آخرین نسخه‌های بسته‌های اولیه (seed packages) را از PyPI دریافت کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-download venv .EE .UNINDENT .UNINDENT.SS غیرفعال‌سازی به‌روزرسانی‌های دوره‌ای .sp غیرفعال‌سازی به‌روزرسانی‌های خودکار دوره‌ای بسته‌های اولیه (seed packages): .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-no\-periodic\-update venv .EE .UNINDENT .UNINDENT .SS برای نگه‌دارندگان توزیع .sp ماژول \fBvirtualenv.seed.wheels.embed\fP را وصله (patch) کرده و \fBPERIODIC_UPDATE_ON_BY_DEFAULT\fP را روی \fBFalse\fP تنظیم کنید تا به‌روزرسانی‌های دوره‌ای به‌صورت پیش‌فرض غیرفعال شوند. برای جزئیات پیاده‌سازی، Explanation \%<> را ببینید. .SS استفاده در کد Python .sp فراخوانی virtualenv از طریق کد Python با استفاده از تابع \fBcli_run\fP: .INDENT 0.0 .INDENT 3.5 .sp .EX from virtualenv import cli_run cli_run([\(dqvenv\(dq]) .EE .UNINDENT .UNINDENT .sp ارسال گزینه‌ها به‌عنوان عناصر لیست: .INDENT 0.0 .INDENT 3.5 .sp .EX cli_run([\(dq\-p\(dq, \(dqpython3.14\(dq, \(dq\-\-without\-pip\(dq, \(dqmyenv\(dq]) .EE .UNINDENT .UNINDENT .sp استفاده از شیء session بازگردانده‌شده برای دسترسی به جزئیات محیط: .INDENT 0.0 .INDENT 3.5 .sp .EX result = cli_run([\(dqvenv\(dq]) print(result.creator.dest) # path to created environment print(result.creator.exe) # path to python executable .EE .UNINDENT .UNINDENT .sp استفاده از \fBsession_via_cli\fP برای توصیف محیط بدون ایجاد آن: .INDENT 0.0 .INDENT 3.5 .sp .EX from virtualenv import session_via_cli session = session_via_cli([\(dqvenv\(dq]) # inspect session.creator, session.seeder, session.activators .EE .UNINDENT .UNINDENT .sp برای مستندات کامل API، بخش Python \%<> را ببینید. .SS سازگاری .SS پیاده‌سازی‌های پشتیبانی‌شدهٔ Python .sp \fBvirtualenv\fP با پیاده‌سازی‌های مفسر Python زیر کار می‌کند. فقط آخرین نسخهٔ وصله (patch) از هر نسخهٔ فرعی (minor) به‌طور کامل پشتیبانی می‌شود؛ نسخه‌های وصلهٔ قبلی بر مبنای بهترین تلاش (best effort) عمل می‌کنند. .SS CPython .sp \fB3.15 >= python_version >= 3.9\fP .SS PyPy .sp \fB3.11 >= python_version >= 3.9\fP .SS GraalPy .sp \fB24.1\fP و جدیدتر (فقط Linux و macOS). .SS RustPython .sp پشتیبانی آزمایشی (Linux، macOS و Windows). سامانهٔ RustPython \% نگارش Python 3.14 را پیاده‌سازی می‌کند..SS سیاست پشتیبانی (Support policy) .INDENT 0.0 .IP \(bu 2 \fBنسخه‌های جدید\fP نزدیک به تاریخ انتشارشان، معمولاً در طول فاز بتا اضافه می‌شوند. .IP \(bu 2 پشتیبانی از \fBنسخه‌های قدیمی\fP ۱۸ ماه پس از پایان عمر (EOL) در CPython \% متوقف می‌شود، که به کاربران زمان کافی برای مهاجرت می‌دهد. .UNINDENT .SS جدول زمانی پشتیبانی از نسخه‌ها (Version support timeline) .sp تغییرات عمده در پشتیبانی از نسخه‌ها: .INDENT 0.0 .IP \(bu 2 \fB21.5.0\fP (2026\-06\-13): پشتیبانی از اجرا تحت Python 3.8 و پیش از آن و همچنین ساخت محیط برای آن‌ها متوقف شد. .IP \(bu 2 \fB20.27.0\fP (2024\-10\-17): پشتیبانی از اجرا تحت Python 3.7 و پیش از آن متوقف شد. .IP \(bu 2 \fB20.22.0\fP (2023\-04\-19): پشتیبانی از ساخت محیط برای Python 3.6 و پیش از آن متوقف شد. .IP \(bu 2 \fB20.18.0\fP (2023\-02\-06): پشتیبانی از اجرا تحت Python 3.6 و پیش از آن متوقف شد. .UNINDENT .SS سیستم‌عامل‌های پشتیبانی‌شده (Supported operating systems) .sp CPython در قالب‌های گوناگونی عرضه می‌شود و هر سیستم‌عامل آن را مجدداً بسته‌بندی کرده و معمولاً سفارشی‌سازی‌هایی روی آن اعمال می‌کند. سکوهای فهرست‌شده در زیر آزمایش شده‌اند. سکوهای فهرست‌نشده ممکن است کار کنند اما رسماً پشتیبانی نمی‌شوند. در صورت مواجهه با مشکل در سکوهای فهرست‌نشده، لطفاً یک درخواست قابلیت (feature request) باز کنید. .SS چندسکویی (Cross\-platform) .sp این توزیع‌های Python بر روی Linux، macOS و Windows کار می‌کنند: .INDENT 0.0 .IP \(bu 2 نصب‌های انجام‌شده از python.org \% .IP \(bu 2 ساخت‌های python\-build\-standalone \% (استفاده‌شده توسط uv \% و mise \%) .IP \(bu 2 نسخه‌های Python مدیریت‌شده توسط pyenv \%، mise \% یا asdf \% (فایل‌های shim به‌طور خودکار به دودویی واقعی نگاشت می‌شوند) .UNINDENT .SS لینوکس (Linux) .INDENT 0.0 .IP \(bu 2 توزیع Ubuntu 16.04 و جدیدتر (هم ساخت‌های بالادستی و هم ساخت‌های deadsnakes \%) .IP \(bu 2 Fedora .IP \(bu 2 RHEL و CentOS .IP \(bu 2 OpenSuse .IP \(bu 2 Arch Linux .UNINDENT .SS مک‌اواس (macOS) .INDENT 0.0 .IP \(bu 2 نسخه‌های Python نصب‌شده از طریق Homebrew \% (کار می‌کند، اما توصیه نمی‌شود \% \-\- زیرا Homebrew ممکن است نسخه‌های Python را بدون هشدار ارتقا داده یا حذف کند و محیط‌های مجازی موجود را از کار بیندازد) .IP \(bu 2 نسخهٔ Python 3 موجود در XCode (ساخت‌های چارچوب Python در \fB/Library/Frameworks/Python3.framework/\fP) .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 ساخت‌های مبتنی بر چارچوب (Framework) از محیط‌های مجازی مبتنی بر کپی پشتیبانی نمی‌کنند. به‌جای آن از روش‌های ساخت با پیوند نمادین (symlink) یا پیوند سخت (hardlink) استفاده کنید. .UNINDENT .UNINDENT .SS ویندوز (Windows) .INDENT 0.0 .IP \(bu 2 نسخهٔ Python 3.9 و جدیدتر از Windows Store \% .UNINDENT .SS خط فرمان (Command line) .sp ابزار \fBvirtualenv\fP در درجهٔ اول یک برنامهٔ خط فرمانی است. تمام گزینه‌ها پیش‌فرض‌های منطقی دارند و تنها یک آرگومان اجباری وجود دارد: نام یا مسیر محیط مجازی برای ساخت. .sp برای چگونگی انتخاب نسخه‌های Python، پیکربندی پیش‌فرض‌ها و استفاده از متغیرهای محیطی، Use virtualenv \%<> را ببینید. .SS گزینه‌های خط فرمان (Command line options) .sp \fBvirtualenv [OPTIONS]\fP .TS box center; l|l|l. T{ \fBآرگومان‌های نام‌دار\fP T} _ T{ \fB\-\-version\fP T} T{ \fB\(aq==SUPPRESS==\(aq\fP T} T{ نمایش نسخهٔ بستهٔ virtualenv و مکان آن، سپس خروج T} _ T{ \fB\-\-with\-traceback\fP T} T{ \fBFalse\fP T} T{ در صورت بروز خطا، ردگیری پشته (stacktrace) داخلی virtualenv نیز نمایش داده شود T} _ T{ \fB\-\-read\-only\-app\-data\fP T} T{ \fBFalse\fP T} T{ استفاده از پوشهٔ داده‌های برنامه در حالت فقط‌خواندنی (عملیات‌های نوشتن با خطا مواجه خواهند شد) T} _ T{ \fB\-\-app\-data\fP T} T{ پوشهٔ داده‌های برنامه مختص به سکو T} T{ یک پوشهٔ داده که توسط virtualenv به عنوان حافظهٔ نهان (cache) استفاده می‌شود T} _ T{ \fB\-\-reset\-app\-data\fP T} T{ \fBFalse\fP T} T{ شروع با پوشهٔ داده‌های برنامه به صورت خالی T} _ T{ \fB\-\-upgrade\-embed\-wheels\fP T} T{ \fBFalse\fP T} T{ راه‌اندازی به‌روزرسانی دستی چرخ‌های (wheels) تعبیه‌شده T} .TE .TS box center; l|l|l. T{ \fBمیزان جزئیات (verbosity)\fP ⇒ verbosity = verbose \- quiet، پیش‌فرض INFO، نگاشت => CRITICAL=0, ERROR=1, WARNING=2, INFO=3, DEBUG=4, NOTSET=5 T} _ T{ \fB\-v\fP, \fB\-\-verbose\fP T} T{ \fB2\fP T} T{ افزایش میزان جزئیات خروجی T} _ T{ \fB\-q\fP, \fB\-\-quiet\fP T} T{ \fB0\fP T} T{ کاهش میزان جزئیات خروجی T} .TE.SS "شناسایی (discovery)" .TS box center; l|l|l. T{ \fBcore\fP ⇒ گزینه‌های مشترک میان تمام سازوکارهای شناسایی (discovery) T} _ T{ \fB\-\-discovery\fP T} T{ \fB\(aqbuiltin\(aq\fP T} T{ روش شناسایی مفسر؛ گزینه‌های موجود: \fBbuiltin\fP T} _ T{ \fB\-p\fP, \fB\-\-python\fP T} T{ فایل اجرایی پایتونی که virtualenv در آن نصب شده است T} T{ مفسری که محیط باید بر پایه آن ایجاد شود (مسیر/شناسه/مشخصه‌نگارش) \- به‌طور پیش‌فرض از مفسری که ابزار در آن نصب شده استفاده می‌شود \- اولین مورد یافت‌شده اعمال می‌شود. مشخصه‌های نگارش (مانند >=3.12،‏ ~=3.11.0،‏ ==3.10) نیز پشتیبانی می‌شوند T} _ T{ \fB\-\-try\-first\-with\fP T} T{ \fB[]\fP T} T{ پیش از آغاز شناسایی، ابتدا این مفسرها بررسی شوند T} .TE .SS "سازنده (creator)" .TS box center; l|l|l. T{ \fBcore\fP ⇒ گزینه‌های مشترک میان تمام سازنده‌ها (creator) T} _ T{ \fB\-\-creator\fP T} T{ \fBbuiltin\fP در صورت وجود، وگرنه \fBvenv\fP T} T{ ایجاد محیط از طریق؛ گزینه‌های موجود: \fBcpython3\-mac\-brew\fP،‏ \fBcpython3\-mac\-framework\fP،‏ \fBcpython3\-posix\fP،‏ \fBcpython3\-win\fP،‏ \fBgraalpy\-posix\fP،‏ \fBgraalpy\-win\fP،‏ \fBpypy3\-posix\fP،‏ \fBpypy3\-win\fP،‏ \fBrustpython\-posix\fP،‏ \fBrustpython\-win\fP،‏ \fBvenv\fP T} _ T{ \fBdest\fP T} T{ T} T{ دایرکتوری مقصد برای ساخت virtualenv T} _ T{ \fB\-\-clear\fP T} T{ \fBFalse\fP T} T{ پیش از آغاز، در صورت وجود دایرکتوری مقصد آن را حذف کن (در غیر این صورت فایل‌ها رونویسی خواهند شد) T} _ T{ \fB\-\-no\-vcs\-ignore\fP T} T{ \fBFalse\fP T} T{ دستورالعمل نادیده‌گیری VCS در دایرکتوری مقصد ایجاد نشود T} _ T{ \fB\-\-system\-site\-packages\fP T} T{ \fBFalse\fP T} T{ دسترسی به دایرکتوری site\-packages سیستم به محیط مجازی داده شود T} _ T{ \fB\-\-symlinks\fP T} T{ \fBTrue\fP T} T{ تلاش برای استفاده از پیوندهای نمادین به‌جای رونوشت‌ها، زمانی که پیوند نمادین پیش‌فرض پلتفرم نیست T} _ T{ \fB\-\-copies\fP, \fB\-\-always\-copy\fP T} T{ \fBFalse\fP T} T{ تلاش برای استفاده از رونوشت‌ها به‌جای پیوندهای نمادین، حتی زمانی که پیوند نمادین پیش‌فرض پلتفرم باشد T} .TE.SS seeder .TS box center; l|l|l. T{ \fBcore\fP ⇒ گزینه‌های مشترک میان تمام seederها T} _ T{ \fB\-\-seeder\fP T} T{ \fB\(aqapp\-data\(aq\fP T} T{ روش نصب بسته‌های اولیه (seed)؛ انتخاب از میان: \fBapp\-data\fP، \fBpip\fP T} _ T{ \fB\-\-no\-seed\fP, \fB\-\-without\-pip\fP T} T{ \fBFalse\fP T} T{ عدم نصب بسته‌های اولیه (seed) T} _ T{ \fB\-\-no\-download\fP, \fB\-\-never\-download\fP T} T{ \fBTrue\fP T} T{ ارسال این گزینه برای غیرفعال کردن بارگیری جدیدترین pip/setuptools/wheel از PyPI T} _ T{ \fB\-\-download\fP T} T{ \fBFalse\fP T} T{ ارسال این گزینه برای فعال کردن بارگیری جدیدترین pip/setuptools/wheel از PyPI T} _ T{ \fB\-\-extra\-search\-dir\fP T} T{ \fB[]\fP T} T{ مسیری حاوی wheelها برای گسترش فهرست درونی wheel (می‌تواند ۱ یا چند بار مشخص شود) T} _ T{ \fB\-\-pip\fP T} T{ \fB\(aqbundle\(aq\fP T} T{ نسخهٔ pip جهت نصب به عنوان بذر (seed): embed، bundle، none یا نسخه‌ای مشخص T} _ T{ \fB\-\-setuptools\fP T} T{ \fB\(aqnone\(aq\fP T} T{ نسخهٔ setuptools جهت نصب به عنوان بذر (seed): embed، bundle، none یا نسخه‌ای مشخص T} _ T{ \fB\-\-no\-pip\fP T} T{ \fBFalse\fP T} T{ عدم نصب pip T} _ T{ \fB\-\-no\-setuptools\fP T} T{ \fBFalse\fP T} T{ عدم نصب setuptools T} _ T{ \fB\-\-no\-periodic\-update\fP T} T{ \fBFalse\fP T} T{ غیرفعال‌سازی به‌روزرسانی دوره‌ای (هر ۱۴ روز یک‌بار) wheelهای توکار T} .TE .TS box center; l|l|l. T{ \fBapp\-data\fP ⇒ گزینه‌های ویژهٔ seeder مربوط به app\-data T} _ T{ \fB\-\-symlink\-app\-data\fP T} T{ \fBFalse\fP T} T{ ایجاد پیوند نمادین (symlink) برای بسته‌های پایتون از پوشهٔ app\-data (نیازمند seed pip>=19.3) T} .TE.SS فعال‌سازها (activators) .TS box center; l|l|l. T{ \fBcore\fP ⇒ گزینه‌های مشترک میان همهٔ فعال‌سازها T} _ T{ \fB\-\-activators\fP T} T{ فهرست جداشده با کاما از فعال‌سازهای پشتیبانی‌شده T} T{ فعال‌سازها برای ایجاد \- پیش‌فرض تمام موارد پشتیبانی‌شده است؛ انتخاب از میان: \fBxonsh\fP، \fBbash\fP، \fBbatch\fP، \fBcshell\fP، \fBfish\fP، \fBnushell\fP، \fBpowershell\fP، \fBpython\fP T} _ T{ \fB\-\-prompt\fP T} T{ T} T{ یک پیشوند اعلان (prompt) جایگزین برای این محیط ارائه می‌دهد (مقدار . به معنای نام دایرکتوری کاری فعلی است) T} .TE .SS ساختار محیط (Environment layout) .sp مفسر در یک محیطِ ایجادشده به بیش از یک نام پاسخ می‌دهد، بنابراین اسکریپت یا ابزاری که هر یک از آن‌ها را به‌صورت سخت‌کد (hard-code) در خود دارد، به کار خود ادامه می‌دهد. نام‌های زیر مواردی هستند که سازنده‌های توکار (builtin creators) برای CPython می‌نویسند؛ PyPy، GraalPy و RustPython نیز ساختار مشابهی را تحت نام‌های اجراییِ خود دنبال می‌کنند. .sp عبارت \fB{minor}\fP نشان‌دهندهٔ نسخهٔ فرعی (minor version) مفسر هدف است؛ بنابراین \fBpython3.{minor}\fP برای یک هدف CPython 3.14 به‌صورت \fBpython3.14\fP خوانده می‌شود. .SS POSIX .sp دایرکتوری \fBbin\fP شامل یک ارجاع واقعی به مفسر میزبان است و باقی موارد را به آن پیوند (link) می‌دهد: .TS box center; l|l. T{ نام T} T{ توضیحات T} _ T{ \fBpython\fP T} T{ به مفسر میزبان ارجاع می‌دهد. T} _ T{ \fBpython3\fP T} T{ نام مستعار (Alias). T} _ T{ \fBpython3.{minor}\fP T} T{ نام مستعار شامل نسخهٔ فرعیِ مفسر هدف. T} _ T{ \fBpython3.{minor}t\fP T} T{ تنها در ساخت‌های بدون قفل سراسری (Free\-threaded). T} _ T{ نام فایل اجرایی میزبان T} T{ زمانی ظاهر می‌شود که میزبان نام دیگری داشته باشد، مانند \fBpypy3.{minor}\fP\&. T} .TE .SS Windows .sp پوشهٔ \fBScripts\fP به‌جای پیوندها نسخه‌های کپی را نگه می‌دارد، زیرا ایجاد پیوند نمادین (symlink) برای مفسر در آنجا غیرقابل‌اعتماد است (bpo\-42013 \%): .TS box center; l|l. T{ نام T} T{ توضیحات T} _ T{ \fBpython.exe\fP T} T{ به مفسر میزبان ارجاع می‌دهد. T} _ T{ \fBpython3.exe\fP T} T{ نام مستعار (Alias). T} _ T{ \fBpython3\fP T} T{ نام مستعار بدون پسوند. T} _ T{ \fBpython3.{minor}t.exe\fP T} T{ تنها در ساخت‌های بدون قفل سراسری (Free\-threaded). T} _ T{ \fBpythonw.exe\fP T} T{ بدون باز کردن پنجرهٔ کنسول اجرا می‌شود. T} _ T{ \fBpythonw3.exe\fP T} T{ نام مستعار برای \fBpythonw.exe\fP\&. T} _ T{ \fBpythonw3.{minor}t.exe\fP T} T{ تنها در ساخت‌های بدون قفل سراسری (Free\-threaded). T} _ T{ نام فایل اجرایی میزبان T} T{ زمانی ظاهر می‌شود که میزبان نام دیگری داشته باشد، مانند \fBpython_d.exe\fP\&. T} .TE .sp در CPython 3.13 و نسخه‌های جدیدتر، \fBpython.exe\fP به‌جای باینری مفسر، نسخه‌ای از هدایت‌کنندهٔ (redirector) \fBvenvlauncher.exe\fP را از کتابخانهٔ استاندارد میزبان در بر دارد، و \fBpythonw.exe\fP از \fBvenvwlauncher.exe\fP تأمین می‌شود. این هدایت‌کننده فایل \fBpyvenv.cfg\fP را می‌خواند و اجرای برنامه را به مفسر موجود در پیشوند پایه (base prefix) واگذار می‌کند؛ به همین دلیل است که محیط نیازی به کپی از DLLها ندارد. نام فایل اصلیِ آن در \fBScripts\fP قرار نمی‌گیرد، که این رفتار مطابق با آن چیزی است که ماژول \fBvenv\fP در کتابخانهٔ استاندارد ایجاد می‌کند. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 گزینهٔ \fB\-\-copies\fP باعث می‌شود ساختار POSIX به‌جای پیوندها از رونوشت‌ها (کپی‌ها) استفاده کند. مجموعهٔ نام‌ها تغییری نمی‌کند. .UNINDENT .UNINDENT.SS "پایتون (Python)" .sp رابط اصلی \fBvirtualenv\fP برنامه خط فرمان است. با این حال، می‌توان از آن به صورت برنامه‌نویسی نیز از طریق تابع \fBvirtualenv.cli_run\fP و کلاس \fBSession\fP استفاده کرد. .sp برای مثال‌های کاربردی Use virtualenv \%<> را ببینید. .SS "ماژول virtualenv (virtualenv module)" .INDENT 0.0 .TP .B virtualenv.cli_run(args, options=None, setup_logging=True, env=None) ایجاد یک محیط مجازی با دریافت آرگومان‌های رابط خط فرمان. .INDENT 7.0 .TP .B "پارامترها (Parameters)" .INDENT 7.0 .IP \(bu 2 \fBargs\fP (\fBlist\fP \%[\fBstr\fP \%]) \-\- آرگومان‌های خط فرمان .IP \(bu 2 \fBoptions\fP (\fBVirtualEnvOptions\fP | \fBNone\fP \%) \-\- ارسال یک شیء \fBVirtualEnvOptions\fP امکان بازگرداندن گزینه‌های تجزیه‌شده را فراهم می‌کند .IP \(bu 2 \fBsetup_logging\fP (\fBbool\fP \%) \-\- مقدار \fBTrue\fP برای راه‌اندازی گرداننده‌های ثبت وقایع (logging handlers)، مقدار \fBFalse\fP برای استفاده از گرداننده‌هایی که از پیش ثبت شده‌اند .IP \(bu 2 \fBenv\fP (\fBMutableMapping\fP \%[\fBstr\fP \%, \fBstr\fP \%] | \fBNone\fP \%) \-\- متغیرهای محیطی برای استفاده .UNINDENT .TP .B "نوع بازگشتی (Return type)" \fBSession\fP .TP .B "بازمی‌گرداند (Returns)" شیء نشست حاصل از ایجاد (ساختار آن در حال حاضر آزمایشی است و ممکن است با اطلاع‌رسانی کوتاهی تغییر کند) .UNINDENT .UNINDENT .INDENT 0.0 .TP .B virtualenv.session_via_cli(args, options=None, setup_logging=True, env=None) ایجاد یک نشست virtualenv (مشابه cli_run، با این تفاوت که این تابع فرایند ساخت را انجام نمی‌دهد). اگر فقط می‌خواهید وضعیت محیط مجازی را بدون ایجاد واقعی آن بررسی و پرس‌وجو کنید، از این تابع استفاده کنید. .INDENT 7.0 .TP .B "پارامترها (Parameters)" .INDENT 7.0 .IP \(bu 2 \fBargs\fP (\fBlist\fP \%[\fBstr\fP \%]) \-\- آرگومان‌های خط فرمان .IP \(bu 2 \fBoptions\fP (\fBVirtualEnvOptions\fP | \fBNone\fP \%) \-\- ارسال یک شیء \fBVirtualEnvOptions\fP امکان بازگرداندن گزینه‌های تجزیه‌شده را فراهم می‌کند .IP \(bu 2 \fBsetup_logging\fP (\fBbool\fP \%) \-\- مقدار \fBTrue\fP برای راه‌اندازی گرداننده‌های ثبت وقایع (logging handlers)، مقدار \fBFalse\fP برای استفاده از گرداننده‌هایی که از پیش ثبت شده‌اند .IP \(bu 2 \fBenv\fP (\fBMutableMapping\fP \%[\fBstr\fP \%, \fBstr\fP \%] | \fBNone\fP \%) \-\- متغیرهای محیطی برای استفاده .UNINDENT .TP .B "نوع بازگشتی (Return type)" \fBSession\fP .TP .B "بازمی‌گرداند (Returns)" شیء نشست حاصل از ایجاد (ساختار آن در حال حاضر آزمایشی است و ممکن است با اطلاع‌رسانی کوتاهی تغییر کند) .UNINDENT .UNINDENT .SS "کلاس Session (Session class)" .sp کلاس \fBSession\fP نمایانگر یک نشست ساخت virtualenv است و امکان دسترسی به ویژگی‌های محیط ایجادشده را فراهم می‌کند. .INDENT 0.0 .TP .B class virtualenv.run.session.Session(verbosity, app_data, interpreter, creator, seeder, activators) نمایانگر یک نشست ایجاد محیط مجازی است. .INDENT 7.0 .TP .B "پارامترها (Parameters)" .INDENT 7.0 .IP \(bu 2 \fBverbosity\fP (\fBint\fP \%) .IP \(bu 2 \fBapp_data\fP (\fBAppData\fP \%<#\:virtualenv\:.app_data\:.base\:.AppData>) .IP \(bu 2 \fBinterpreter\fP (\fBPythonInfo\fP \%<#\:virtualenv\:.discovery\:.py_info\:.PythonInfo>) .IP \(bu 2 \fBcreator\fP (\fBCreator\fP \%<#\:virtualenv\:.create\:.creator\:.Creator>) .IP \(bu 2 \fBseeder\fP (\fBSeeder\fP \%<#\:virtualenv\:.seed\:.seeder\:.Seeder>) .IP \(bu 2 \fBactivators\fP (\fBlist\fP \%[\fBActivator\fP \%<#\:virtualenv\:.activation\:.activator\:.Activator>]) .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property verbosity: int \% میزان پرگویی (verbosity) اجرا. .UNINDENT .INDENT 7.0 .TP .B property interpreter: PythonInfo \%<#\:virtualenv\:.discovery\:.py_info\:.PythonInfo> یک محیط مجازی بر پایه این مفسر مرجع ایجاد می‌کند. .UNINDENT .INDENT 7.0 .TP .B property creator: Creator \%<#\:virtualenv\:.create\:.creator\:.Creator> سازنده (creator) مورداستفاده برای ساخت محیط مجازی (باید با مفسر سازگار باشد). .UNINDENT .INDENT 7.0 .TP .B property seeder: Seeder \%<#\:virtualenv\:.seed\:.seeder\:.Seeder> سازوکار مورداستفاده برای تأمین بسته‌های اولیه (pip، setuptools و wheel). .UNINDENT .INDENT 7.0 .TP .B property activators: list \%[Activator \%<#\:virtualenv\:.activation\:.activator\:.Activator>] فعال‌سازهای مورداستفاده برای تولید اسکریپت‌های فعال‌سازی. .UNINDENT .UNINDENT.SS VirtualEnvOptions .sp فضای نام گزینه‌ها که به سازنده‌های افزونه ارسال شده و از طریق CLI، متغیرهای محیطی و فایل‌های پیکربندی مقداردهی می‌شود. .INDENT 0.0 .TP .B class virtualenv.config.cli.parser.VirtualEnvOptions(**kwargs) .INDENT 7.0 .TP .B پارامترها \fBkwargs\fP (\fBAny\fP \%) .UNINDENT .INDENT 7.0 .TP .B set_src(key, value, src) تنظیم مقدار یک گزینه و ثبت منبع آن. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBkey\fP (\fBstr\fP \%) \-\- نام گزینه .IP \(bu 2 \fBvalue\fP (\fBAny\fP \%) \-\- مقدار گزینه .IP \(bu 2 \fBsrc\fP (\fBstr\fP \%) \-\- منبع مقدار (برای نمونه \fB\(dqcli\(dq\fP، \fB\(dqenv var\(dq\fP، \fB\(dqdefault\(dq\fP) .UNINDENT .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B get_source(key) منبعی که مقدار یک گزینهٔ مشخص را ارائه داده است بازمی‌گرداند. .INDENT 7.0 .TP .B پارامترها \fBkey\fP (\fBstr\fP \%) \-\- نام گزینه .TP .B نوع بازگشتی \fBstr\fP \% | \fBNone\fP \% .TP .B مقدار بازگشتی رشتهٔ منبع (برای نمونه \fB\(dqcli\(dq\fP، \fB\(dqenv var\(dq\fP، \fB\(dqdefault\(dq\fP)، یا در صورت عدم رهگیری \fBNone\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property verbosity: int \% | None \% سطح پرگویی، محاسبه‌شده به‌صورت \fBverbose \- quiet\fP، محدودشده به صفر. .INDENT 7.0 .TP .B مقدار بازگشتی سطح پرگویی، یا \fBNone\fP اگر هنوز هیچ‌یک از \fB\-\-verbose\fP و \fB\-\-quiet\fP تجزیه نشده باشند .UNINDENT .UNINDENT .UNINDENT .SS توضیحات .sp این صفحه به تشریح تصمیمات طراحی و مفاهیم پشت virtualenv می‌پردازد. تمرکز آن بر درک دلیل کارکرد امور به شیوهٔ فعلی است. .SS virtualenv در برابر venv در برابر uv .sp از زمان Python 3.3، کتابخانه استاندارد شامل ماژول \fBvenv\fP است که امکان ایجاد محیط مجازی پایه‌ای را بر اساس PEP 405 \%\& فراهم می‌کند. ابزار uv \% ابزاری جدیدتر و مبتنی بر Rust است که آن هم محیط‌های مجازی را از طریق \fBuv venv\fP ایجاد می‌کند. .sp virtualenv جایگاهی میانه دارد: سریع‌تر و پرامکانات‌تر از \fBvenv\fP است، در حالی که همچنان یک راهکار خالص پایتونی با سامانه‌ای از افزونه‌ها برای توسعه‌پذیری باقی می‌ماند. .TS box center; l|l|l|l. T{ T} T{ \fBvenv\fP T} T{ \fBvirtualenv\fP T} T{ uv \% T} _ T{ عملکرد T} T{ کندترین (+۶۰ ثانیه)؛ pip \% را به‌عنوان زیرفرآیند برای seed اجرا می‌کند. T} T{ سریع؛ ایمیج‌های نصب ازپیش‌ساخته را کِش می‌کند، ساخت‌های بعدی کمتر از ۱ ثانیه. T} T{ سریع‌ترین؛ پیاده‌سازی Rust، در حد میلی‌ثانیه. به‌طور پیش‌فرض pip/setuptools را seed نمی‌کند. T} _ T{ توسعه‌پذیری T} T{ فاقد سامانه افزونه. T} T{ سامانه افزونه برای کشف (discovery)، ساخت، seeding و فعال‌سازی. T} T{ فاقد سامانه افزونه. T} _ T{ پشتیبانی بین‌نسخه‌ای T} T{ فقط همان نسخه پایتونی که تحت آن اجرا می‌شود. T} T{ هر پایتون نصب‌شده از طریق کشف خودکار (رجیستری، مدیریت‌شده توسط uv، متغیر PATH). T} T{ هر پایتون نصب‌شده یا مدیریت‌شده توسط uv. T} _ T{ قابلیت ارتقا T} T{ وابسته به انتشار نسخه‌های پایتون. T} T{ مستقل از طریق PyPI \%\&. T} T{ مستقل از طریق چرخه انتشار خودش. T} _ T{ رابط برنامه‌نویسی (API) T} T{ تنها تابع پایه‌ای \fBcreate()\fP. T} T{ رابط برنامه‌نویسی کامل پایتون؛ می‌تواند محیط‌ها را بدون ایجادشان توصیف کند. استفاده‌شده توسط tox \%، poetry \%، pipx \% و غیره. T} T{ فقط خط فرمان. T} _ T{ حاشیه‌نویسی نوع‌ها T} T{ فاقد نشانگر \fBpy.typed\fP؛ حاشیه‌نویسی‌های محدود. T} T{ کاملاً نوع‌گذاری‌شده با نشانگر \fBpy.typed\fP بر اساس \fBPEP 561\fP \%؛ بررسی‌شده توسط ty \%\&. T} T{ نامربوط (باینری Rust). T} _ T{ مناسب‌ترین برای T} T{ بدون وابستگی، نیازهای اولیه. T} T{ توسعه‌پذیری افزونه، رابط برنامه‌نویسی (API)، سازگاری ابزارها (tox \%، virtualenvwrapper \%). T} T{ بیشترین سرعت، در صورت استفاده کنونی از \fBuv\fP برای مدیریت بسته. T} .TE [graph].SS نسخه‌های پشتیبانی‌شده پایتون .sp virtualenv میان مفسر \fBhost\fP (پایتونی که خودِ virtualenv را اجرا می‌کند) و مفسر \fBtarget\fP (پایتونی که محیط مجازی برای آن ساخته می‌شود) تمایز قائل می‌شود. هنگامی که \fB\-\-python\fP مشخص نشده باشد، مفسر میزبان (host) و هدف (target) یکسان هستند..SS مفسر میزبان .sp ابزار virtualenv به CPython یا PyPy نسخه \fB3.9 یا بالاتر\fP به عنوان مفسر میزبان نیاز دارد. این موضوع توسط \fBrequires\-python >= 3.9\fP در متاداده‌های بسته اعمال می‌شود. .SS مفسر هدف .sp مفسر هدف می‌تواند با مفسر میزبان متفاوت باشد. virtualenv می‌تواند برای هر مفسر Python که در سیستم شناسایی کند محیط‌های مجازی ایجاد کند، به شرط آن که یک creator (سازنده) منطبق برای آن وجود داشته باشد. .TS box center; l|l|l. T{ پیاده‌سازی T} T{ پلتفرم‌ها T} T{ یادداشت‌ها T} _ T{ CPython T} T{ Linux, macOS, Windows T} T{ نسخه 3.9+. ساخت‌های Free\-threaded در 3.13+ پشتیبانی می‌شوند. شامل پشتیبانی از ساخت‌های دیباگ Windows، Microsoft Store، Homebrew و macOS framework. T} _ T{ PyPy T} T{ Linux, macOS, Windows T} T{ 3.9+. T} _ T{ GraalPy T} T{ Linux, macOS, Windows T} T{ 24.1+. پوشش آزمون حداقلی، به عنوان آزمایشی (experimental) علامت‌گذاری شده است. T} _ T{ RustPython T} T{ Linux, macOS, Windows T} T{ پوشش آزمون حداقلی، به عنوان آزمایشی (experimental) علامت‌گذاری شده است. T} .TE .sp بسته‌های اولیه (\fBpip\fP، \fBsetuptools\fP) برای CPython نسخه 3.9 تا 3.16 به صورت گنجانده‌شده (bundled) ارائه شده‌اند. مفسر هدفی که از بالاترین نسخه گنجانده‌شده جدیدتر باشد، مجدداً از جدیدترین بسته گنجانده‌شده استفاده می‌کند. مفسر هدفی که از قدیمی‌ترین نسخه گنجانده‌شده قدیمی‌تر باشد هیچ wheel سازگار گنجانده‌شده‌ای ندارد، بنابراین seederهای گنجانده‌شده پیش از ایجاد محیط آن را رد می‌کنند؛ برای یک محیط خالی گزینه \fB\-\-no\-seed\fP را مشخص کنید، یا seederی را انتخاب نمایید که بسته‌های wheel را برای آن نسخه ارائه می‌دهد. .SS نحوه کارکرد virtualenv .sp بسته‌بندی در Python اغلب با یک مشکل اساسی مواجه است: برنامه‌های مختلف به نسخه‌های متفاوتی از یک کتابخانه یکسان نیاز دارند. اگر برنامه A به \fBrequests==2.25.1\fP نیاز داشته باشد اما برنامه B به \fBrequests==2.28.0\fP نیاز داشته باشد، نصب هر دوی آن‌ها در دایرکتوری سراسری site\-packages باعث ایجاد تداخل می‌شود. در یک مکان مشخص تنها یک نسخه می‌تواند وجود داشته باشد. .sp ابزار virtualenv این مشکل را با ایجاد محیط‌های ایزوله Python برطرف می‌کند. هر محیط دارای دایرکتوری‌های نصب مخصوص به خود است و می‌تواند مجموعه‌ای از بسته‌های نصب‌شده خود را مستقل از سایر محیط‌ها و Python سیستم نگهداری کند. .sp ابزار virtualenv در دو مرحله مجزا کار می‌کند: [graph].INDENT 0.0 .TP \fBمرحله ۱: شناسایی یک مفسر Python\fP ابزار virtualenv ابتدا مشخص می‌کند از کدام مفسر Python به عنوان الگو برای محیط مجازی استفاده کند. به طور پیش‌فرض، از همان نسخه Python استفاده می‌کند که خود virtualenv روی آن در حال اجرا است. می‌توانید این رفتار را با پرچم \fB\-\-python\fP بازنویسی کنید تا مفسر متفاوتی را مشخص نمایید. .TP \fBمرحله ۲: ایجاد محیط مجازی\fP پس از شناسایی مفسر هدف، virtualenv محیط را در چهار مرحله ایجاد می‌کند: .INDENT 7.0 .IP 1. 3 ایجاد یک فایل اجرایی Python منطبق با مفسر هدف .IP 2. 3 نصب بسته‌های اولیه (pip، setuptools، wheel) جهت امکان‌پذیر ساختن نصب بسته‌ها .IP 3. 3 نصب اسکریپت‌های فعال‌سازی برای پوسته‌های مختلف .IP 4. 3 ایجاد فایل‌های نادیده‌گیری VCS (در حال حاضر \fB\&.gitignore\fP گیت، صرف‌نظر کردن با \fB\-\-no\-vcs\-ignore\fP) .UNINDENT .UNINDENT .sp یک اصل طراحی مهم: محیط‌های مجازی خودکفا (self\-contained) نیستند. یک نصب کامل Python شامل هزاران فایل است و کپی کردن تمامی آن‌ها در هر محیط مجازی موجب اتلاف منابع خواهد بود. در عوض، محیط‌های مجازی پوسته‌هایی سبک هستند که بیشتر محتوای خود را از Python سیستم قرض می‌گیرند. آن‌ها تنها شامل مواردی هستند که برای تغییر جهت دادن رفتار Python لازم است. .sp این نوع طراحی دو پیامد دارد: .INDENT 0.0 .IP \(bu 2 ایجاد محیط سریع است زیرا تنها تعداد کمی فایل باید ایجاد شوند. .IP \(bu 2 ارتقای Python سیستم ممکن است بر محیط‌های مجازی موجود تأثیر بگذارد، زیرا آن‌ها به کتابخانه استاندارد و افزونه‌های باینری Python سیستم ارجاع می‌دهند. .UNINDENT .sp فایل اجرایی Python در یک محیط مجازی عملاً از مفسری که برای ایجاد آن استفاده شده ایزوله است، اما فایل‌های پشتیبان به اشتراک گذاشته شده‌اند. .sp \fBهشدار:\fP .INDENT 0.0 .INDENT 3.5 اگر Python سیستم خود را ارتقا دهید، محیط‌های مجازی موجود همچنان نسخه قبلی را گزارش خواهند کرد (شماره نسخه در خود فایل اجرایی Python تعبیه شده است)، اما از کتابخانه استاندارد و اکستنشن‌های باینری نسخه جدید استفاده خواهند کرد. این وضعیت معمولاً بدون مشکل کار می‌کند، اما در نظر داشته باشید که محیط در عمل ترکیبی پیوندی از نسخه‌های قدیم و جدید Python را اجرا می‌کند. .UNINDENT .UNINDENT.SS کشف پایتون (Python discovery) .sp پیش از ساخت یک محیط مجازی، virtualenv باید یک مفسر Python را پیدا کند. مفسر، نسخهٔ Python محیط مجازی، پیاده‌سازی آن (CPython، PyPy و غیره) و معماری آن (32\-bit یا 64\-bit) را مشخص می‌کند. .sp پرچم \fB\-\-python\fP چندین قالب مشخص‌کننده را می‌پذیرد: .INDENT 0.0 .TP \fBمشخص‌کنندهٔ مسیر (Path specifier)\fP یک مسیر مطلق یا نسبی به فایل اجرایی Python، مانند \fB/usr/bin/python3.14\fP یا \fB\&./python\fP\&. .TP \fBمشخص‌کنندهٔ نسخه (Version specifier)\fP رشته‌ای با قالب \fB{implementation}{version}{architecture}{machine}\fP که در آن: .INDENT 7.0 .IP \(bu 2 Implementation (پیاده‌سازی) شامل نویسه‌های الفبایی است (\fBpython\fP به معنای هر پیاده‌سازی است؛ در صورت حذف، پیش‌فرض \fBpython\fP خواهد بود). .IP \(bu 2 Version (نسخه) اعدادی جداشده با نقطه است، که می‌تواند به صورت اختیاری با \fBt\fP برای ساخت‌های دارای free\-threading همراه باشد. .IP \(bu 2 Architecture (معماری) برابر با \fB\-64\fP یا \fB\-32\fP است (در صورت حذف، به معنای هر معماری خواهد بود). .IP \(bu 2 Machine (ماشین) معماری مجموعه دستورالعمل پردازنده است، مانند \fB\-arm64\fP، \fB\-x86_64\fP، \fB\-aarch64\fP (در صورت حذف، به معنای هر ماشینی خواهد بود). نام‌های مستعار چندسکویی به‌طور خودکار یکسان‌سازی می‌شوند (\fBamd64\fP ↔ \fBx86_64\fP، \fBaarch64\fP ↔ \fBarm64\fP). .UNINDENT .sp مثال‌ها: .INDENT 7.0 .IP \(bu 2 \fBpython3.14.1\fP \- هر پیاده‌سازی Python با نسخهٔ 3.14.1 .IP \(bu 2 \fB3\fP \- هر پیاده‌سازی Python با نسخهٔ اصلی 3 .IP \(bu 2 \fB3.13t\fP \- هر پیاده‌سازی Python نسخهٔ 3.13 با ویژگی free\-threading فعال .IP \(bu 2 \fBcpython3\fP \- پیاده‌سازی CPython با نسخهٔ اصلی 3 .IP \(bu 2 \fBpypy2\fP \- پیاده‌سازی PyPy با نسخهٔ اصلی 2 .IP \(bu 2 \fBcpython3.12\-64\-arm64\fP \- نگارش CPython 3.12، معماری 64\-bit، معماری ARM64 .IP \(bu 2 \fB3.11\-64\-x86_64\fP \- هر پیاده‌سازی، نسخهٔ 3.11، معماری 64\-bit، معماری x86_64 .IP \(bu 2 \fBrustpython\fP \- پیاده‌سازی RustPython .UNINDENT .TP \fBمشخص‌کنندهٔ نسخه بر اساس PEP 440\fP محدودیت‌های نسخه با استفاده از عملگرهای PEP 440: .INDENT 7.0 .IP \(bu 2 \fB>=3.12\fP \- هر نسخهٔ Python 3.12 یا بالاتر .IP \(bu 2 \fB~=3.11.0\fP \- سازگار با Python 3.11.0 .IP \(bu 2 \fBcpython>=3.10\fP \- نگارش CPython 3.10 یا بالاتر .UNINDENT .UNINDENT .sp هنگامی که یک مشخص‌کننده ارائه می‌دهید، virtualenv با استفاده از این راهبرد به جستجوی مفسرهای منطبق می‌پردازد: [نمودار] .INDENT 0.0 .IP 1. 3 \fBWindows Registry\fP (تنها در Windows): بررسی نصب‌های ثبت‌شدهٔ Python طبق PEP 514 \%\&. .IP 2. 3 \fBنصب‌های مدیریت‌شده با uv\fP: بررسی متغیر محیطی \fBUV_PYTHON_INSTALL_DIR\fP یا دایرکتوری‌های ویژهٔ هر پلتفرم uv Python برای یافتن نصب‌های مدیریت‌شدهٔ Python. .IP 3. 3 \fBجستجو در PATH\fP: جستجو برای فایل‌های اجرایی در متغیر محیطی \fBPATH\fP با نام‌های منطبق بر مشخصات داده‌شده. .UNINDENT .SS تفکیک shimهای مدیر نسخه (Version manager shim resolution) .sp مدیرهای نسخه مانند pyenv \%، ‏mise \% و asdf \% اسکریپت‌های واسط (shim) سبکی را در \fBPATH\fP قرار می‌دهند که درخواست‌ها را به باینری واقعی Python محول می‌کنند. هنگامی که virtualenv یک مفسر Python را با اجرای آن در قالب یک زیرپردازش شناسایی می‌کند، ممکن است این shimها نسخهٔ نادرستی از Python را انتخاب کنند (معمولاً Python سیستم)؛ چرا که منطق تفکیک shim به وضعیت محیط پوسته وابسته است که به‌طور کامل به پردازش‌های فرزند منتقل نمی‌شود. .sp ابزار virtualenv با بررسی اینکه آیا فایل اجرایی نامزد در یک دایرکتوری شناخته‌شدهٔ shim (\fB$PYENV_ROOT/shims\fP، \fB$MISE_DATA_DIR/shims\fP یا \fB$ASDF_DATA_DIR/shims\fP) قرار دارد یا خیر، shimها را شناسایی می‌کند. هنگامی که یک shim شناسایی می‌شود، virtualenv آن را دور زده و باینری واقعی را مستقیماً در دایرکتوری \fBversions\fP مدیر نسخه و با استفاده از نسخهٔ فعال حاصل از موارد زیر پیدا می‌کند: .INDENT 0.0 .IP 1. 3 متغیر محیطی \fBPYENV_VERSION\fP (برای چندین نسخه با دونقطه از هم جدا می‌شوند). .IP 2. 3 یک فایل \fB\&.python\-version\fP در دایرکتوری جاری یا هر یک از دایرکتوری‌های والد. .IP 3. 3 فایل نسخهٔ سراسری در \fB$PYENV_ROOT/version\fP\&. .UNINDENT .sp این سازوکار میان pyenv، mise و asdf مشترک است، بنابراین منطق تفکیک یکسانی برای هر سه کار می‌کند. .sp \fBهشدار:\fP .INDENT 0.0 .INDENT 3.5 محیط‌های مجازی معمولاً به کتابخانهٔ استاندارد Python سیستم ارجاع می‌دهند. اگر Python سیستم را ارتقا دهید، محیط مجازی نسخهٔ قدیمی (جاسازی‌شده در فایل اجرایی Python خود) را گزارش خواهد داد، اما در عمل از محتوای کتابخانهٔ استاندارد نسخهٔ جدید استفاده می‌کند. این موضوع می‌تواند هنگام عیب‌یابی رفتارهای وابسته به نسخه باعث سردرگمی شود. .sp اگر از Python یک محیط مجازی به‌عنوان هدف برای ساخت یک محیط مجازی دیگر استفاده کنید، virtualenv نسخهٔ Python سیستم را شناسایی کرده و محیطی منطبق بر نسخهٔ واقعی (ارتقایافته) ایجاد می‌کند، نه نسخه‌ای که توسط محیط مجازی گزارش شده است. .UNINDENT .UNINDENT.SS "ایجادکننده‌ها (Creators)" .sp ایجادکننده‌ها مسئول ساختاردهی به محیط مجازی هستند. ابزار virtualenv از دو نوع ایجادکننده پشتیبانی می‌کند: .INDENT 0.0 .TP \fBایجادکنندهٔ venv (venv creator)\fP این ایجادکننده کل فرآیند ساخت را پیرو PEP 405 \%\& به ماژول \fBvenv\fP کتابخانهٔ استاندارد واگذار می‌کند. ایجادکنندهٔ venv نیازمند ایجاد یک زیرفرآیند برای فراخوانی ماژول venv است، مگر اینکه virtualenv در Python سیستم نصب شده باشد. .sp سربار ناشی از زیرفرآیند می‌تواند قابل‌توجه باشد، به‌ویژه در Windows که ایجاد فرآیند در آن پرهزینه است. .TP \fBایجادکنندهٔ توکار (builtin creator)\fP این ایجادکننده بدان معناست که virtualenv خود فرآیند ایجاد را با دانستن دقیق این‌که چه فایل‌هایی باید ایجاد شوند و به کدام فایل‌های سیستم باید ارجاع داده شود، انجام می‌دهد. ایجادکنندهٔ builtin در واقع خانواده‌ای از ایجادکننده‌های تخصصی برای ترکیب‌های مختلف پیاده‌سازی‌های Python (نظیر CPython، PyPy، GraalPy و RustPython) و بسترها (Windows، POSIX) است. نام \fBbuiltin\fP یک نام مستعار است که نخستین ایجادکنندهٔ توکار دردسترس را برای محیط هدف انتخاب می‌کند. .sp از آنجا که ایجادکننده‌های توکار نیازی به فراخوانی زیرفرآیند ندارند، عموماً سریع‌تر از ایجادکنندهٔ venv عمل می‌کنند. .UNINDENT [graph] .sp ابزار virtualenv به‌طور پیش‌فرض در صورت دردسترس بودن ایجادکنندهٔ توکار برای محیط هدف، از آن استفاده می‌کند و در غیر این صورت به ایجادکنندهٔ venv بازمی‌گردد. .sp صرف‌نظر از اینکه کدام ایجادکننده اجرا شود، مفسر در نهایت تحت چندین نام قابل‌دسترس خواهد بود که در چیدمان محیط (Environment layout) \%<>\& فهرست شده‌اند. ابزارهای مختلف نام‌های متفاوتی را فراخوانی می‌کنند \- ممکن است یک خط شِبانگ (shebang) به \fBpython\fP اشاره کند، یا یک وظیفهٔ CI نام نسخه‌دار را فراخوانی نماید \- و محیطی که تنها یکی از آن‌ها را ارائه دهد، عملکرد بقیه را مختل می‌کند. ایجادکننده‌های توکار نام‌های دارای نسخه را از مفسر هدف برمی‌دارند و نام فایل اجراییِ خود میزبان را نیز اضافه می‌کنند؛ بنابراین میزبانی با نام \fBpypy3.11\fP یا \fBpython_d.exe\fP همچنان با همان نامی که فراخوانندگانش استفاده می‌کنند در دسترس باقی می‌ماند. .sp در Windows فایل‌ها به‌جای پیوند نمادین رونوشت (کپی) می‌شوند، چرا که پیوند نمادین مفسر در آنجا قابل‌اعتماد نیست (bpo\-42013 \%). از CPython 3.13 به بعد، فایلی که کپی می‌شود خود مفسر نیست، بلکه بازهدایت‌گر \fBvenvlauncher.exe\fP برگرفته از کتابخانهٔ استاندارد میزبان است. این بازهدایت‌گر فایل \fBpyvenv.cfg\fP را می‌خواند و کنترل را به پیشوند پایه منتقل می‌کند، که این امر مانع از کپی شدن فایل‌های DLL و فایل zip کتابخانهٔ استاندارد در تک‌تک محیط‌ها می‌شود. اینکه فایل کپی‌شده چه نامی دارد تفاوتی در مقصد نهایی ایجاد نمی‌کند، زیرا بازهدایت‌گر هدف خود را بر اساس مقداری که درون آن کامپایل شده تعیین می‌کند، نه از روی نام فایل خودش. .SS "بذرپاش‌ها (Seeders)" .sp پس از ایجاد ساختار محیط مجازی، virtualenv بسته‌های اولیه را که مدیریت بسته را در محیط ممکن می‌سازند، نصب می‌کند. بسته‌های اولیه عبارت‌اند از: .INDENT 0.0 .IP \(bu 2 \fBpip\fP \- نصب‌کنندهٔ بسته برای Python (همیشه نصب می‌شود). .IP \(bu 2 \fBsetuptools\fP \- کتابخانهٔ توسعه و نصب بسته (به‌طور پیش‌فرض در Python 3.12+ غیرفعال است). .UNINDENT .sp ابزار virtualenv از دو روش کاشت با ویژگی‌های عملکردی بسیار متفاوت پشتیبانی می‌کند: .INDENT 0.0 .TP \fBبذرپاش pip (pip seeder)\fP این روش با ایجاد یک فرآیند فرزند pip، از بستهٔ wheel همراه pip برای نصب بسته‌های اولیه استفاده می‌کند. این زیرفرآیند یک نصب کامل شامل از حالت فشرده خارج کردن بسته‌های wheel و تولید متاداده را انجام می‌دهد. این روش قابل‌اعتماد اما کند است و معمولاً ۹۸٪ از کل زمان ساخت محیط مجازی را مصرف می‌کند. .TP \fBبذرپاش app\-data (app\-data seeder)\fP این روش ایمیج‌های نصبیِ با قابلیت استفادهٔ مجدد را در دایرکتوری داده‌های برنامهٔ کاربر ایجاد می‌کند. نخستین باری که محیطی را با نسخه‌های مشخصی از بسته‌های اولیه ایجاد می‌کنید، بذرپاش app\-data ایمیج‌های نصب کاملی را ساخته و در حافظهٔ نهان ذخیره می‌کند. در ایجاد محیط‌های بعدی، این ایمیج‌های از پیش ساخته‌شده صرفاً به دایرکتوری \fBsite\-packages\fP محیط مجازی پیوند داده شده یا کپی می‌شوند. .sp مقایسهٔ عملکرد در ایجاد محیط‌های مجازی: [graph] .sp در بسترهایی که به‌طور بهینه از پیوندهای نمادین پشتیبانی می‌کنند (مانند Linux و macOS)، بذرپاش app\-data کاشتی تقریباً آنی را فراهم می‌کند. .sp می‌توانید با استفاده از متغیر محیطی \fBVIRTUALENV_OVERRIDE_APP_DATA\fP محل حافظهٔ نهان را بازنویسی کنید. .UNINDENT .SS "دریافت فایل‌های Wheel (Wheel acquisition)" .sp هر دو روش کاشت نیازمند فایل‌های wheel برای بسته‌های اولیه هستند. ابزار virtualenv فایل‌های wheel را با استفاده از یک سیستم اولویت‌بندی به دست می‌آورد: [graph] .INDENT 0.0 .TP \fBبسته‌های wheel توکار (Embedded wheels)\fP ابزار virtualenv با مجموعه‌ای از فایل‌های wheel عرضه می‌شود که مستقیماً در بسته گنجانده شده‌اند. این بسته‌ها همراه با نگارش virtualenv آزمایش شده‌اند و مجموعه‌ای پایه از بسته‌های اولیه را ارائه می‌دهند. نسخه‌های مختلف Python به نسخه‌های متفاوتی از بسته‌ها نیاز دارند، ازاین‌رو virtualenv چندین بستهٔ wheel مختلف را در خود گنجانده تا دامنهٔ گسترده‌ای از نسخه‌های Python را پشتیبانی کند. .TP \fBبسته‌های wheel توکار ارتقایافته (Upgraded embedded wheels)\fP کاربران می‌توانند با اجرای virtualenv به همراه پرچم \fB\-\-upgrade\-embed\-wheels\fP بسته‌های wheel توکار را به‌صورت دستی ارتقا دهند. این کار نسخه‌های جدیدتر بسته‌های اولیه را از PyPI دریافت کرده و آن‌ها را در دایرکتوری داده‌های برنامهٔ کاربر ذخیره می‌کند. فراخوانی‌های بعدی virtualenv به‌جای بسته‌های توکار پیش‌فرض، از این بسته‌های wheel ارتقایافته استفاده خواهند کرد. .sp همچنین virtualenv می‌تواند ارتقاهای خودکار دوره‌ای را انجام دهد (پایین‌تر را ببینید). .TP \fBدایرکتوری‌های جستجوی اضافی (Extra search directories)\fP کاربران می‌توانند با استفاده از پرچم \fB\-\-extra\-search\-dir\fP دایرکتوری‌های دیگری را که حاوی فایل‌های wheel هستند مشخص کنند. این قابلیت در محیط‌های بدون دسترسی به اینترنت (air\-gapped) یا هنگام استفاده از ساخت‌های سفارشی بسته‌ها مفید است. .TP \fBدانلود از PyPI (PyPI download)\fP اگر هیچ بستهٔ wheel مناسبی در مکان‌های بالا یافت نشود، یا اگر پرچم \fB\-\-download\fP تنظیم شده باشد، virtualenv از pip برای دانلود آخرین نسخهٔ سازگار از PyPI استفاده خواهد کرد. .UNINDENT.SS سازوکار به‌روزرسانی دوره‌ای .sp برای به‌روز نگه‌داشتن بسته‌های اولیه (seed packages) تا حدی معقول بدون نیاز به ارتقای دستی virtualenv یا اجرای \fB\-\-upgrade\-embed\-wheels\fP توسط کاربران، virtualenv یک سامانه به‌روزرسانی خودکار دوره‌ای را پیاده‌سازی می‌کند: [graph] .sp دوره انتظار ۲۸ روزه کاربران را در برابر دریافت خودکار بسته‌های تازه‌منتشرشده‌ای که ممکن است حاوی باگ باشند محافظت می‌کند. تأخیر ۱ ساعته پس از بارگیری تضمین می‌کند که سامانه‌های یکپارچه‌سازی مداوم در میانه اجرا از نسخه‌های متفاوتی از بسته‌ها استفاده نکنند، که می‌تواند باعث شکست‌های گیج‌کننده در آزمون‌ها شود. .sp می‌توانید سازوکار به‌روزرسانی دوره‌ای را با پرچم \fB\-\-no\-periodic\-update\fP غیرفعال کنید. .SS وصله‌کاری نگه‌دارندگان توزیع .sp توزیع‌های سیستم‌عامل و مدیرهای بسته گاهی نیاز دارند نسخه‌های بسته‌های اولیه مورد استفاده virtualenv را سفارشی‌سازی کنند. آن‌ها می‌خواهند بسته‌های همراه virtualenv را با نسخه‌های بسته‌های سیستم هماهنگ نمایند. .sp توزیع‌ها می‌توانند پودمان \fBvirtualenv.seed.wheels.embed\fP را وصله کنند و تابع \fBget_embed_wheel\fP را با پیاده‌سازی خود که فایل‌های wheel ارائه‌شده توسط توزیع را برمی‌گرداند، جایگزین نمایند. اگر بخواهند از مجموعه آزمون‌های virtualenv برای اعتبارسنجی استفاده کنند، باید متغیرهای \fBBUNDLE_FOLDER\fP، \fBBUNDLE_SUPPORT\fP، \fBMIN\fP، \fBMAX\fP و \fBOLDEST_SUPPORTED\fP را نیز فراهم کنند. متغیر \fBOLDEST_SUPPORTED\fP (شکل تجزیه‌شده \fBMIN\fP) کفی را تعیین می‌کند که پایین‌تر از آن، seederهای همراه از مقداردهی اولیه خودداری می‌کنند؛ بنابراین توزیعی که wheelها را برای یک Python قدیمی‌تر همراه می‌کند، باید این مقدار را متناسب با آن کاهش دهد. .sp توزیع‌ها همچنین باید وصله‌کردن \fBvirtualenv.seed.embed.base_embed.PERIODIC_UPDATE_ON_BY_DEFAULT\fP به \fBFalse\fP را مد نظر قرار دهند، تا به مدیر بسته سیستم اجازه دهند به‌روزرسانی‌های بسته‌های اولیه را به جای سازوکار به‌روزرسانی دوره‌ای virtualenv کنترل کند. کاربران همچنان می‌توانند ارتقاها را به‌صورت دستی از طریق \fB\-\-upgrade\-embed\-wheels\fP درخواست کنند، اما به‌روزرسانی‌های خودکار با بسته‌های مدیریت‌شده توسط سیستم تداخل نخواهند داشت. .SS فعال‌سازها .sp اسکریپت‌های فعال‌سازی، محیط پوسته فعلی را برای اولویت‌دادن به فایل‌های اجرایی محیط مجازی تغییر می‌دهند. این صرفاً یک سازوکار برای راحتی کار است \- شما همواره می‌توانید بدون فعال‌سازی از مسیرهای مطلق به فایل‌های اجرایی محیط مجازی استفاده کنید. .sp آنچه فعال‌سازی انجام می‌دهد: [graph].INDENT 0.0 .TP \fBتغییر PATH\fP اسکریپت فعال‌سازی، دایرکتوری \fBbin\fP محیط مجازی (\fBScripts\fP در ویندوز) را به ابتدای متغیر محیطی \fBPATH\fP اضافه می‌کند. این امر تضمین می‌کند که هنگام اجرای \fBpython\fP، \fBpip\fP یا سایر برنامه‌های اجرایی، پوسته ابتدا نسخه‌های مربوط به محیط مجازی را بیابد. .TP \fBمتغیرهای محیطی\fP فعال‌سازی چندین متغیر محیطی را مقداردهی می‌کند: .INDENT 7.0 .IP \(bu 2 \fBVIRTUAL_ENV\fP \- مسیر مطلق به دایرکتوری محیط مجازی. .IP \(bu 2 \fBVIRTUAL_ENV_PROMPT\fP \- پیشوند اعلان (نام محیط یا مقدار سفارشی از \fB\-\-prompt\fP). .IP \(bu 2 \fBPKG_CONFIG_PATH\fP \- برای شامل شدن دایرکتوری \fBlib/pkgconfig\fP محیط مجازی تغییر می‌یابد. .UNINDENT .TP \fBتغییر اعلان خط فرمان\fP به‌طور پیش‌فرض، فعال‌سازی نام محیط را به ابتدای اعلان پوسته اضافه می‌کند که معمولاً به‌صورت \fB(venv)\fP پیش از اعلان عادی نمایش داده می‌شود. این نشانگر بصری به شما یادآوری می‌کند کدام محیط فعال است. می‌توانید هنگام ساخت محیط این مورد را با پرچم \fB\-\-prompt\fP سفارشی کنید، یا با مقداردهی متغیر محیطی \fBVIRTUAL_ENV_DISABLE_PROMPT\fP آن را کاملاً غیرفعال سازید. .TP \fBغیرفعال‌سازی\fP اسکریپت‌های فعال‌سازی همچنین دستور \fBdeactivate\fP را فراهم می‌کنند که تغییرات را معکوس می‌کند، PATH اصلی شما را بازیابی کرده و متغیرهای محیطی و تغییرات اعلان را حذف می‌نماید. .UNINDENT .sp ابزار virtualenv اسکریپت‌های فعال‌سازی را برای چندین پوسته فراهم می‌کند: .INDENT 0.0 .IP \(bu 2 Bash \% (\fBactivate\fP) .IP \(bu 2 Fish \% (\fBactivate.fish\fP) .IP \(bu 2 Csh/Tcsh \% (\fBactivate.csh\fP) .IP \(bu 2 PowerShell \% (\fBactivate.ps1\fP) .IP \(bu 2 Windows Batch \% (\fBactivate.bat\fP) .IP \(bu 2 Nushell \% (\fBactivate.nu\fP) .IP \(bu 2 Python (\fBactivate_this.py\fP) \-\- برای فعال‌سازی برنامه‌نویسی‌شده از درون یک فرایند در حال اجرای Python، فعال‌سازی برنامه‌نویسی‌شده \%<#\:programmatic-activation> را ببینید .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 در ویندوز ۷ و جدیدتر، سیاست اجرای پیش‌فرض در PowerShell برابر با \fBRestricted\fP است که از اجرای اسکریپت \fBactivate.ps1\fP جلوگیری می‌کند. می‌توانید با تغییر این سیاست اجرا به اسکریپت‌های تولیدشده محلی اجازه اجرا بدهید: .INDENT 0.0 .INDENT 3.5 .sp .EX Set\-ExecutionPolicy RemoteSigned .EE .UNINDENT .UNINDENT .sp از آنجا که virtualenv فایل \fBactivate.ps1\fP را به‌طور محلی برای هر محیط تولید می‌کند، PowerShell آن را به جای یک اسکریپت از راه دور، اسکریپتی محلی در نظر گرفته و اجرای آن را تحت سیاست \fBRemoteSigned\fP مجاز می‌داند. .UNINDENT .UNINDENT .sp به یاد داشته باشید: فعال‌سازی اختیاری است. دستورهای زیر با یکدیگر معادل هستند: .INDENT 0.0 .INDENT 3.5 .sp .EX # With activation source venv/bin/activate python script.py deactivate # Without activation venv/bin/python script.py .EE .UNINDENT .UNINDENT .sp برای بررسی عمیق‌تر سازوکار درونی فعال‌سازی، به پست وبلاگ Allison Kaptur با عنوان There\(aqs no magic: virtualenv edition در \% مراجعه کنید که توضیح می‌دهد چگونه virtualenv از \fBPATH\fP و \fBPYTHONHOME\fP برای جداسازی محیط‌های مجازی استفاده می‌کند..SS "همچنین ببینید (SEE ALSO)" .INDENT 0.0 .IP \(bu 2 استفاده از virtualenv \%<> \- راهنماهای کاربردی برای کارهای متداول virtualenv. .IP \(bu 2 خط فرمان \%<> \- مستندات مرجع کامل CLI. .UNINDENT .SS "پلاگین‌ها (Plugins)" .sp ابزار virtualenv می‌تواند از طریق پلاگین‌ها با استفاده از entry pointهای پایتون گسترش یابد. پلاگین‌ها به‌طور خودکار از محیط پایتونی که virtualenv در آن نصب شده است شناسایی می‌شوند و به شما امکان می‌دهند نحوه ایجاد، بارگذاری بسته‌های اولیه (seed) و فعال‌سازی محیط‌های مجازی را سفارشی‌سازی کنید. .SS "نقاط گسترش (Extension points)" .sp ابزار virtualenv چهار نقطه گسترش را از طریق گروه‌های entry point فراهم می‌کند: .INDENT 0.0 .TP .B \fBvirtualenv.discovery\fP پلاگین‌های شناسایی مفسر پایتون. این پلاگین‌ها مفسرهای پایتونی را که به‌عنوان پایه برای ساخت محیط‌های مجازی استفاده خواهند شد، مکان‌یابی و شناسایی می‌کنند. .TP .B \fBvirtualenv.create\fP پلاگین‌های سازنده محیط مجازی. این پلاگین‌ها ساختار واقعی محیط مجازی، از جمله کپی کردن یا ایجاد پیوند نمادین (symlink) مفسر پایتون و کتابخانه استاندارد را مدیریت می‌کنند. .TP .B \fBvirtualenv.seed\fP پلاگین‌های نصب بسته‌های اولیه (seed). این پلاگین‌ها بسته‌های آغازین (مانند pip، setuptools و wheel) را در محیط‌های مجازی تازه ایجادشده نصب می‌کنند. .TP .B \fBvirtualenv.activate\fP پلاگین‌های اسکریپت فعال‌سازی شل. این پلاگین‌ها اسکریپت‌های فعال‌سازی ویژه هر شل را ایجاد می‌کنند که محیط را برای استفاده از محیط مجازی تغییر می‌دهند. .UNINDENT .sp تمامی نقاط گسترش از یک الگوی مشترک پیروی می‌کنند: virtualenv ورودی‌های ثبت‌شده (entry points) را شناسایی می‌کند، گزینه‌های خط فرمان (CLI) را بر اساس آن‌ها می‌سازد، و پیاده‌سازی‌های انتخاب‌شده را در حین ساخت محیط اجرا می‌کند. .SS "اولین پلاگین شما (Your first plugin)" .sp این آموزش مراحل ایجاد یک پلاگین شناسایی ساده را که مفسرهای پایتون مدیریت‌شده توسط pyenv را پیدا می‌کند، شرح می‌دهد. .SS "ایجاد ساختار بسته (Create the package structure)" .sp یک بسته جدید پایتون با ساختار زیر ایجاد کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX virtualenv\-pyenv/ ├── pyproject.toml └── src/ └── virtualenv_pyenv/ └── __init__.py .EE .UNINDENT .UNINDENT .SS "پیکربندی نقطه ورود (Configure the entry point)" .sp در فایل \fBpyproject.toml\fP، پلاگین خود را به عنوان یک entry point در زیر گروه \fBvirtualenv.discovery\fP تعریف کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [project] name = \(dqvirtualenv\-pyenv\(dq version = \(dq0.1.0\(dq dependencies = [\(dqvirtualenv>=20\(dq] [project.entry\-points.\(dqvirtualenv.discovery\(dq] pyenv = \(dqvirtualenv_pyenv:PyEnvDiscovery\(dq [build\-system] requires = [\(dqsetuptools>=61\(dq] build\-backend = \(dqsetuptools.build_meta\(dq .EE .UNINDENT .UNINDENT .SS "پیاده‌سازی پلاگین (Implement the plugin)" .sp در فایل \fBsrc/virtualenv_pyenv/__init__.py\fP، پلاگین شناسایی را با ایجاد زیرکلاسی از \fBDiscover\fP پیاده‌سازی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX from __future__ import annotations import subprocess from argparse import ArgumentParser from pathlib import Path from virtualenv.config.cli.parser import VirtualEnvOptions from virtualenv.discovery.discover import Discover from virtualenv.discovery.py_info import PythonInfo class PyEnvDiscovery(Discover): def __init__(self, options: VirtualEnvOptions) \-> None: super().__init__(options) self.python_spec = options.python if options.python else \(dqpython\(dq @classmethod def add_parser_arguments(cls, parser: ArgumentParser) \-> None: parser.add_argument( \(dq\-\-python\(dq, dest=\(dqpython\(dq, metavar=\(dqpy\(dq, type=str, default=None, help=\(dqpyenv Python version to use (e.g., 3.11.0)\(dq, ) def run(self) \-> PythonInfo | None: try: result = subprocess.run( [\(dqpyenv\(dq, \(dqwhich\(dq, \(dqpython\(dq], capture_output=True, text=True, check=True, ) python_path = Path(result.stdout.strip()) return PythonInfo.from_exe(str(python_path)) except (subprocess.CalledProcessError, FileNotFoundError) as e: raise RuntimeError(f\(dqFailed to locate pyenv Python: {e}\(dq) from e .EE .UNINDENT .UNINDENT.SS نصب افزونه .sp افزونه خود را در حالت توسعه در کنار virtualenv نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ pip install \-e virtualenv\-pyenv/ .EE .UNINDENT .UNINDENT .SS بررسی صحت افزونه .sp با اجرای دستور زیر، شناسایی افزونه توسط virtualenv را بررسی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-discovery help .EE .UNINDENT .UNINDENT .sp خروجی باید \fBpyenv\fP را به عنوان یک سازوکار شناساییِ دردسترس فهرست کند. اکنون می‌توانید از آن استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-discovery=pyenv myenv created virtual environment CPython3.11.0.final.0\-64 in 234ms creator CPython3Posix(dest=/path/to/myenv, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/path) added seed packages: pip==23.0, setuptools==65.5.0, wheel==0.38.4 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator .EE .UNINDENT .UNINDENT .SS راهنماهای گام‌به‌گام افزونه .sp این صفحه راهنماهایی وظیفه‌محور را برای ساخت هر نوع افزونه virtualenv فراهم می‌کند. .SS ساخت یک افزونه شناسایی (discovery) .sp افزونه‌های شناسایی، مفسرهای Python را پیدا می‌کنند. افزونه خود را ذیل گروه نقطه ورود \fBvirtualenv.discovery\fP ثبت کنید. .sp رابط \fBDiscover\fP را پیاده‌سازی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX from __future__ import annotations from argparse import ArgumentParser from virtualenv.config.cli.parser import VirtualEnvOptions from virtualenv.discovery.discover import Discover from virtualenv.discovery.py_info import PythonInfo class CustomDiscovery(Discover): @classmethod def add_parser_arguments(cls, parser: ArgumentParser) \-> None: parser.add_argument(\(dq\-\-custom\-opt\(dq, help=\(dqcustom discovery option\(dq) def __init__(self, options: VirtualEnvOptions) \-> None: super().__init__(options) self.custom_opt = options.custom_opt def run(self) \-> PythonInfo | None: # Locate Python interpreter and return PythonInfo return PythonInfo.from_exe(str(self._find_python())) def _find_python(self) \-> str: # Implementation\-specific logic ... .EE .UNINDENT .UNINDENT .sp نقطه ورود را ثبت کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [virtualenv.discovery] custom = your_package.discovery:CustomDiscovery .EE .UNINDENT .UNINDENT.SS ایجاد یک افزونه creator .sp افزونه‌های creator ساختار محیط مجازی را می‌سازند. آنها را تحت \fBvirtualenv.create\fP ثبت کنید. .sp رابط \fBCreator\fP را پیاده‌سازی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX from __future__ import annotations from argparse import ArgumentParser from virtualenv.app_data.base import AppData from virtualenv.config.cli.parser import VirtualEnvOptions from virtualenv.create.creator import Creator, CreatorMeta from virtualenv.discovery.py_info import PythonInfo class CustomCreator(Creator): @classmethod def add_parser_arguments( cls, parser: ArgumentParser, interpreter: PythonInfo, meta: CreatorMeta, app_data: AppData, ) \-> None: parser.add_argument(\(dq\-\-custom\-creator\-opt\(dq, help=\(dqcustom creator option\(dq) def __init__(self, options: VirtualEnvOptions, interpreter: PythonInfo) \-> None: super().__init__(options, interpreter) self.custom_opt = options.custom_creator_opt def create(self) \-> None: # Create directory structure self.bin_dir.mkdir(parents=True, exist_ok=True) # Copy or symlink Python executable self.install_python() # Set up site\-packages self.install_site_packages() # Write pyvenv.cfg self.set_pyenv_cfg() .EE .UNINDENT .UNINDENT .sp نقطه ورود (entry point) را با استفاده از یک الگوی نام‌گذاری که با پلتفرم و نسخهٔ پایتون مطابقت دارد ثبت کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [virtualenv.create] cpython3\-posix = virtualenv.create.via_global_ref.builtin.cpython.cpython3:CPython3Posix cpython3\-win = virtualenv.create.via_global_ref.builtin.cpython.cpython3:CPython3Windows .EE .UNINDENT .UNINDENT .SS ایجاد یک افزونه seeder .sp افزونه‌های seeder بسته‌های اولیه را درون محیط مجازی نصب می‌کنند. آنها را تحت \fBvirtualenv.seed\fP ثبت کنید. .sp متد \fBcannot_seed\fP را بازنویسی کنید تا مفسرهای هدفی که seeder از آن‌ها پشتیبانی نمی‌کند رد شوند. کلاس پایه برای هر مفسر مقدار \fBNone\fP را برمی‌گرداند؛ در عوض یک پیام بازگردانید تا سازوکار انتخاب، seeder را پیش از ایجاد محیط رد کرده و پیام شما را به کاربر نشان دهد. به این ترتیب، یک افزونه می‌تواند به نسخه‌هایی از پایتون سرویس دهد که seederهای همراه دیگر فایلهای wheel را برای آن‌ها ارائه نمی‌کنند، مانند نسخه‌ای که دورهٔ پشتیبانی آن به پایان رسیده است. .sp رابط \fBSeeder\fP را پیاده‌سازی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX from __future__ import annotations from argparse import ArgumentParser from virtualenv.app_data.base import AppData from virtualenv.config.cli.parser import VirtualEnvOptions from virtualenv.create.creator import Creator from virtualenv.discovery.py_info import PythonInfo from virtualenv.seed.seeder import Seeder class CustomSeeder(Seeder): @classmethod def add_parser_arguments( cls, parser: ArgumentParser, interpreter: PythonInfo, app_data: AppData ) \-> None: parser.add_argument(\(dq\-\-custom\-seed\-opt\(dq, help=\(dqcustom seeder option\(dq) @classmethod def cannot_seed(cls, interpreter: PythonInfo) \-> str | None: # ship wheels down to Python 3.6, for example if interpreter.version_info[:2] >= (3, 6): return None return \(dqcustom seeder ships wheels only for Python 3.6 and later\(dq def __init__(self, options: VirtualEnvOptions, enabled: bool) \-> None: super().__init__(options, enabled) self.custom_opt = options.custom_seed_opt def run(self, creator: Creator) \-> None: # Install packages into creator.bin_dir / creator.script(\(dqpip\(dq) self._install_packages(creator) def _install_packages(self, creator: Creator) \-> None: # Implementation\-specific logic ... .EE .UNINDENT .UNINDENT .sp نقطه ورود را ثبت کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [virtualenv.seed] custom = your_package.seed:CustomSeeder .EE .UNINDENT .UNINDENT.SS ایجاد یک افزونه فعال‌ساز .sp افزونه‌های فعال‌ساز اسکریپت‌های فعال‌سازی پوسته را تولید می‌کنند. آن‌ها را ذیل \fBvirtualenv.activate\fP ثبت کنید\&. .sp رابط \fBActivator\fP را پیاده‌سازی کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX from __future__ import annotations from pathlib import Path from virtualenv.activation.activator import Activator from virtualenv.create.creator import Creator class CustomShellActivator(Activator): def generate(self, creator: Creator) \-> list[Path]: # Generate activation script content script_content = self._render_template(creator) # Write to activation directory dest = creator.bin_dir / self.script_name dest.write_text(script_content) return [dest] def _render_template(self, creator: Creator) \-> str: # Return activation script content return f\(dq\(dq\(dq # Custom shell activation script export VIRTUAL_ENV=\(dq{creator.dest}\(dq export PATH=\(dq{creator.bin_dir}:$PATH\(dq \(dq\(dq\(dq @property def script_name(self) \-> str: return \(dqactivate.custom\(dq .EE .UNINDENT .UNINDENT .sp نقطهٔ ورود را ثبت کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [virtualenv.activate] bash = virtualenv.activation.bash:BashActivator fish = virtualenv.activation.fish:FishActivator custom = your_package.activation:CustomShellActivator .EE .UNINDENT .UNINDENT .SS بسته‌بندی و توزیع یک افزونه .sp برای اعلان نقاط ورود از \fBpyproject.toml\fP استفاده کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX [project] name = \(dqvirtualenv\-custom\-plugin\(dq version = \(dq1.0.0\(dq dependencies = [\(dqvirtualenv>=20.0.0\(dq] [project.entry\-points.\(dqvirtualenv.discovery\(dq] custom = \(dqvirtualenv_custom.discovery:CustomDiscovery\(dq [project.entry\-points.\(dqvirtualenv.create\(dq] custom\-posix = \(dqvirtualenv_custom.creator:CustomCreator\(dq [project.entry\-points.\(dqvirtualenv.seed\(dq] custom = \(dqvirtualenv_custom.seeder:CustomSeeder\(dq [project.entry\-points.\(dqvirtualenv.activate\(dq] custom = \(dqvirtualenv_custom.activator:CustomActivator\(dq [build\-system] requires = [\(dqsetuptools>=61\(dq] build\-backend = \(dqsetuptools.build_meta\(dq .EE .UNINDENT .UNINDENT .sp افزونهٔ خود را در کنار virtualenv نصب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ pip install virtualenv\-custom\-plugin .EE .UNINDENT .UNINDENT .sp یا در حالت توسعه: .INDENT 0.0 .INDENT 3.5 .sp .EX $ pip install \-e /path/to/virtualenv\-custom\-plugin .EE .UNINDENT .UNINDENT .sp افزونهٔ خود را با ساخت یک محیط مجازی آزمایش کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX $ virtualenv \-\-discovery=custom \-\-creator=custom\-posix \-\-seeder=custom \-\-activators=custom test\-env .EE .UNINDENT .UNINDENT.SS مرجع API افزونه (Plugin API reference) .sp این صفحه رابط‌هایی را مستند می‌کند که افزونه‌ها باید پیاده‌سازی کنند. .SS شناسایی (Discovery) .sp افزونه‌های شناسایی، مفسرهای Python را برای ایجاد محیط‌های مجازی پیدا می‌کنند. .INDENT 0.0 .TP .B class virtualenv.discovery.discover.Discover(options) .INDENT 7.0 .TP .B پارامترها \fBoptions\fP (\fBVirtualEnvOptions\fP \%<#\:virtualenv\:.config\:.cli\:.parser\:.VirtualEnvOptions>) .UNINDENT .INDENT 7.0 .TP .B classmethod add_parser_arguments(parser) .INDENT 7.0 .TP .B پارامترها \fBparser\fP (\fBArgumentParser\fP \%) .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod run() .INDENT 7.0 .TP .B نوع بازگشتی \fBPythonInfo\fP | \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property interpreter: PythonInfo \%<#\:virtualenv\:.discovery\:.py_info\:.PythonInfo> | None \% مفسر بازگردانده‌شده توسط \fBrun()\fP، به‌صورت کش‌شده (cached). .UNINDENT .UNINDENT .SS PythonInfo .sp افزونه‌های شناسایی یک شیء \fBPythonInfo\fP بازمی‌گردانند که مفسرِ یافت‌شده را توصیف می‌کند. .INDENT 0.0 .TP .B class virtualenv.discovery.py_info.PythonInfo شامل اطلاعات مربوط به یک مفسر Python است. .INDENT 7.0 .TP .B platform: str \% .UNINDENT .INDENT 7.0 .TP .B implementation: str \% .UNINDENT .INDENT 7.0 .TP .B pypy_version_info: tuple \%[int \%, \&...] .UNINDENT .INDENT 7.0 .TP .B version_info: VersionInfo .UNINDENT .INDENT 7.0 .TP .B architecture: int \% .UNINDENT .INDENT 7.0 .TP .B sysconfig_platform: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B version_nodot: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B version: str \% .UNINDENT .INDENT 7.0 .TP .B os: str \% .UNINDENT .INDENT 7.0 .TP .B free_threaded: bool \% .UNINDENT .INDENT 7.0 .TP .B debug_build: bool \% .UNINDENT .INDENT 7.0 .TP .B prefix: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B base_prefix: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B real_prefix: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B base_exec_prefix: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B exec_prefix: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B executable: str \% .UNINDENT .INDENT 7.0 .TP .B original_executable: str \% .UNINDENT .INDENT 7.0 .TP .B system_executable: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B has_venv: bool \% .UNINDENT .INDENT 7.0 .TP .B path: list \%[str \%] .UNINDENT .INDENT 7.0 .TP .B file_system_encoding: str \% .UNINDENT .INDENT 7.0 .TP .B stdout_encoding: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B sysconfig_scheme: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B sysconfig_paths: dict \%[str \%, str \%] .UNINDENT .INDENT 7.0 .TP .B distutils_install: dict \%[str \%, str \%] .UNINDENT .INDENT 7.0 .TP .B sysconfig: dict \%[str \%, str \% | None \%] .UNINDENT .INDENT 7.0 .TP .B sysconfig_vars: dict \%[str \%, str \% | int \% | None \%] .UNINDENT .INDENT 7.0 .TP .B tcl_lib: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B tk_lib: str \% | None \% .UNINDENT .INDENT 7.0 .TP .B system_stdlib: str \% .UNINDENT .INDENT 7.0 .TP .B system_stdlib_platform: str \% .UNINDENT .INDENT 7.0 .TP .B max_size: int \% .UNINDENT .INDENT 7.0.TP .B install_path(key) مسیر نصب نسبی را برای \fIkey\fP طرح نصب مشخص برمی‌گرداند. .INDENT 7.0 .TP .B پارامترها \fBkey\fP (\fBstr\fP \%) \-\- کلید طرح نصب sysconfig (مانند \fB\(dqscripts\(dq\fP، \fB\(dqpurelib\(dq\fP). .TP .B نوع بازگشتی \fBstr\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property version_str: str \% نسخه کامل به‌صورت رشته \fBmajor.minor.micro\fP (مانند \fB3.13.2\fP). .UNINDENT .INDENT 7.0 .TP .B property version_release_str: str \% نسخه انتشار به‌صورت رشته \fBmajor.minor\fP (مانند \fB3.13\fP). .UNINDENT .INDENT 7.0 .TP .B property python_name: str \% نام فایل اجرایی پایتون به‌صورت \fBpythonX.Y\fP (مانند \fBpython3.13\fP). .UNINDENT .INDENT 7.0 .TP .B property is_old_virtualenv: bool \% \fBTrue\fP اگر این مفسر در یک virtualenv قدیمی اجرا شود (دارای \fBreal_prefix\fP باشد). .UNINDENT .INDENT 7.0 .TP .B property is_venv: bool \% \fBTrue\fP اگر این مفسر درون یک venv بر پایه PEP 405 اجرا شود (دارای \fBbase_prefix\fP باشد). .UNINDENT .INDENT 7.0 .TP .B sysconfig_path(key, config_var=None, sep=\(aq/\(aq) مسیر نصب sysconfig را برای یک \fIkey\fP طرح برمی‌گرداند، همراه با امکان جایگزینی اختیاری متغیرهای پیکربندی. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBkey\fP (\fBstr\fP \%) \-\- کلید مسیر sysconfig (مانند \fB\(dqpurelib\(dq\fP، \fB\(dqinclude\(dq\fP). .IP \(bu 2 \fBconfig_var\fP (\fBdict\fP \%[\fBstr\fP \%, \fBstr\fP \% | \fBint\fP \% | \fBNone\fP \%] | \fBNone\fP \%) \-\- نگاشت جایگزین برای متغیرهای sysconfig؛ زمانی که \fBNone\fP باشد از مقادیر خود مفسر استفاده می‌کند. .IP \(bu 2 \fBsep\fP (\fBstr\fP \%) \-\- جداکننده مسیر برای استفاده در نتیجه. .UNINDENT .TP .B نوع بازگشتی \fBstr\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property system_include: str \% مسیر دایرکتوری include سیستم برای سرآیندهای C. .UNINDENT .INDENT 7.0 .TP .B property system_prefix: str \% پیشوند پایتون سیستمی که این مفسر بر پایه آن است. .UNINDENT .INDENT 7.0 .TP .B property system_exec_prefix: str \% پیشوند اجرایی پایتون سیستمی که این مفسر بر پایه آن است. .UNINDENT .INDENT 7.0 .TP .B property system_exe: str \% فایل اجرایی پایتون سیستمی که این مفسر بر پایه آن است. .sp مقدار \fBsystem_executable\fP تا زمانی که \fBresolve_to_system()\fP زنجیره پیشوند را پیمایش کند \fBNone\fP باقی می‌ماند، بنابراین خواندن آن هر فراخواننده‌ای را ناچار می‌کند مقداری را که فرایند کشف قبلاً تثبیت کرده است محدود کند. سازوکار جایگزین در اینجا با آنچه خود فرایند تفکیک در هنگام ارجاع یک پیشوند به مفسر خودش می‌نویسد، مطابقت دارد. .UNINDENT .INDENT 7.0 .TP .B property machine: str \% معماری مجموعه دستورالعمل (ISA) مشتق‌شده از \fBsysconfig.get_platform()\fP \%\&. .UNINDENT .INDENT 7.0 .TP .B property spec: str \% یک رشته مشخصات که این مفسر را شناسایی می‌کند (مانند \fBCPython3.13.2\-64\-arm64\fP). .UNINDENT .INDENT 7.0 .TP .B classmethod clear_cache(cache) پاک‌سازی تمام اطلاعات کش‌شده مفسر از \fIcache\fP\&. .INDENT 7.0 .TP .B پارامترها \fBcache\fP (\fBPyInfoCache\fP) \-\- مخزن کش برای پاک‌سازی. .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B satisfies(spec, *, impl_must_match) بررسی اینکه آیا یک مشخصه داده‌شده می‌تواند توسط این نمونه مفسر پایتون برآورده شود یا خیر. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBspec\fP (\fBPythonSpec\fP) \-\- مشخصات برای بررسی تطابق. .IP \(bu 2 \fBimpl_must_match\fP (\fBbool\fP \%) \-\- در صورت \fBTrue\fP بودن، نام پیاده‌سازی باید دقیقاً مطابقت داشته باشد. .UNINDENT .TP .B نوع بازگشتی \fBbool\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod current(cache=None) یافتن اطلاعات مفسر میزبان فعلی. .INDENT 7.0 .TP .B پارامترها \fBcache\fP (\fBPyInfoCache\fP | \fBNone\fP \%) \-\- کش متادیتای مفسر؛ زمانی که \fBNone\fP باشد نتایج کش نمی‌شوند. .TP .B نوع بازگشتی \fBPythonInfo\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod current_system(cache=None) یافتن اطلاعات مفسر سیستمی فعلی، با تفکیک از طریق تمامی لایه‌های virtualenv. .INDENT 7.0 .TP .B پارامترها \fBcache\fP (\fBPyInfoCache\fP | \fBNone\fP \%) \-\- کش متادیتای مفسر؛ زمانی که \fBNone\fP باشد نتایج کش نمی‌شوند. .TP .B نوع بازگشتی \fBPythonInfo\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B to_json() سریال‌سازی اطلاعات این مفسر به یک رشته JSON. .INDENT 7.0 .TP .B نوع بازگشتی \fBstr\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B to_dict() تبدیل اطلاعات این مفسر به یک فرهنگ‌لغت (dictionary) ساده. .INDENT 7.0 .TP .B نوع بازگشتی \fBdict\fP \%[\fBstr\fP \%, \fBstr\fP \% | \fBint\fP \% | \fBbool\fP \% | \fBNone\fP \% | \fBtuple\fP \%[\fBint\fP \% | \fBstr\fP \%, \fB\&...\fP \%] | \fBlist\fP \%[\fBstr\fP \%] | \fBdict\fP \%[\fBstr\fP \%, \fBstr\fP \% | \fBint\fP \% | \fBNone\fP \%]] .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod from_exe(exe, cache=None, *, raise_on_error=True, ignore_cache=False, resolve_to_host=True, env=None) دریافت اطلاعات پایتون برای مسیر یک فایل اجرایی مشخص. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBexe\fP (\fBstr\fP \%) \-\- مسیر فایل اجرایی پایتون. .IP \(bu 2 \fBcache\fP (\fBPyInfoCache\fP | \fBNone\fP \%) \-\- کش متادیتای مفسر؛ زمانی که \fBNone\fP باشد نتایج کش نمی‌شوند..IP \(bu 2 \fBraise_on_error\fP (\fBbool\fP \%) \-\- به‌جای بازگرداندن \fBNone\fP، در صورت بروز شکست استثنا ایجاد کند\&. .IP \(bu 2 \fBignore_cache\fP (\fBbool\fP \%) \-\- حافظهٔ پنهان را دور زده و مفسر را دوباره استعلام کند\&. .IP \(bu 2 \fBresolve_to_host\fP (\fBbool\fP \%) \-\- ردیابی از میان لایه‌های virtualenv تا مفسر سیستم\&. .IP \(bu 2 \fBenv\fP (\fBMapping\fP \%[\fBstr\fP \%, \fBstr\fP \%] | \fBNone\fP \%) \-\- نگاشت متغیرهای محیطی؛ پیش‌فرض \fBos.environ\fP است\&. .UNINDENT .TP .B نوع بازگشتی (Return type) \fBPythonInfo\fP | \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod from_json(payload) وا‌سری‌سازی اطلاعات مفسر از یک رشتهٔ JSON. .INDENT 7.0 .TP .B پارامترها (Parameters) \fBpayload\fP (\fBstr\fP \%) \-\- رشتهٔ JSON تولیدشده توسط \fBto_json()\fP\&. .TP .B نوع بازگشتی (Return type) \fBPythonInfo\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod from_dict(data) بازسازی یک \fBPythonInfo\fP از یک دیکشنری ساده. .INDENT 7.0 .TP .B پارامترها (Parameters) \fBdata\fP (\fBdict\fP \%[\fBstr\fP \%, \fBstr\fP \% | \fBint\fP \% | \fBbool\fP \% | \fBNone\fP \% | \fBtuple\fP \%[\fBint\fP \% | \fBstr\fP \%, \fB\&...\fP \%] | \fBlist\fP \%[\fBstr\fP \%] | \fBdict\fP \%[\fBstr\fP \%, \fBstr\fP \% | \fBint\fP \% | \fBNone\fP \%]]) \-\- دیکشنری تولیدشده توسط \fBto_dict()\fP\&. .TP .B نوع بازگشتی (Return type) \fBPythonInfo\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod resolve_to_system(cache, target) پیمایش زنجیره‌های پیشوند virtualenv/venv جهت یافتن مفسر زیربنایی سیستم. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBcache\fP (\fBPyInfoCache\fP | \fBNone\fP \%) \-\- حافظهٔ پنهان فراداده‌های مفسر؛ در صورت \fBNone\fP بودن، نتایج کَش نمی‌شوند\&. .IP \(bu 2 \fBtarget\fP (\fBPythonInfo\fP) \-\- مفسری که باید شناسایی شود\&. .UNINDENT .TP .B نوع بازگشتی (Return type) \fBPythonInfo\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B discover_exe(cache, prefix, *, exact=True, env=None) کشف یک فایل اجرایی منطبق پایتون در پوشهٔ \fIprefix\fP داده‌شده. .INDENT 7.0 .TP .B پارامترها (Parameters) .INDENT 7.0 .IP \(bu 2 \fBcache\fP (\fBPyInfoCache\fP) \-\- حافظهٔ پنهان فراداده‌های مفسر\&. .IP \(bu 2 \fBprefix\fP (\fBstr\fP \%) \-\- پیشوند دایرکتوری برای جستجو در آن\&. .IP \(bu 2 \fBexact\fP (\fBbool\fP \%) \-\- در صورت \fBTrue\fP بودن، تطابق دقیق نسخه الزامی است\&. .IP \(bu 2 \fBenv\fP (\fBMapping\fP \%[\fBstr\fP \%, \fBstr\fP \%] | \fBNone\fP \%) \-\- نگاشت متغیرهای محیطی؛ پیش‌فرض \fBos.environ\fP است\&. .UNINDENT .TP .B نوع بازگشتی (Return type) \fBPythonInfo\fP .UNINDENT .UNINDENT .UNINDENT.SS داده‌های برنامه (App data) .sp رابط داده‌های برنامه که توسط افزونه‌ها برای کَش‌سازی استفاده می‌شود. .INDENT 0.0 .TP .B class virtualenv.app_data.base.AppData رابط ذخیره‌سازی انتزاعی برای برنامه virtualenv. .INDENT 7.0 .TP .B abstractmethod close() پیش از خروج virtualenv فراخوانی می‌شود. .INDENT 7.0 .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod reset() زمانی فراخوانی می‌شود که کاربر گزینه بازنشانی داده‌های برنامه (reset app data) را ارسال کند. .INDENT 7.0 .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod py_info(path) یک ذخیره‌ساز محتوا برای اطلاعات کَش‌شده مفسر در مسیر داده‌شده بازمی‌گرداند. .INDENT 7.0 .TP .B پارامترها \fBpath\fP (\fBPath\fP \%) \-\- مسیر فایل اجرایی مفسر .TP .B نوع بازگشتی \fBContentStore\fP .TP .B بازمی‌گرداند یک ذخیره‌ساز محتوا برای داده‌های کَش‌شده .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod py_info_clear() تمام اطلاعات کَش‌شده مفسر را پاک می‌کند. .INDENT 7.0 .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property can_update: bool \% در صورتی که این ذخیره‌ساز داده‌های برنامه از به‌روزرسانی محتوای کَش‌شده پشتیبانی کند، برابر با \fBTrue\fP است. .UNINDENT .INDENT 7.0 .TP .B abstractmethod embed_update_log(distribution, for_py_version) یک ذخیره‌ساز محتوا برای گزارش به‌روزرسانی تعبیه‌شده (embed update log) یک توزیع بازمی‌گرداند. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBdistribution\fP (\fBstr\fP \%) \-\- نام بسته (مانند \fBpip\fP) .IP \(bu 2 \fBfor_py_version\fP (\fBstr\fP \%) \-\- رشته نسخه هدف Python .UNINDENT .TP .B نوع بازگشتی \fBContentStore\fP .TP .B بازمی‌گرداند یک ذخیره‌ساز محتوا برای گزارش به‌روزرسانی .UNINDENT .UNINDENT .INDENT 7.0 .TP .B property house: Path \% دایرکتوری ریشه ذخیره‌ساز داده‌های برنامه. .UNINDENT .INDENT 7.0 .TP .B property transient: bool \% اگر این ذخیره‌ساز داده‌های برنامه گذرا (transient) باشد و بین دفعات اجرا پایدار نماند، برابر با \fBTrue\fP است. .UNINDENT .INDENT 7.0 .TP .B abstractmethod wheel_image(for_py_version, name) مسیر مربوط به یک تصویر wheel کَش‌شده را بازمی‌گرداند. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBfor_py_version\fP (\fBstr\fP \%) \-\- رشته نسخه هدف Python .IP \(bu 2 \fBname\fP (\fBstr\fP \%) \-\- نام بسته .UNINDENT .TP .B نوع بازگشتی \fBPath\fP \% .TP .B بازمی‌گرداند مسیر مربوط به wheel کَش‌شده .UNINDENT .UNINDENT .INDENT 7.0 .TP .B ensure_extracted(path, to_folder=None) از در دسترس بودن یک مسیر روی دیسک اطمینان حاصل می‌کند و در صورت نیاز آن را از zipapp استخراج می‌نماید. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBpath\fP (\fBPath\fP \%) \-\- مسیری که باید از در دسترس بودن آن اطمینان حاصل شود .IP \(bu 2 \fBto_folder\fP (\fBPath\fP \% | \fBNone\fP \%) \-\- دایرکتوری مقصد اختیاری برای استخراج .UNINDENT .TP .B نوع بازگشتی \fBGenerator\fP \%[\fBPath\fP \%] .TP .B بازمی‌گرداند مسیر قابل استفاده روی دیسک را تولید می‌کند (yield) .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod extract(path, to_folder) یک مسیر را از zipapp به مکانی روی دیسک استخراج می‌کند. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBpath\fP (\fBPath\fP \%) \-\- مسیر مورد نظر برای استخراج .IP \(bu 2 \fBto_folder\fP (\fBPath\fP \% | \fBNone\fP \%) \-\- دایرکتوری مقصد اختیاری .UNINDENT .TP .B نوع بازگشتی \fBGenerator\fP \%[\fBPath\fP \%] .TP .B بازمی‌گرداند مسیر استخراج‌شده را تولید می‌کند (yield) .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod locked(path) یک قفل انحصاری روی مسیر داده‌شده به دست می‌آورد. .INDENT 7.0 .TP .B پارامترها \fBpath\fP (\fBPath\fP \%) \-\- مسیری که باید قفل شود .TP .B نوع بازگشتی \fBGenerator\fP \%[\fBNone\fP \%] .UNINDENT .UNINDENT .UNINDENT.SS ایجادکننده‌ها (Creators) .sp پلاگین‌های Creator ساختار دایرکتوری محیط مجازی را ایجاد کرده و مفسر Python را نصب می‌کنند. .INDENT 0.0 .TP .B class virtualenv.create.creator.CreatorMeta .UNINDENT .INDENT 0.0 .TP .B class virtualenv.create.creator.Creator(options, interpreter) کلاسی که با دریافت یک مفسر Python، یک محیط مجازی ایجاد می‌کند. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBoptions\fP (\fBVirtualEnvOptions\fP \%<#\:virtualenv\:.config\:.cli\:.parser\:.VirtualEnvOptions>) .IP \(bu 2 \fBinterpreter\fP (\fBPythonInfo\fP) .UNINDENT .UNINDENT .sp یک ایجادکنندهٔ محیط مجازی جدید می‌سازد. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBoptions\fP (\fBVirtualEnvOptions\fP \%<#\:virtualenv\:.config\:.cli\:.parser\:.VirtualEnvOptions>) \-\- گزینه‌های CLI تجزیه‌شده از \fBadd_parser_arguments()\fP .IP \(bu 2 \fBinterpreter\fP (\fBPythonInfo\fP) \-\- مفسری که محیط مجازی از آن ایجاد می‌شود .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod can_create(interpreter) تعیین می‌کند که آیا امکان ایجاد یک محیط مجازی وجود دارد یا خیر. .INDENT 7.0 .TP .B پارامترها \fBinterpreter\fP (\fBPythonInfo\fP) \-\- مفسر مورد نظر .TP .B نوع بازگشتی \fBCreatorMeta\fP | \fBbool\fP \% | \fBNone\fP \% .TP .B بازمی‌گرداند در صورتی که نتوان ایجاد کرد \fBNone\fP، و در غیر این صورت هر شیء دیگری که به \fBadd_parser_arguments()\fP ارسال خواهد شد .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod add_parser_arguments(parser, interpreter, meta, app_data) افزودن آرگومان‌های CLI برای ایجادکننده. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBparser\fP (\fBArgumentParser\fP \%) \-\- تجزیه‌کنندهٔ CLI .IP \(bu 2 \fBapp_data\fP (\fBAppData\fP) \-\- پوشهٔ داده‌های برنامه .IP \(bu 2 \fBinterpreter\fP (\fBPythonInfo\fP) \-\- مفسری که درخواست ایجاد محیط مجازی برای آن داده شده است .IP \(bu 2 \fBmeta\fP (\fBCreatorMeta\fP) \-\- مقدار بازگردانده‌شده توسط \fBcan_create()\fP .UNINDENT .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod create() ایجاد محیط مجازی را انجام می‌دهد. .INDENT 7.0 .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B add_cachedir_tag() فایلی تولید می‌کند که نشان می‌دهد نباید از این مسیر نسخهٔ پشتیبان تهیه شود. .INDENT 7.0 .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B setup_ignore_vcs() دستورالعمل‌های نادیده‌گرفتن (ignore) را برای سیستم‌های کنترل نسخه تولید می‌کند. .INDENT 7.0 .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .UNINDENT.SS سیدرها (Seeders) .sp پلاگین‌های سیدر بسته‌های اولیه (مانند pip، setuptools، wheel) را درون محیط مجازی نصب می‌کنند. .INDENT 0.0 .TP .B class virtualenv.seed.seeder.Seeder(options, enabled) یک سیدر برخی بسته‌های اولیه (seed) را درون یک محیط مجازی نصب خواهد کرد. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBoptions\fP (\fBVirtualEnvOptions\fP \%<#\:virtualenv\:.config\:.cli\:.parser\:.VirtualEnvOptions>) .IP \(bu 2 \fBenabled\fP (\fBbool\fP \%) .UNINDENT .UNINDENT .sp ایجاد. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBoptions\fP (\fBVirtualEnvOptions\fP \%<#\:virtualenv\:.config\:.cli\:.parser\:.VirtualEnvOptions>) \-\- گزینه‌های تجزیه‌شده همان‌طور که درون \fBadd_parser_arguments()\fP تعریف شده‌اند .IP \(bu 2 \fBenabled\fP (\fBbool\fP \%) \-\- پرچمی مبنی بر اینکه آیا سیدر فعال است یا خیر .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod cannot_seed(interpreter) توضیح می‌دهد که چرا این سیدر نمی‌تواند بسته‌های اولیه را برای مفسر مشخص‌شده نصب کند. .INDENT 7.0 .TP .B پارامترها \fBinterpreter\fP (\fBPythonInfo\fP) \-\- مفسری که محیط بر پایه آن بنا شده است .TP .B نوع بازگشتی \fBstr\fP \% | \fBNone\fP \% .TP .B مقادیر بازگشتی در صورتی که سیدر از مفسر پشتیبانی کند مقدار \fBNone\fP، در غیر این صورت پیامی که دلیل عدم امکان آن را شرح می‌دهد؛ فرایند گزینش، سیدری را که پیامی برگرداند رد کرده و آن را به کاربر نمایش می‌دهد .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod add_parser_arguments(parser, interpreter, app_data) افزودن آرگومان‌های CLI برای این سازوکارهای سید (seed). .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBparser\fP (\fBArgumentParser\fP \%) \-\- تجزیه‌کننده CLI .IP \(bu 2 \fBapp_data\fP (\fBAppData\fP) \-\- تجزیه‌کننده CLI .IP \(bu 2 \fBinterpreter\fP (\fBPythonInfo\fP) \-\- مفسری که این محیط مجازی بر پایه آن ایجاد شده است .UNINDENT .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod run(creator) انجام عملیات آماده‌سازی اولیه (seed). .INDENT 7.0 .TP .B پارامترها \fBcreator\fP (\fBCreator\fP) \-\- سازنده‌ای (بر پایه \fBvirtualenv.create.creator.Creator\fP) که برای ساخت این محیط مجازی استفاده کرده‌ایم .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .UNINDENT.SS "فعال‌سازها (Activators)" .sp افزونه‌های فعال‌ساز اسکریپت‌های فعال‌سازی مختص هر شل را تولید می‌کنند. .INDENT 0.0 .TP .B class virtualenv.activation.activator.Activator(options) اسکریپت فعال‌سازی را برای محیط مجازی تولید می‌کند. .INDENT 7.0 .TP .B پارامترها \fBoptions\fP (\fBVirtualEnvOptions\fP \%<#\:virtualenv\:.config\:.cli\:.parser\:.VirtualEnvOptions>) .UNINDENT .sp یک تولیدکننده فعال‌ساز جدید ایجاد می‌کند. .INDENT 7.0 .TP .B پارامترها \fBoptions\fP (\fBVirtualEnvOptions\fP \%<#\:virtualenv\:.config\:.cli\:.parser\:.VirtualEnvOptions>) \-\- گزینه‌های تجزیه‌شده مطابق با تعریف در \fBadd_parser_arguments()\fP .UNINDENT .INDENT 7.0 .TP .B classmethod supports(interpreter) بررسی می‌کند که آیا اسکریپت فعال‌سازی در مفسر داده‌شده پشتیبانی می‌شود یا خیر. .INDENT 7.0 .TP .B پارامترها \fBinterpreter\fP (\fBPythonInfo\fP) \-\- مفسری که باید پشتیبانی شود .TP .B نوع بازگشتی \fBbool\fP \% .TP .B مقادیر بازگشتی در صورت پشتیبانی \fBTrue\fP، در غیر این صورت \fBFalse\fP .UNINDENT .UNINDENT .INDENT 7.0 .TP .B classmethod add_parser_arguments(parser, interpreter) افزودن آرگومان‌های CLI برای این اسکریپت فعال‌سازی. .INDENT 7.0 .TP .B پارامترها .INDENT 7.0 .IP \(bu 2 \fBparser\fP (\fBArgumentParser\fP \%) \-\- تجزیه‌کننده CLI .IP \(bu 2 \fBinterpreter\fP (\fBPythonInfo\fP) \-\- مفسری که این محیط مجازی بر پایه آن است .UNINDENT .TP .B نوع بازگشتی \fBNone\fP \% .UNINDENT .UNINDENT .INDENT 7.0 .TP .B abstractmethod generate(creator) تولید اسکریپت فعال‌سازی برای سازنده داده‌شده. .INDENT 7.0 .TP .B پارامترها \fBcreator\fP (\fBCreator\fP) \-\- سازنده‌ای (بر پایه \fBvirtualenv.create.creator.Creator\fP) که برای ساخت این محیط مجازی استفاده شد .TP .B نوع بازگشتی \fBlist\fP \%[\fBPath\fP \%] .UNINDENT .UNINDENT .UNINDENT .SS "معماری افزونه‌ها (Plugin architecture)" .sp این صفحه نحوه کارکرد درونی سیستم افزونه‌های virtualenv را توضیح می‌دهد. .SS "نقاط ورودی (Entry points)" .sp ابزار virtualenv برای کشف افزونه‌ها از نقاط ورودی پایتون (\fBsetuptools\fP / \fBimportlib.metadata\fP) استفاده می‌کند. هر افزونه ذیل یکی از چهار گروه نقاط ورودی ثبت می‌شود: .INDENT 0.0 .IP \(bu 2 \fBvirtualenv.discovery\fP .IP \(bu 2 \fBvirtualenv.create\fP .IP \(bu 2 \fBvirtualenv.seed\fP .IP \(bu 2 \fBvirtualenv.activate\fP .UNINDENT .sp هنگام راه‌اندازی، virtualenv تمام نقاط ورودی ثبت‌شده از این گروه‌ها را بارگذاری کرده و آن‌ها را به‌عنوان گزینه‌های CLI در دسترس قرار می‌دهد. پیاده‌سازی‌های داخلی در \fBpyproject.toml\fP خود virtualenv ثبت شده‌اند، در حالی که افزونه‌های شخص ثالث نقاط ورودی خود را در فراداده بسته خود ثبت می‌کنند. .sp هنگامی که یک بسته حاوی افزونه‌های virtualenv در همان محیط virtualenv نصب شود، افزونه‌ها بلافاصله و بدون نیاز به پیکربندی بیشتر در دسترس قرار می‌گیرند..SS "چرخه حیات افزونه (Plugin lifecycle)" .sp نمودار زیر نشان می‌دهد که افزونه‌ها چگونه شناسایی و اجرا می‌شوند: [نمودار] .sp این چرخه حیات مراحل زیر را دنبال می‌کند: .INDENT 0.0 .IP 1. 3 دستور virtualenv شروع به کار کرده و تمام entry pointها را از چهار گروه افزونه شناسایی می‌کند .IP 2. 3 تجزیه‌کننده خط فرمان (CLI parser) به‌صورت پویا ساخته می‌شود و گزینه‌های تمامی افزونه‌های شناسایی‌شده را در بر می‌گیرد .IP 3. 3 آرگومان‌های کاربر برای انتخاب این‌که کدام افزونه‌های discovery، creator، seeder و activator استفاده شوند، تجزیه می‌شوند .IP 4. 3 افزونه‌های انتخاب‌شده به ترتیب اجرا می‌شوند: discover → create → seed → activate .IP 5. 3 هر مرحله خروجی خود را به مرحله بعدی ارسال می‌کند .UNINDENT .SS "طراحی نقطه گسترش (Extension point design)" .sp هر نقطه گسترش از یک الگوی ثابت پیروی می‌کند: .INDENT 0.0 .TP .B "کلاس پایه انتزاعی" هر نقطه گسترش یک کلاس پایه انتزاعی (\fBDiscover\fP، \fBCreator\fP، \fBSeeder\fP، \fBActivator\fP) تعریف می‌کند که رابطی را که افزونه‌ها باید پیاده‌سازی کنند، مشخص می‌سازد. .TP .B "پیاده‌سازی‌های توکار" نرم‌افزار virtualenv شامل پیاده‌سازی‌های توکاری است که به عنوان entry point در \fBpyproject.toml\fP خود آن ثبت شده‌اند. برای نمونه، سازنده توکار CPython به عنوان \fBcpython3\-posix\fP ثبت شده است. .TP .B "افزونه‌های شخص ثالث" بسته‌های خارجی رابط پایه را پیاده‌سازی کرده و entry pointهای خود را تحت همان گروه ثبت می‌کنند. پس از نصب، آن‌ها در کنار گزینه‌های توکار ظاهر می‌شوند. .TP .B "گزینش در خط فرمان" پرچم‌های خط فرمان (\fB\-\-discovery\fP، \fB\-\-creator\fP، \fB\-\-seeder\fP، \fB\-\-activators\fP) به کاربران اجازه می‌دهند انتخاب کنند کدام پیاده‌سازی استفاده شود. چندین activator می‌توانند به‌طور هم‌زمان انتخاب شوند. .TP .B "یکپارچه‌سازی با تجزیه‌کننده" هر افزونه می‌تواند از طریق متد کلاسی \fBadd_parser_arguments\fP آرگومان‌های خط فرمان را اضافه کند. این آرگومان‌ها در \fBvirtualenv \-\-help\fP ظاهر می‌شوند و در صورت انتخاب افزونه، در دسترس خواهند بود. .UNINDENT .SS "نحوه تعامل افزونه‌ها (How plugins interact)" .sp افزونه‌ها در یک خط لوله (pipeline) اجرا می‌شوند که در آن هر مرحله به مرحله پیشین وابسته است: .INDENT 0.0 .TP .B "Discovery → Creator" افزونه discovery یک شیء \fBPythonInfo\fP ایجاد می‌کند که مفسر مبدأ Python را توصیف می‌نماید. این شیء حاوی فراداده‌هایی درباره نسخه Python، پلتفرم، مسیرها و قابلیت‌ها است. افزونه creator این \fBPythonInfo\fP را دریافت کرده و از آن برای تعیین نحوه ساخت ساختار محیط مجازی استفاده می‌کند. .TP .B "Creator → Seeder" افزونه creator یک شیء \fBCreator\fP ایجاد می‌کند که نشان‌دهنده محیط مجازی تازه‌ساخته‌شده است. این شیء شامل مسیرهای دایرکتوری \fBbin\fP محیط، site\-packages و فایل اجرایی Python است. افزونه seeder از این مسیرها برای نصب بسته‌ها استفاده می‌کند. .TP .B "Seeder → Activator" پس از تکمیل عملیات بذرپاشی (seeding)، افزونه‌های activator از شیء \fBCreator\fP برای تولید اسکریپت‌های فعال‌سازی پوسته استفاده می‌کنند. این اسکریپت‌ها برای پیکربندی محیط پوسته، به دایرکتوری bin محیط و مسیرهای دیگر ارجاع می‌دهند. .UNINDENT .sp این خط لوله تضمین می‌کند که هر افزونه اطلاعات لازم را از مراحل پیشین در اختیار دارد. شیء \fBPythonInfo\fP از discovery به creator منتقل می‌شود، و شیء \fBCreator\fP از creator هم به seeder و هم به activators فرستاده می‌شود. .SS "جداسازی افزونه‌ها (Plugin isolation)" .sp افزونه‌های موجود در یک نقطه گسترش یکسان با یکدیگر تعاملی ندارند. در هر بار فراخوانی، تنها یک افزونه discovery و یک افزونه creator می‌توانند اجرا شوند، اگرچه چندین activator می‌توانند به‌طور هم‌زمان اجرا گردند. این جداسازی، افزونه‌ها را ساده و متمرکز بر وظیفه ویژه خود نگه می‌دارد. .SS "توسعه (Development)" .SS "شروع به کار (Getting started)" .sp پروژه \fBvirtualenv\fP یک پروژه متن‌باز است که توسط داوطلبان نگهداری می‌شود و ما از هرگونه مشارکت استقبال می‌کنیم. بخش‌های زیر به شما کمک می‌کنند کار با توسعه، آزمایش و مستندسازی را آغاز کنید. بسیار خرسندیم که به کار روی virtualenv علاقه‌مندید. این سند برای آماده‌سازی شما جهت کار بر روی virtualenv و به عنوان یک راهنما و مرجع برای راه‌اندازی محیط توسعه نگاشته شده است. چنانچه در طول این فرایند با هرگونه مشکلی مواجه شدید، لطفاً در سامانه ردیابی مشکلات در \% یک issue درباره آن باز کنید. .SS "راه‌اندازی (Setup)" .sp نرم‌افزار virtualenv یک برنامه خط فرمانی است که با Python نوشته شده است. برای کار روی آن، به موارد زیر نیاز خواهید داشت: .INDENT 0.0 .IP \(bu 2 .INDENT 2.0 .TP \fBکد منبع\fP: در GitHub در دسترس است \%\&. می‌توانید از \fBgit\fP برای کلون کردن مخزن استفاده کنید: .UNINDENT .INDENT 2.0 .INDENT 3.5 .sp .EX git clone https://github.com/pypa/virtualenv cd virtualenv .EE .UNINDENT .UNINDENT .IP \(bu 2 \fBمفسر Python\fP: توصیه می‌کنیم از \fBCPython\fP استفاده کنید\&. می‌توانید از این راهنما \% برای راه‌اندازی آن استفاده نمایید. .IP \(bu 2 ابزار tox \%: برای دریافت خودکار وابستگی‌های توسعه پروژه و اجرای مجموعه آزمون‌ها\&. توصیه می‌کنیم آن را با استفاده از pipx \% نصب کنید\&. .UNINDENT.SS "اجرا از درخت کد منبع (Running from source tree)" .sp ساده‌ترین روش برای این کار، ایجاد محیط توسعهٔ tox و سپس فراخوانی virtualenv از درون پوشهٔ \fB\&.tox/dev\fP است. .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e dev \&.tox/dev/bin/virtualenv # on Linux \&.tox/dev/Scripts/virtualenv # on Windows .EE .UNINDENT .UNINDENT .SS "اجرای آزمون‌ها (Running tests)" .sp آزمون‌های virtualenv با استفاده از چارچوب آزمون pytest \% نوشته شده‌اند. از tox \% برای خودکارسازی راه‌اندازی و اجرای آزمون‌های virtualenv استفاده می‌شود. .sp برای اجرای آزمون‌ها به‌صورت محلی دستور زیر را اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e py .EE .UNINDENT .UNINDENT .sp این دستور مجموعه آزمون را برای همان نسخه از Python که \fBtox\fP تحت آن نصب شده است اجرا می‌کند. علاوه بر این می‌توانید با استفاده از قالب \fBpyNN\fP نسخهٔ خاصی از python را مشخص کنید، مانند: \fBpy314\fP، \fBpypy3\fP و غیره. .sp ابزار \fBtox\fP طوری پیکربندی شده است که هرگونه آرگومان اضافی را به \fBpytest\fP هدایت کند. این ویژگی امکان استفاده از رابط خط فرمان قدرتمند pytest \% را فراهم می‌کند. به عنوان مثال، می‌توانید آزمون‌ها را با استفاده از روش‌های متنوعی که pytest ارائه می‌دهد انتخاب کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX # Using markers tox \-e py \-\- \-m \(dqnot slow\(dq # Using keywords tox \-e py \-\- \-k \(dqtest_extra\(dq .EE .UNINDENT .UNINDENT .sp اجرای برخی از آزمون‌ها نیازمند وابستگی‌های بیشتری است، از جمله فعال‌سازهای پوسته‌های گوناگون (\fBbash\fP، \fBfish\fP، \fBpowershell\fP و غیره). در صورت عدم وجود این وابستگی‌ها، آزمون‌های مربوطه به‌طور خودکار نادیده گرفته می‌شوند (skip می‌شوند)؛ با این حال توجه داشته باشید که در CI تمامی آزمون‌ها اجرا می‌گردند؛ بنابراین حتی اگر همهٔ آزمون‌ها به‌صورت محلی برای شما با موفقیت سپری شوند، ممکن است همچنان در CI با شکست مواجه شوند. .SS "اجرای لینترها (Running linters)" .sp ابزار virtualenv از pre\-commit \% برای مدیریت بررسی ایستای پایه‌کد استفاده می‌کند. ابزار \fBpre\-commit\fP بررسی‌های گوناگونی را روی تمامی فایل‌های موجود در virtualenv انجام می‌دهد و از ابزارهایی بهره می‌برد که به پیروی از یک شیوه‌نامهٔ کدنویسی یکپارچه در کل پایه‌کد کمک می‌کنند. برای استفاده از لینترها به‌صورت محلی، دستور زیر را اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e fix .EE .UNINDENT .UNINDENT .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 از به‌کاربردن کامنت‌های \fB# noqa\fP برای فرونشاندن هشدارهای لینتر خودداری کنید \- تا جای ممکن، هشدارها باید برطرف شوند. کامنت‌های \fB# noqa\fP برای موارد نادری در نظر گرفته شده‌اند که سبک پیشنهادی باعث ایجاد مشکلات جدی در خوانایی کد می‌شود. .UNINDENT .UNINDENT .SS "بررسی نوع (Type checking)" .sp ابزار virtualenv یک نشانگر \fBpy.typed\fP منطبق بر \fBPEP 561\fP \% ارائه می‌دهد و دارای نشانه‌گذاری‌های جامع نوع در سراسر پایه‌کد است. این بدان معناست که مصرف‌کنندگان پایین‌دستی و ابزارهای بررسی نوع به‌طور خودکار virtualenv را به‌عنوان یک بسته با نوع‌های درون‌خطی (inline\-typed) شناسایی می‌کنند. .sp تمام کدهای جدید \fBباید\fP شامل نشانه‌گذاری‌های کامل نوع برای پارامترهای توابع و نوع‌های بازگشتی باشند. برای تأیید نشانه‌گذاری‌ها به‌صورت محلی، دستور زیر را اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e type .EE .UNINDENT .UNINDENT .sp این دستور از ty \% (بررسی‌کننده نوع مبتنی بر Rust از Astral) برای اعتبارسنجی نشانه‌گذاری‌ها در برابر Python 3.14 استفاده می‌کند. محیط دوم سازگاری را با حداقل نسخهٔ پشتیبانی‌شده بررسی می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e type\-3.9 .EE .UNINDENT .UNINDENT .sp هر دو محیط اطمینان حاصل می‌کنند که نشانه‌گذاری‌ها سازگار و درست هستند..SS رهنمودهای حاشیه‌نویسی نوع (Annotation guidelines) .INDENT 0.0 .IP \(bu 2 از \fBfrom __future__ import annotations\fP در بالای هر ماژول استفاده کنید (توسط تنظیمات \fBrequired\-imports\fP در ruff الزامی شده است). .IP \(bu 2 واردکردن‌هایی را که فقط برای بررسی نوع (type checking) نیاز هستند در داخل یک بلوک \fBif TYPE_CHECKING:\fP قرار دهید تا از سربار زمان اجرا جلوگیری شود. .IP \(bu 2 قوانین \fBANN\fP در ruff فعال هستند. قاعده \fBANN401\fP (\fBtyping.Any\fP) به‌صورت موردی با یادداشت‌های درون‌خطی \fB# noqa: ANN401\fP در مواردی که واقعاً به \fBAny\fP نیاز است (مانند serialization و dynamic dispatch) نادیده گرفته می‌شود. .IP \(bu 2 انواع مشخص (concrete types) را بر \fBAny\fP ترجیح دهید. از \fBUnion\fP / \fB|\fP برای پارامترهای تهی‌پذیر (nullable) یا چندنوعی استفاده کنید. .IP \(bu 2 هنگامی که یک خطای نوع واقعاً غیرقابل رفع است (مانند محدودیت‌های کتابخانه‌های شخص ثالث)، آن را با یک یادداشت درون‌خطی \fB# ty: ignore[rule\-name]\fP و یک توضیح توجیهی کوتاه نادیده بگیرید. .UNINDENT .SS ساخت مستندات (Building documentation) .sp مستندات virtualenv با استفاده از Sphinx \% ساخته می‌شود. این مستندات به زبان reStructuredText نوشته شده‌اند. برای ساخت محلی آن، اجرا کنید: .INDENT 0.0 .INDENT 3.5 .sp .EX tox \-e docs .EE .UNINDENT .UNINDENT .sp مستندات ساخته‌شده را می‌توان در پوشه \fB\&.tox/docs_out\fP پیدا کرد و با باز کردن فایل \fBindex.html\fP در آن پوشه مشاهده نمود. .SS نشان‌واره و برندسازی (Logo and branding) .sp دو فایل نشان‌واره در دایرکتوری \fBdocs/_static\fP قرار دارند و نقش‌های متفاوتی ایفا می‌کنند، بنابراین هر دو عمداً نگه‌داری شده‌اند: .INDENT 0.0 .IP \(bu 2 \fBvirtualenv.png\fP نشان‌واره رسمی است — مارهای پیچیده‌شده دور یک ترمینال، به همراه علامت نوشتاری (wordmark). این فایل نشان‌واره وب‌سایت (\fBlight_logo\fP/\fBdark_logo\fP در \fBdocs/conf.py\fP) و فایلی است که در هر جا به نشان‌واره virtualenv نیاز باشد باید استفاده شود. .IP \(bu 2 \fBvirtualenv.svg\fP یک نشان ساده‌شده است که تنها به عنوان آیکون مرورگر یا favicon (\fBhtml_favicon\fP) استفاده می‌شود، چرا که نسخه پرجزئیات PNG در اندازه ۱۶×۱۶ ناخوانا خواهد بود. این یک نسخه برداری (vector) از فایل PNG نیست. .UNINDENT .SS انتشار (Release) .sp برنامه انتشار virtualenv به \fBpip\fP و \fBsetuptools\fP وابسته است. ما آخرین نسخه این کتابخانه‌ها را بسته‌بندی می‌کنیم، بنابراین هر بار که نسخه جدیدی از هر یک از آن‌ها منتشر شود، اندکی پس از آن نسخه جدیدی از virtualenv منتشر خواهد شد (ما معمولاً چند روز صبر می‌کنیم تا از گنجاندن نسخه‌های معیوب احتمالی جلوگیری شود). .SS انجام انتشار (Performing a release) .sp یک انتشار کامل، بسته را در PyPI \% منتشر می‌کند، یک GitHub Release \% به همراه فایل zipapp پیوست‌شده ایجاد می‌کند، و get\-virtualenv \% را به‌روزرسانی می‌کند تا \fBhttps://bootstrap.pypa.io/virtualenv.pyz\fP نسخه جدید را ارائه دهد. .SS افزایش نسخه (Version bumping) .sp آرگومان \fB\-\-version\fP در \fBtox r \-e release\fP نسخه را کنترل می‌کند. مقدار پیش‌فرض آن \fBauto\fP است که دایرکتوری \fBdocs/changelog\fP را بررسی می‌کند: اگر هرگونه قطعه‌فایل \fB*.feature.rst\fP یا \fB*.removal.rst\fP وجود داشته باشد، نسخه minor افزایش می‌یابد؛ در غیر این صورت نسخه patch افزایش می‌یابد. همچنین می‌توانید \fBmajor\fP، \fBminor\fP یا \fBpatch\fP را به‌طور صریح ارسال کنید. .sp هر دو روش نتایج یکسانی ایجاد می‌کنند: یک کامیت انتشار و یک برچسب (tag) بر روی شاخه \fBmain\fP\&. ارسال (push) تگ، گردش‌کار انتشار \% را آغاز می‌کند که بسته‌های sdist، wheel و zipapp را ساخته، از طریق trusted publisher در PyPI منتشر می‌کند، یک GitHub Release \% همراه با فایل zipapp پیوست‌شده می‌سازد، و get\-virtualenv \% را به‌روزرسانی می‌کند. اگر انتشار ناموفق باشد، یک کار بازگردانی (rollback job) به‌طور خودکار همه چیز را به حالت قبل بازمی‌گرداند. .sp \fBاز طریق GitHub Actions (توصیه‌شده)\fP .INDENT 0.0 .IP 1. 3 به Pre\-release workflow \% در GitHub بروید. .IP 2. 3 روی \fBRun workflow\fP کلیک کرده و نوع افزایش نسخه را انتخاب نمایید (\fBauto\fP، \fBmajor\fP، \fBminor\fP یا \fBpatch\fP). .UNINDENT .sp \fBبه‌صورت محلی\fP .INDENT 0.0 .INDENT 3.5 .sp .EX tox r \-e release .EE .UNINDENT .UNINDENT .sp آرگومان \fB\-\-version \fP را برای تغییر رفتار پیش‌فرض \fBauto\fP ارسال کنید (برای نمونه \fB\-\-version minor\fP). .SS مشارکت (Contributing).SS "ارسال Pull Requestها (Submitting pull requests)" .sp درخواست‌های ادغام (Pull Request) را برای شاخهٔ \fBmain\fP ارسال کنید و شرح مناسبی از آنچه انجام می‌دهید و چرایی آن ارائه دهید. شما باید مجوز قانونی برای توزیع هر کدی که در virtualenv مشارکت می‌دهید داشته باشید و این کد باید تحت مجوز MIT License در دسترس باشد. آزمون‌هایی ارائه دهید که تغییرات شما را پوشش دهند و ابتدا آزمون‌ها را به‌صورت محلی اجرا کنید. virtualenv از چندین نسخهٔ Python و سیستم‌عامل مختلف پشتیبانی می‌کند \%<#\:compatibility-requirements>. هر pull request باید تمامی این پلتفرم‌ها را مد نظر قرار داده و روی همهٔ آن‌ها کار کند. .sp برای تسهیل فرایند بازبینی، Pull Requestها باید کوچک باشند. آن‌ها را خودبسنده و با دامنهٔ محدود نگه دارید. مطالعات نشان داده‌اند \% که با افزایش اندازهٔ وصله (patch)، کیفیت بازبینی کاهش می‌یابد. گاهی این موضوع منجر به ایجاد چندین PR کوچک برای اعمال یک ویژگی بزرگ منفرد می‌شود. به‌ویژه، با pull requestها نباید مانند «شاخه‌های ویژگی» (\(dqfeature branches\(dq) که کارهای توسعه پیوسته در آن‌ها ادامه دارد برخورد شود. در عوض، ویژگی باید به بخش‌های کوچک‌تر و مستقل تفکیک شود تا بتوان آن‌ها را به‌صورت جداگانه بازبینی و ادغام کرد. .sp علاوه بر این، از گنجاندن تغییرات «ظاهری» (\(dqcosmetic\(dq) در کدهای نامرتبط با تغییرات خود بپرهیزید، چرا که بازبینی PR را دشوارتر می‌کند. برای مثال می‌توان به بازچینی متن در یادداشت‌ها یا مستندات، یا افزودن و حذف خطوط خالی یا فاصله‌های خالی (whitespace) در خطوط اشاره کرد. در صورت نیاز، چنین تغییراتی می‌توانند جداگانه در قالب یک PR تحت عنوان «پاک‌سازی قالب‌بندی» (\(dqformatting cleanup\(dq) ارسال شوند. .SS "آزمون خودکار (Automated testing)" .sp تمام pull requestها و ادغام‌ها در شاخهٔ \(aqmain\(aq با استفاده از GitHub Actions \% (که توسط فایل \fB\&.github/workflows/check.yaml\fP در ریشهٔ مخزن پیکربندی شده است) آزمایش می‌شوند. می‌توانید وضعیت و نتایج اجراهای CI را برای PR خود در واسط کاربری وب GitHub برای pull request مشاهده کنید. همچنین در صورت شکست اجرای CI و تمایل به مشاهدهٔ خروجی، پیوندهایی به صفحات سرویس‌های CI برای ساخت‌های مشخص در قالب پیوندهای \(dqDetails\(dq قرار دارند. .sp برای اجرای مجدد CI برای یک pull request، می‌توانید pull request را بسته و دوباره باز کنید یا تغییر دیگری به pull request ارسال نمایید. در صورت نیاز، نگه‌دارندگان پروژه می‌توانند شروع مجدد یک job/build را به‌صورت دستی فعال کنند. .SS "مدخل‌های خبری (NEWS entries)" .sp فایل \fBchangelog.rst\fP با استفاده از towncrier \% مدیریت می‌شود و تمام تغییرات غیربدیهی (non-trivial) باید همراه با یک مدخل خبری (news entry) باشند. برای افزودن یک مدخل به فایل اخبار، ابتدا باید یک issue ایجاد کرده باشید که تغییر مد نظرتان را شرح دهد. خود یک Pull Request \fIممکن است\fP چنین کاربردی داشته باشد، اما ترجیح بر داشتن یک issue اختصاصی است (برای مثال، در صورتی که PR به دلایل مربوط به کیفیت کد رد شود). .sp هنگامی که یک issue یا pull request داشتید، شمارهٔ آن را برداشته و فایلی در داخل دایرکتوری \fBdocs/changelog\fP به نام همان شماره با یکی از پسوندهای زیر ایجاد می‌کنید: .INDENT 0.0 .IP \(bu 2 \fBfeature.rst\fP, .IP \(bu 2 \fBbugfix.rst\fP, .IP \(bu 2 \fBdoc.rst\fP, .IP \(bu 2 \fBremoval.rst\fP, .IP \(bu 2 \fBmisc.rst\fP\&. .UNINDENT .sp بنابراین اگر شمارهٔ issue یا PR شما \fB1234\fP باشد و این تغییر یک باگ را برطرف کند، فایلی با نام \fBdocs/changelog/1234.bugfix.rst\fP ایجاد خواهید کرد. PRها می‌توانند با ایجاد چند فایل، دسته‌بندی‌های متعددی را در بر بگیرند (به‌عنوان مثال، اگر هم‌زمان قابلیتی اضافه کرده و قابلیت قدیمی را منسوخ/حذف کرده‌اید، فایل‌های \fBdocs/changelog/1234.bugfix.rst\fP و \fBdocs/changelog/1234.remove.rst\fP را ایجاد می‌کنید). به همین ترتیب، اگر یک PR چند issue/PR را تحت تأثیر قرار دهد، می‌توانید برای هر کدام فایلی با محتوای یکسان بسازید و towncrier \% موارد تکراری را حذف خواهد کرد. .SS "محتوای یک مدخل خبری (Contents of a NEWS entry)" .sp محتویات این فایل متنی با قالب‌بندی reStructuredText است که به‌عنوان محتوای مدخل فایل خبر استفاده خواهد شد. در اینجا نیازی به ارجاع به شماره‌های issue یا PR ندارید زیرا towncrier هنگام پردازش و رندر فایل خبر، به‌طور خودکار ارجاعی به تمامی issueهای مربوطه اضافه می‌کند. .sp برای حفظ هماهنگی سبک در فایل \fBchangelog.rst\fP، ترجیح داده می‌شود مدخل خبری موجز و سرراست، با حروف‌چینی استاندارد جمله (sentence case)، کوتاه‌تر از ۱۲۰ نویسه و با لحن امری باشد \-\- یک مدخل باید جملهٔ \fBThis change will …\fP را کامل کند. در موارد نادری که یک خط کافی نیست، از یک خط خلاصه با لحن امری استفاده کنید و با یک خط خالی آن را از شرح قابلیت/تغییر در یک یا چند بند که هر کدام حداکثر ۱۲۰ نویسه دارند جدا نمایید. به یاد داشته باشید که مدخل خبری برای کاربران نهایی است و تنها باید شامل جزئیات مرتبط با کاربر نهایی باشد. .SS "انتخاب نوع مدخل خبری (Choosing the type of NEWS entry)" .sp تغییر جزئی (trivial) به هر تغییری گفته می‌شود که نیازمند ایجاد مدخل در فایل خبر نباشد. نمونه‌هایی از آن عبارتند از: بازآرایی کد (refactoring) بدون ایجاد تغییر از دید کاربران، اصلاح خطاهای نگارشی، اصلاح فاصله‌های خالی و غیره. برای نشانه‌گذاری یک PR به‌عنوان جزئی، مشارکت‌کننده تنها کافی است فایلی خالی با نام تصادفی و با پسوند \fB\&.trivial\fP در دایرکتوری \fBnews/\fP اضافه کند. .SS "تبدیل شدن به نگه‌دارنده (Becoming a maintainer)" .sp اگر می‌خواهید یک نگه‌دارندهٔ رسمی شوید، کار را با کمک کردن آغاز کنید. به‌عنوان نخستین گام، از بررسی و اولویت‌بندی (triage) اشکالات در ردیاب باگ‌های virtualenv استقبال می‌کنیم. نگه‌دارندگان virtualenv به مشارکت‌کنندگانی که مدتی در پروژه حضور داشته و مشارکت‌های مثبتی ارائه کرده‌اند، دسترسی‌های triage اعطا می‌کنند. این اقدام اختیاری است و برای تبدیل شدن به نگه‌دارندهٔ virtualenv بسیار توصیه می‌شود. سپس، هنگامی که احساس کردید آماده هستید، با یکی از نگه‌دارندگان ارتباط برقرار کنید تا رأی‌گیری میان نگه‌دارندگان فعلی را آغاز کنند. .sp \fBنکته:\fP .INDENT 0.0 .INDENT 3.5 پس از تبدیل شدن به یک نگه‌دارنده، باید به فرد دسترسی به ابزارهای گوناگون مرتبط با virtualenv در پلتفرم‌های مختلف اعطا شود. این موارد جهت ارجاع بعدی نگه‌دارندگان در اینجا ذکر شده‌اند: .INDENT 0.0 .IP \(bu 2 GitHub Push Access .IP \(bu 2 PyPI Publishing Access .IP \(bu 2 CI Administration capabilities .IP \(bu 2 ReadTheDocs Administration capabilities .UNINDENT .UNINDENT .UNINDENT.SS نگهدارنده‌های کنونی (Current maintainers) .INDENT 0.0 .IP \(bu 2 Bernát Gábor \% .IP \(bu 2 Rahul Devikar \% .UNINDENT .SS نگهدارنده‌های پیشین (Previous maintainers) .INDENT 0.0 .IP \(bu 2 Paul Moore \% .IP \(bu 2 Ian Bicking \% .IP \(bu 2 Donald Stufft \% .UNINDENT .SS تاریخچه انتشار (Release History) .SS v[UNRELEASED DRAFT] (2026\-09\-01) .sp بدون تغییرات چشمگیر. .SS v21.7.8 (2026\-09\-01) .SS رفع باگ‌ها \- 21.7.8 (Bugfixes \- 21.7.8) .INDENT 0.0 .IP \(bu 2 نبود یک منبع لازم برای هر دو حالت نصب، اکنون سازندهٔ توکار را از طریق \fBmeta.error\fP غیرفعال می‌کند. این بررسی مقادیر \fBRefWhen\fP را با اعضای \fBRefMust\fP مقایسه می‌کرد، بنابراین فرآیند ایجاد با یک \fBFileNotFoundError\fP یا یک پیوند نمادینِ معلق (dangling symlink) شکست می‌خورد \- توسط @darrenhuai \%\&. (#3227 \%) .UNINDENT .SS v21.7.7 (2026\-08\-28) .SS رفع باگ‌ها \- 21.7.7 (Bugfixes \- 21.7.7) .INDENT 0.0 .IP \(bu 2 ارتقای حداقل نسخهٔ \fBpython\-discovery\fP به \fB>=1.6\fP برای \fBPythonInfo.system_exe\fP، که مفسر سیستم را بدون تایپینگ مجاز به تهیِ \fBsystem_executable\fP گزارش می‌دهد \- توسط @gaborbernat \%\&. (#3224 \%) .UNINDENT .SS مستندات بهبودیافته \- 21.7.7 (Improved Documentation \- 21.7.7) .INDENT 0.0 .IP \(bu 2 مستندسازی نام‌هایی که مفسر درون یک محیط ایجادشده به آن‌ها پاسخ می‌دهد. صفحهٔ جدید ساختار محیط (Environment layout) \%<> آن‌ها را به تفکیک پلتفرم فهرست می‌کند، راهنماهای آموزشی و کاربری به آن اشاره دارند، و توضیحات سازنده‌ها پوشش می‌دهد که چرا یک محیط چندین نام را حمل می‌کند و چرا ویندوز یک بازهدایت‌کننده (redirector) را کپی می‌کند \- توسط @gaborbernat \%\&. (#3225 \%) .UNINDENT .SS v21.7.6 (2026\-08\-28) .SS رفع باگ‌ها \- 21.7.6 (Bugfixes \- 21.7.6) .INDENT 0.0 .IP \(bu 2 در ویندوز، \fBvirtualenv\fP دیگر واسط (shim) مربوط به \fBvenvlauncher.exe\fP در CPython 3.13+ را با نام خودِ واسط در \fBScripts\fP کپی نمی‌کند، و میزبان‌هایی مانند \fBpython_d.exe\fP نام مستعار خود را پس می‌گیرند. مجموعهٔ نام‌های مستعار، نام‌های خود را از واسطی که جانشین مفسر می‌شود می‌گرفت، بنابراین هر محیط یک نسخهٔ کپی ناخواسته از اجراکننده دریافت می‌کرد و نام فایل اصلیِ خود مفسر حذف می‌شد \- توسط @darrenhuai \%\&. (#3223 \%) .UNINDENT .SS v21.7.5 (2026\-08\-25) .SS رفع باگ‌ها \- 21.7.5 (Bugfixes \- 21.7.5) .INDENT 0.0 .IP \(bu 2 اصلاح بررسی نوع (type check) در برابر \fBpython\-discovery\fP نسخهٔ 1.5.2، که حاشیه‌نویسی‌های آن مقدار \fBNone\fP را برای \fBprefix\fP و مقادیر عدد صحیح را برای \fBsysconfig_vars\fP مجاز می‌دانند: جایگزینی متغیرهای پیکربندی اکنون از پیشوند ناموجود صرف‌نظر می‌کند و مکان‌یابی libpython اشتراکی نیازمند مقادیر رشته‌ای برای \fBINSTSONAME\fP/\fBLIBDIR\fP است. (#3211 \%) .IP \(bu 2 متد \fBExePathRef.can_run\fP اکنون بیت‌های اجرایی گروه و دیگران را به جای فقط بیت مالک بررسی می‌کند، و هنگامی که یک فایل هیچ‌یک از این سه را نداشته باشد، به جای \fBNone\fP مقدار \fBFalse\fP برمی‌گرداند \- توسط @darrenhuai \%\&. (#3217 \%) .IP \(bu 2 تابع \fBsafe_delete\fP دیگر \fBignore_errors=True\fP را به \fBshutil.rmtree\fP ارسال نمی‌کند، زیرا این کار گردانندهٔ chmod\-and\-retry خودش را با یک عملیات بی‌اثر (no\-op) جایگزین می‌کرد و تمامی خطاها را نادیده می‌گرفت. فایل‌های فقط‌خواندنی \- تمام فایل‌های درون ایمیج یک wheel، که توسط \fBset_tree\fP علامت‌گذاری می‌شوند \- باقی می‌ماندند، بنابراین گزینه‌های \fB\-\-reset\-app\-data\fP و \fB\-\-clear\fP درخت‌هایی را که گزارش حذف آن‌ها را داده بودند دست‌نخورده نگه می‌داشتند. این گرداننده اکنون تنها خودِ عملیات حذف را مجدداً تلاش می‌کند، سایر بیت‌های حالت مجوز را حفظ می‌کند، و برای هر چیزی که نتواند پاک کند خطای اصلی را صادر می‌کند \- توسط @darrenhuai \%\&. (#3222 \%) .UNINDENT .SS v21.7.4 (2026\-08\-10) .SS رفع باگ‌ها \- 21.7.4 (Bugfixes \- 21.7.4) .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 بستهٔ setuptools به \fB84.0.0\fP از \fB83.0.0\fP (#3208 \%) .UNINDENT .UNINDENT .SS v21.7.3 (2026\-08\-08) .SS رفع باگ‌ها \- 21.7.3 (Bugfixes \- 21.7.3) .INDENT 0.0 .IP \(bu 2 متد \fBListType.split_values\fP اکنون یک \fBlist\fP بازمی‌گرداند که می‌توانید بیش از یک بار روی آن پیمایش کنید، و به جای صدور خطای \fBTypeError\fP ورودی از نوع \fBbytes\fP را می‌پذیرد \- توسط @darrenhuai \%\&. (#3207 \%) .UNINDENT.SS v21.7.2 (2026\-08\-07) .SS رفع باگ‌ها \- 21.7.2 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 pip به \fB26.2.1\fP از \fB26.2\fP (#3206 \%) .UNINDENT .UNINDENT .SS v21.7.1 (2026\-07\-30) .SS رفع باگ‌ها \- 21.7.1 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 pip به \fB26.2\fP از \fB26.1.2\fP (#u \%) .UNINDENT .UNINDENT .SS مستندات بهبودیافته \- 21.7.1 .INDENT 0.0 .IP \(bu 2 مستندسازی این که \fBvirtualenv.png\fP نشان رسمی و \fBvirtualenv.svg\fP نماد ساده‌شده صرفاً برای favicon است \- توسط @gaborbernat \%\&. (#3199 \%) .UNINDENT .SS v21.7.0 (2026\-07\-21) .SS ویژگی‌ها \- 21.7.0 .INDENT 0.0 .IP \(bu 2 اعلام پشتیبانی از Python 3.15: فرآیند CI اکنون در برابر نسخه بتای CPython 3.15، از جمله ساختِ free\-threaded \fB3.15t\fP آزمایش می‌شود، و رده‌بند \fBProgramming Language :: Python :: 3.15\fP اعلان شده است. (#3192 \%) .UNINDENT .SS v21.6.1 (2026\-07\-10) .SS رفع باگ‌ها \- 21.6.1 .INDENT 0.0 .IP \(bu 2 مقاوم‌سازی اعلان (prompt) فعال‌کننده fish در برابر توابع کاربری که دستورات توکار (builtins) را هم‌پوشانی (shadow) می‌کنند. هدایت \fBfunctions\fP، \fBprintf\fP، \fBstring\fP، \fBecho\fP و \fBsource\fP/\fB\&.\fP از طریق \fBbuiltin\fP مانع از آن می‌شود که یک تابع هم‌پوشاننده (مانند ابزار ناوبری دایرکتوری به سبک نقطه که \fB\&.\fP را بازتعریف می‌کند) اعلان را برباید و وضعیت خروج (exit status) دستور قبلی را نادیده بگیرد؛ مطابق با رفع اشکال CPython در gh\-140006 \%\&. (#3185 \%) .UNINDENT .SS v21.6.0 (2026\-07\-06) .SS ویژگی‌ها \- 21.6.0 .INDENT 0.0 .IP \(bu 2 توقف نصب قلاب واردسازی distutils با نام \fB_virtualenv.{py,pth}\fP برای Python 3.10 و بالاتر، که در آن‌ها pip، setuptools و CPython از پیش کلیدهای پیکربندی نصبی را که این قلاب از آن‌ها محافظت می‌کرد نادیده می‌گیرند؛ این امر هزینه واردسازی این قلاب در زمان راه‌اندازی را حذف می‌کند. این قلاب همچنان برای Python 3.9 نصب می‌شود \- #3181 \%\&. (#3181 \%) .UNINDENT .SS v21.5.2 (2026\-07\-06) .SS رفع باگ‌ها \- 21.5.2 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools به \fB83.0.0\fP (#3180 \%) .UNINDENT .UNINDENT .SS v21.5.1 (2026\-06\-16) .SS رفع باگ‌ها \- 21.5.1 .INDENT 0.0 .IP \(bu 2 رد ایجاد محیط‌هایی که نسخه پایتون آن‌ها دیگر توسط wheelهای همراه پوشش داده نمی‌شود (در حال حاضر نسخه‌های پیش از 3.9). virtualenv پیش‌تر جدیدترین \fBpip\fP بسته‌بندی‌شده را جایگزین می‌کرد که روی چنین مقصدی قابل اجرا نبود و محیطی خراب به جا می‌گذاشت؛ اکنون سامانه انتخاب seeder آن را از همان ابتدا با خطایی واضح رد می‌کند. \fB\-\-no\-seed\fP و seederهای متفرقه شخص ثالث که wheelهای سازگار ارائه می‌دهند همچنان کار می‌کنند \- توسط @gaborbernat \%\&. (#3171 \%) .UNINDENT .SS v21.5.0 (2026\-06\-13) .SS ویژگی‌ها \- 21.5.0 .INDENT 0.0 .IP \(bu 2 توقف پشتیبانی از Python 3.8؛ اکنون virtualenv برای اجرا و ساخت محیط‌ها به Python 3.9 یا بالاتر نیاز دارد. حذف بسته seed تعبیه‌شدهٔ \fBwheel\fP، که virtualenv آن را فقط برای Python 3.8 به همراه داشت. گزینه‌های \fB\-\-wheel\fP و \fB\-\-no\-wheel\fP به عنوان گزینه‌های بی‌اثر (no\-ops) باقی می‌مانند، اما اکنون هشدار می‌دهند که virtualenv آن‌ها را در نگارشی پس از 2026\-12 حذف خواهد کرد \- توسط @gaborbernat \%\&. (#3170 \%) .UNINDENT .SS رفع باگ‌ها \- 21.5.0 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .sp حذف wheel مربوط به نسخه \fB0.47.0\fP (#u \%) .UNINDENT.SS v21.4.3 (2026\-06\-11) .SS رفع باگ‌ها \- 21.4.3 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 ارتقای pip به \fB26.1.2\fP از \fB26.1.1\fP (#u \%) .UNINDENT .IP \(bu 2 حل پیوندهای نمادین (symlink) مخصوص فایل اجرایی هنگام ثبت \fBhome\fP و \fBbase\-executable\fP در \fBpyvenv.cfg\fP، مشابه با \fBgetpath.realpath\fP در CPython (python/cpython#115237)، تا محیط‌های ایجادشده از روی یک پیوند نمادین به باینری مفسر بتوانند stdlib پایه را پیدا کنند (برای مثال python\-build\-standalone)؛ یک درخت مفسر با پیوند نمادین کامل دست‌نخورده باقی می‌ماند \- توسط @gaborbernat \%\&. (#3157 \%) .IP \(bu 2 توقف export کردن \fBPS1\fP از فعال‌ساز bash تا فرآیندهای فرزند وضعیت خط فرمان پوسته را به ارث نبرند. (#3158 \%) .IP \(bu 2 مدیریت تبدیل مسیرهای CYGWIN/MSYS/MINGW در اسکریپت فعال‌سازی fish \- توسط user::\fILuNoX\fP\&. (#3160 \%) .UNINDENT .SS v21.4.2 (2026\-05\-31) .SS رفع باگ‌ها \- 21.4.2 .INDENT 0.0 .IP \(bu 2 جلوگیری از متوقف شدن \fBdeactivate\fP در اسکریپت فعال‌سازی bash/zsh تحت \fBset \-e\fP در صورت شکست \fBhash \-r\fP (برای مثال هنگامی که hashing پوسته غیرفعال است) با افزودن \fB|| true\fP، مشابه \fBvenv\fP در CPython (gh\-149701) و فراخوانی غیر\-deactivate موجود \- توسط @gaborbernat \%\&. (#3152 \%) .UNINDENT .SS v21.4.1 (2026\-05\-28) .SS رفع باگ‌ها \- 21.4.1 .INDENT 0.0 .IP \(bu 2 رفع مشکلی که در آن جایگزینی \fBvenvlauncher_d.exe\fP در ساخت خطایابی ویندوز هرگز اجرا نمی‌شد زیرا \fBexecutables()\fP نام فایل اجرایی مبدأ را به جای نام مقصد مقایسه می‌کرد، و رفع خطای \fBAttributeError\fP روی مشخصهٔ \fBdebug_build\fP برای اشیاء اطلاعات مفسر که فاقد این فیلد بودند \- توسط @gaborbernat \%\&. (#3151 \%) .UNINDENT .SS v21.4.0 (2026\-05\-28) .SS ویژگی‌ها \- 21.4.0 .INDENT 0.0 .IP \(bu 2 حذف کدهای مردهٔ مربوط به نسخه‌های پایتون پایین‌تر از محدودهٔ هدفِ پشتیبانی‌شده (PyPy 3.6، رابط‌های منسوخ‌شدهٔ importlib) و ساده‌سازی قلاب واردسازی زمان اجرا در \fB_virtualenv.py\fP \- توسط @gaborbernat \%\&. (#3149 \%) .IP \(bu 2 پشتیبانی از ساخت‌های خطایابی ویندوز (\fBpython_d.exe\fP، \fBvenvlauncher_d.exe\fP) مطابق با رفتار venv در CPython، حذف جایگزینی مردهٔ \fB__SCRIPT_DIR__\fP و محافظ نسخهٔ \fBhas_shim\fP، حذف شاخهٔ غیرقابل‌دسترس Python 3.7 از \fBpyvenv_launch_patch_active\fP، و اصلاح پیام منسوخ شدن wheel به عبارت \fB>= 3.9\fP \- توسط @gaborbernat \%\&. (#3150 \%) .UNINDENT .SS v21.3.3 (2026\-05\-13) .SS رفع باگ‌ها \- 21.3.3 .INDENT 0.0 .IP \(bu 2 شناسایی مفسرهای GraalPy با استفاده از نام نرمال‌شدهٔ \fBGraalPy\fP \- توسط @timfel \%\&. (#3144 \%) .UNINDENT .SS v21.3.2 (2026\-05\-12) .sp بدون تغییرات قابل توجه. .SS v21.3.1 (2026\-05\-05) .SS رفع باگ‌ها \- 21.3.1 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 ارتقای pip به \fB26.1.1\fP از \fB26.1\fP (#3138 \%) .UNINDENT .UNINDENT .SS v21.3.0 (2026\-04\-27) .SS ویژگی‌ها \- 21.3.0 .INDENT 0.0 .IP \(bu 2 معرفی مجدد فعال‌ساز پوستهٔ \fBxonsh\fP (\fBactivate.xsh\fP) که پیش‌تر در 20.7.0 حذف شده بود، و ترجیح دادن نقاط ورودی پیش‌فرض virtualenv توسط بارگذار افزونه‌ها به طوری که یک بستهٔ شخص ثالث نتواند با ثبت نام تکراری آن‌ها را بازنویسی کند. (#3003 \%) .UNINDENT .SS رفع باگ‌ها \- 21.3.0 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 ارتقای pip به \fB26.1\fP (#3132 \%) .UNINDENT .UNINDENT.SS v21.2.4 (2026\-04\-14) .SS "رفع باگ‌ها (Bugfixes) \- 21.2.4" .INDENT 0.0 .IP \(bu 2 مقاوم‌سازی امنیتی: اعتبارسنجی هر مدخل در آرشیو seed wheel پیش از استخراج آن، تا یک wheel دست‌کاری‌شده نتواند از طریق مسیر مطلق یا پیمایش با \fB\&..\fP از دایرکتوری تصویر app\-data خارج شود. (#3118 \%) .IP \(bu 2 مقاوم‌سازی امنیتی: راستی‌آزمایی SHA\-256 هر seed wheel بسته‌بندی‌شده هنگام بارگذاری آن، تا در صورت خراب یا دست‌کاری شدن فایل روی دیسک، به‌جای تحویل داده شدن به pip با خطای صریح متوقف شود. جدول درهم‌سازی (hash table) در کنار \fBBUNDLE_SUPPORT\fP توسط \fBtasks/upgrade_wheels.py\fP\& تولید می‌شود. (#3119 \%) .IP \(bu 2 مقاوم‌سازی امنیتی: اعتبارسنجی نام توزیع و مشخص‌کنندهٔ نسخهٔ ارسالی به \fBpip download\fP هنگام دریافت seed wheel، تا extras، پرچم‌های pip یا فرامنویسه‌های شل (shell metacharacters) نتوانند به خط فرمان subprocess تزریق شوند. (#3120 \%) .IP \(bu 2 مقاوم‌سازی امنیتی: جایگزینی بررسی اشتمال پیشوند رشته‌ای در \fBvirtualenv.util.zipapp\fP با \fBPath.relative_to\fP تا توابع کمکی استخراج zipapp هر مسیری را که ذیل ریشهٔ آرشیو قرار نگیرد، رد کنند. (#3121 \%) .IP \(bu 2 مقاوم‌سازی امنیتی: عدم بازگشت خاموش به یک بافت (context) تأییدنشدهٔ HTTPS زمانی که درخواست دوره‌ای به‌روزرسانی به PyPI در راستی‌آزمایی TLS شکست می‌خورد. متادادهٔ بازگردانده‌شده مشخص می‌کند که virtualenv کدام نسخهٔ wheel را \(dqبه‌روز\(dq تلقی کند، بنابراین پذیرش پاسخی تأییدنشده به مهاجم در سطح شبکه اجازه می‌دهد به‌روزرسانی‌های امنیتی را سرکوب کند. مقدار \fBVIRTUALENV_PERIODIC_UPDATE_INSECURE=1\fP را برای بازگرداندن رفتار قبلی روی میزبان‌هایی با مخازن اعتماد (trust stores) خراب، تنظیم کنید. (#3122 \%) .UNINDENT .SS v21.2.3 (2026\-04\-14) .sp بدون تغییرات چشمگیر. .SS v21.2.2 (2026\-04\-13) .SS "رفع باگ‌ها (Bugfixes) \- 21.2.2" .INDENT 0.0 .IP \(bu 2 افزایش حداقل نسخهٔ \fBpython\-discovery\fP به \fB>=1.2.2\fP جهت گنجاندن پشتیبانی از \fBnormalize_isa\fP \- توسط @rahuldevikar \%\&. (#3117 \%) .UNINDENT .SS v21.2.1 (2026\-04\-09) .SS "رفع باگ‌ها (Bugfixes) \- 21.2.1" .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 ارتقای setuptools به \fB82.0.1\fP از \fB82.0.0\fP (#3093 \%) .UNINDENT .IP \(bu 2 استفاده از عرض ترمینال برای قالب‌بندی پیام راهنما به‌جای مقدار ثابت ۲۴۰. (#3110 \%) .UNINDENT .SS v21.2.0 (2026\-03\-09) .SS "ویژگی‌ها (Features) \- 21.2.0" .INDENT 0.0 .IP \(bu 2 به‌روزرسانی مولد wheelهای تعبیه‌شده (\fBtasks/upgrade_wheels.py\fP) جهت گنجاندن حاشیه‌نویسی‌های نوع (type annotations) در خروجی تولیدشده \- توسط @rahuldevikar \%\&. (#3075 \%) .UNINDENT .SS "رفع باگ‌ها (Bugfixes) \- 21.2.0" .INDENT 0.0 .IP \(bu 2 ارسال \fB\-\-without\-scm\-ignore\-files\fP به subprocess venv در Python 3.13+ تا ایجاد \fB\&.gitignore\fP در کنترل virtualenv باشد؛ که این امر رفتار ناپایدار در \fBtest_create_no_seed\fP و نادیده گرفته شدن \fB\-\-no\-vcs\-ignore\fP در مسیر subprocess را رفع می‌کند \- توسط @gaborbernat \%\&. (#3089 \%) .IP \(bu 2 استفاده از \fBBASH_SOURCE[0]\fP به‌جای \fB$0\fP در سازوکار جایگزین تغییر مکان اسکریپت فعال‌سازی bash، که مشکل مقدار نادرست \fBPATH\fP را هنگام source کردن اسکریپت فعال‌سازی از یک دایرکتوری دیگر برطرف می‌کند \- توسط @gaborbernat \%\&. (#3090 \%) .UNINDENT .SS v21.1.0 (2026\-02\-27) .SS "ویژگی‌ها (Features) \- 21.1.0" .INDENT 0.0 .IP \(bu 2 افزودن حاشیه‌نویسی‌های جامع نوع در سرتاسر کدبیس و ارائهٔ نشانگر PEP 561 \fBpy.typed\fP تا مصرف‌کنندگان پایین‌دستی و بررسی‌کننده‌های نوع، virtualenv را به‌عنوان بسته‌ای با انواع درون‌خطی (inline\-typed) شناسایی کنند \- توسط @rahuldevikar \%\&. (#3075 \%) .UNINDENT .SS v21.0.0 (2026\-02\-25) .SS "موارد منسوخ و حذف‌شده (Deprecations and Removals) \- 21.0.0" .INDENT 0.0 .IP \(bu 2 منطق شناسایی پایتون (Python discovery) در قالب یک بستهٔ مستقل به نام \fBpython\-discovery\fP در PyPI استخراج شده است (مستندات در \%) و اکنون به‌عنوان یک وابستگی استفاده می‌شود. اگر پیش‌تر بخش‌های داخلی discovery را مستقیماً وارد می‌کردید (مانند \fBfrom virtualenv.discovery.py_info import PythonInfo\fP)، آن را به \fBfrom python_discovery import PythonInfo\fP\& تغییر دهید. لایه‌های تطبیقی بازصادرکننده برای سازگاری با نسخه‌های پیشین در \fBvirtualenv.discovery.py_info\fP، \fBvirtualenv.discovery.py_spec\fP و \fBvirtualenv.discovery.cached_py_info\fP ارائه شده‌اند، با این حال پشتیبانی‌نشده تلقی می‌شوند و ممکن است در نسخه‌های بعدی حذف شوند \- توسط @gaborbernat \%\&. (#3070 \%) .UNINDENT.SS v20.39.1 (2026\-02\-25) .SS ویژگی‌ها \- 20.39.1 .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از ایجاد محیط‌های مجازی با RustPython \- توسط @elmjag \%\&. (#3010 \%) .UNINDENT .SS v20.39.0 (2026\-02\-23) .SS ویژگی‌ها \- 20.39.0 .INDENT 0.0 .IP \(bu 2 حل خودکار shimهای برنامه‌های مدیریت نسخه (pyenv، mise، asdf) به باینری واقعی Python در طول فرایند شناسایی، برای جلوگیری از انتخاب نادرست مفسر هنگامی که shimها در \fBPATH\fP هستند \- توسط @gaborbernat \%\&. (#3049 \%) .IP \(bu 2 افزودن آگاهی از معماری (ISA) به فرایند شناسایی Python — کاربران اکنون می‌توانند یک پسوند معماری CPU در رشته مشخصات \fB\-\-python\fP (مانند \fBcpython3.12\-64\-arm64\fP) تعیین کنند تا بین مفسرهایی با نسخه و تعداد بیت یکسان اما معماری‌های هدف متفاوت، تمایز قائل شوند. از \fBsysconfig.get_platform()\fP به عنوان منبع داده همراه با یکسان‌سازی چندسکویی (\fBamd64\fP ↔ \fBx86_64\fP، \fBaarch64\fP ↔ \fBarm64\fP) استفاده می‌کند. حذف این پسوند رفتار پیشین را حفظ می‌کند \- توسط @rahuldevikar \%\&. (#3059 \%) .UNINDENT .SS v20.38.0 (2026\-02\-19) .SS ویژگی‌ها \- 20.38.0 .INDENT 0.0 .IP \(bu 2 ذخیره داده‌های برنامه (حافظه‌های موقت pip/setuptools/wheel) در دایرکتوری کش سیستم‌عامل (\fBplatformdirs.user_cache_dir\fP) به جای دایرکتوری داده‌ها (\fBplatformdirs.user_data_dir\fP). داده‌های موجود برنامه در مکان قبلی، در نخستین استفاده به صورت خودکار منتقل می‌شوند. این امر تضمین می‌کند فایل‌های کش‌شده‌ای که امکان بارگیری مجدد دارند در محل استاندارد کش (مانند \fB~/.cache\fP در لینوکس، \fB~/Library/Caches\fP در macOS) قرار گیرند تا از فایل‌های پشتیبان مستثنی شده و توسط ابزارهای سیستم قابل پاک‌سازی باشند \- توسط @rahuldevikar \%\&. (#1884 \%) (#1884 \%) .IP \(bu 2 افزودن پشتیبانی از متغیر محیطی \fBPKG_CONFIG_PATH\fP به تمامی اسکریپت‌های فعال‌سازی (Bash، Batch، PowerShell، Fish، C Shell، Nushell و Python). اکنون دایرکتوری \fBlib/pkgconfig\fP مربوط به virtualenv هنگام فعال‌سازی به طور خودکار به ابتدای \fBPKG_CONFIG_PATH\fP افزوده شده و هنگام غیرفعال‌سازی بازیابی می‌شود، که به بسته‌های استفاده‌کننده از \fBpkg\-config\fP در حین ساخت/نصب امکان می‌دهد فایل‌های پیکربندی خود را پیدا کنند \- توسط @rahuldevikar \%\&. (#2637 \%) .IP \(bu 2 ارتقای pip تعبیه‌شده به \fB26.0.1\fP از \fB25.3\fP و setuptools به \fB82.0.0\fP، \fB75.3.4\fP از \fB75.3.2\fP، \fB80.9.0\fP \- توسط @rahuldevikar \%\&. (#3027 \%) .IP \(bu 2 جایگزینی کامنت‌های \fBty: ignore\fP با باریک‌سازی مناسب نوع (type narrowing) با استفاده از assertionها و بررسی‌های صریح None \- توسط @rahuldevikar \%\&. (#3029 \%) .UNINDENT .SS رفع باگ‌ها \- 20.38.0 .INDENT 0.0 .IP \(bu 2 جلوگیری از کپی شدن DLLهای pywin32 (\fBpywintypes*.dll\fP، \fBpythoncom*.dll\fP) در دایرکتوری Scripts هنگام ساخت virtualenv در Windows. این کار مشکلات سازگاری با pywin32 را برطرف می‌کند، چرا که انتظار دارد DLLهایش توسط اسکریپت پس از نصب اختصاصی خودش در \fBsite\-packages/pywin32_system32\fP قرار گیرند \- توسط @rahuldevikar \%\&. (#2662 \%) .IP \(bu 2 حفظ پیوندهای نمادین (symlinks) در مسیرهای \fBpyvenv.cfg\fP برای تطابق با رفتار \fBvenv\fP. استفاده از \fBos.path.abspath()\fP به جای \fBos.path.realpath()\fP جهت یکسان‌سازی مسیرها بدون حل کردن پیوندهای نمادین، که مشکلات مربوط به نصب‌های Python با دسترسی از طریق دایرکتوری‌های پیوند نمادین (رایج در سیستم‌های فایل متصل از طریق شبکه) را رفع می‌کند \- توسط @rahuldevikar \%\&. رفع اشکال #2770 \%\&. (#2770 \%) .IP \(bu 2 اصلاح اسکریپت‌های فعال‌سازی Windows جهت قرار دادن صحیح مسیر \fBpython.exe\fP در علامت نقل‌قول (کوتیشن)، برای جلوگیری از خرابی در مواردی که Python در مسیری دارای فاصله (مانند \fBC:\eProgram Files\fP) نصب شده و فایلی به نام \fBC:\eProgram\fP روی سیستم‌فایل وجود دارد \- توسط @rahuldevikar \%\&. (#2985 \%) .IP \(bu 2 اصلاح سازگاری با \fBbash \-u\fP (\fBset \-o nounset\fP) در اسکریپت فعال‌سازی bash با بهره‌گیری از \fB${PKG_CONFIG_PATH:\-}\fP و \fB${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}\fP جهت مدیریت \fBPKG_CONFIG_PATH\fP تعریف‌نشده \- توسط @Fridayai700 \%\&. (#3044 \%) .IP \(bu 2 مدیریت مناسب کش معیوب روی دیسک و JSON نامعتبر حاصل از زیرفرایند بازجویی Python به جای توقف ناگهانی برنامه با خطاهای مدیریت‌نشدهٔ \fBJSONDecodeError\fP یا \fBKeyError\fP \- توسط @gaborbernat \%\&. (#3054 \%) .UNINDENT .SS v20.36.1 (2026\-01\-09) .SS رفع باگ‌ها \- 20.36.1 .INDENT 0.0 .IP \(bu 2 رفع آسیب‌پذیری‌های TOCTOU در هنگام ساخت app_data و دایرکتوری قفل که می‌توانست از طریق حملات پیوند نمادین (symlink) مورد سوءاستفاده قرار گیرد \- گزارش شده توسط @tsigouris007 \%، رفع شده توسط @gaborbernat \%\&. (#3013 \%) .UNINDENT .SS v20.36.0 (2026\-01\-07) .SS ویژگی‌ها \- 20.36.0 .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از مشخص‌کننده‌های نسخه طبق PEP 440 در گزینه \fB\-\-python\fP. کاربران اکنون می‌توانند با عملگرهایی مانند \fB>=\fP، \fB<=\fP، \fB~=\fP و غیره نسخه‌های Python را مشخص کنند. برای مثال: \fBvirtualenv \-\-python=\(dq>=3.12\(dq myenv\fP \fI\&. (:issue:\(ga2994\fP) .UNINDENT .SS v20.35.4 (2025\-10\-28) .SS رفع باگ‌ها \- 20.35.4 .INDENT 0.0 .IP \(bu 2 رفع وضعیت رقابتی (race condition) در \fB_virtualenv.py\fP هنگام رونویسی فایل حین ایمپورت، که از بروز \fBNameError\fP هنگام دسترسی به \fB_DISTUTILS_PATCH\fP جلوگیری می‌کند \- توسط @gracetyy \%\&. (#2969 \%) .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 pip به \fB25.3\fP از \fB25.2\fP (#2989 \%) .UNINDENT .UNINDENT.SS v20.35.3 (2025\-10\-10) .SS رفع باگ‌ها \- 20.35.3 .INDENT 0.0 .IP \(bu 2 پذیرش RuntimeError در \fItest_too_many_open_files\fP، توسط @esafak \% (#2935 \%) .UNINDENT .SS v20.35.2 (2025\-10\-10) .SS رفع باگ‌ها \- 20.35.2 .INDENT 0.0 .IP \(bu 2 بازگردانی تغییرات مربوط به استخراج ماژول discovery \- توسط @gaborbernat \%\&. (#2978 \%) .UNINDENT .SS v20.35.1 (2025\-10\-09) .SS رفع باگ‌ها \- 20.35.1 .INDENT 0.0 .IP \(bu 2 اعمال پچ روی get_interpreter برای مدیریت نبود cache و app_data \- توسط @esafak \% (#2972 \%) .IP \(bu 2 رفع تغییرات ناسازگار با نسخه‌های پیشین در \fBPythonInfo\fP \- توسط @gaborbernat \%\&. (#2975 \%) .UNINDENT .SS v20.35.0 (2025\-10\-08) .SS ویژگی‌ها \- 20.35.0 .INDENT 0.0 .IP \(bu 2 افزودن پروتکل‌های AppData و Cache به discovery جهت جداسازی وابستگی‌ها (decoupling) \- توسط @esafak \%\&. (#2074 \%) .IP \(bu 2 اطمینان از وجود python3.exe و python3 در Windows برای Python 3 \- توسط @esafak \%\&. (#2774 \%) .UNINDENT .SS رفع باگ‌ها \- 20.35.0 .INDENT 0.0 .IP \(bu 2 جایگزینی ارجاعات مستقیم به مسیرهای کتابخانه tcl/tk با getattr \- توسط @esafak \% (#2944 \%) .IP \(bu 2 بازگردانی واردسازی مطلق (absolute import) برای fs_is_case_sensitive \- توسط @esafak \%\&. (#2955 \%) .UNINDENT .SS v20.34.0 (2025\-08\-13) .SS ویژگی‌ها \- 20.34.0 .INDENT 0.0 .IP \(bu 2 انتزاع کشینگ در discovery \- توسط @esafak \%\&. جداسازی \fIFileCache\fP از \fIpy_info\fP (در discovery) \- توسط @esafak \%\&. حذف ارجاعات به py_info در FileCache \- توسط @esafak \%\&. جداسازی discovery از افزایه‌های creator \- توسط @esafak \%\&. جداسازی discovery با تکثیر ابزارهای info utils \- توسط @esafak \%\&. (#2074 \%) .IP \(bu 2 افزودن پشتیبانی از PyPy 3.11. با مشارکت @esafak \%\&. (#2932 \%) .UNINDENT .SS رفع باگ‌ها \- 20.34.0 .INDENT 0.0 .IP \(bu 2 ارتقای wheel تعبیه‌شده pip به \fB25.2\fP از \fB25.1.1\fP \- توسط @gaborbernat \%\&. (#2333 \%) .IP \(bu 2 پذیرش RuntimeError در \fItest_too_many_open_files\fP، توسط @esafak \% (#2935 \%) .IP \(bu 2 اولویت داشتن Python موجود در PATH نسبت به python مدیریت‌شده توسط uv. با مشارکت @edgarrmondragon \%\&. (#2952 \%) .UNINDENT .SS v20.33.1 (2025\-08\-05) .SS رفع باگ‌ها \- 20.33.1 .INDENT 0.0 .IP \(bu 2 استخراج صحیح پاسخ ()_get_tcl_tk_libs در PythonInfo. با مشارکت @esafak \%\&. (#2930 \%) .IP \(bu 2 بازگردانی برچسب زمانی فایل \fIpy_info.py\fP در \fItest_py_info_cache_invalidation_on_py_info_change\fP با مشارکت @esafak \%\&. (#2933 \%) .UNINDENT .SS v20.33.0 (2025\-08\-03) .SS ویژگی‌ها \- 20.33.0 .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از Tcl و Tkinter. خواهش می‌کنم! با مشارکت @esafak \%\&. (#425 \%) .UNINDENT .SS رفع باگ‌ها \- 20.33.0 .INDENT 0.0 .IP \(bu 2 جلوگیری از راه‌اندازی ثبت وقایع (logging) هنگامی که \-\-help ارسال شده باشد، جهت رفع یک آزمون ناپایدار (flaky test). با مشارکت @esafak \%\&. (#u \%) .IP \(bu 2 رفع مشکل ابطال حافظه موقت (cache invalidation) برای PythonInfo از طریق درهم‌سازی فایل \fIpy_info.py\fP\&. با مشارکت @esafak \%\&. (#2467 \%) .IP \(bu 2 هنگامی که هیچ افزایه کشفی (discovery plugin) یافت نمی‌شد، برنامه با StopIteration دچار توقف غیرمنتظره می‌شد. این تغییر، StopIteration را مدیریت کرده و یک RuntimeError با پیامی واضح‌تر صادر می‌کند. با مشارکت @esafak \%\&. (#2493 \%) .IP \(bu 2 جلوگیری از بازنویسی مسیرهای مطلق \fI\-\-python\fP توسط \fI\-\-try\-first\-with\fP. با مشارکت @esafak \%\&. (#2659 \%) .IP \(bu 2 اجباری کردن کدگذاری UTF\-8 برای دستور pip download با مشارکت @esafak \%\&. (#2780 \%) .IP \(bu 2 ایجاد محیط مجازی روی یک سیستم‌فایل بدون پشتیبانی از پیوند نمادین (symlink) حتی با گزینه \fI\-\-copies\fP با شکست مواجه می‌شد؛ اکنون \fIfs_supports_symlink\fP یک بررسی واقعی ساخت پیوند نمادین را روی تمامی پلتفرم‌ها انجام می‌دهد. با مشارکت @esafak \%\&. (#2786 \%) .IP \(bu 2 افزودن یادداشتی به راهنمای کاربر که استفاده از یک نسخه مشخص Python را هنگام ساخت محیط‌های مجازی توصیه می‌کند. با مشارکت @esafak \%\&. (#2808 \%) .IP \(bu 2 رفع خطای \(aqToo many open files\(aq ناشی از نشت توصیف‌کننده فایل (file descriptor leak) در سازوکار قفل‌گذاری virtualenv. با مشارکت @esafak \%\&. (#2834 \%) .IP \(bu 2 پشتیبانی از تغییر نام هدایت‌گرهای venv در Windows (\fIvenvlauncher.exe\fP و \fIvenvwlauncher.exe\fP) در Python 3.13 با مشارکت @esafak \%\&. (#2851 \%) .IP \(bu 2 رفع هشدارهای منسوخ‌شدگی اسکریپت فعال‌سازی Nushell از طریق انتخاب پویای پرچم \fB\-\-optional\fP برای دستور \fBget\fP در Nushell در نسخه 0.106.0 و جدیدتر، ضمن حفظ پرچم منسوخ‌شده \fB\-i\fP برای نسخه‌های قدیمی‌تر جهت حفظ سازگاری. با مشارکت @gaborbernat \%\&. (#2910 \%) .UNINDENT.SS v20.32.0 (2025\-07\-20) .SS قابلیت‌ها \- 20.32.0 .INDENT 0.0 .IP \(bu 2 هشدار در صورت فراخوانی نادرست اسکریپت فعال‌سازی Nushell \- توسط @esafak \%\&. (#nushell_activation \%) .IP \(bu 2 شناسایی نسخه‌های نصب‌شدهٔ Python مدیریت‌شده توسط uv (#2901 \%) .UNINDENT .SS رفع اشکالات \- 20.32.0 .INDENT 0.0 .IP \(bu 2 نادیده‌گرفتن مسیرهای مطلق ناموجود در شناسایی python \- توسط @esafak \% (#2870 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده به \fB80.9.0\fP از \fB80.3.1\fP \- توسط @gaborbernat \%\&. (#2900 \%) .UNINDENT .SS v20.31.2 (2025\-05\-08) .sp بدون تغییرات قابل توجه. .SS v20.31.1 (2025\-05\-05) .SS رفع اشکالات \- 20.31.1 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 pip به \fB25.1.1\fP از \fB25.1\fP .IP \(bu 2 setuptools به \fB80.3.1\fP از \fB78.1.0\fP (#2880 \%) .UNINDENT .UNINDENT .SS v20.31.0 (2025\-05\-05) .SS قابلیت‌ها \- 20.31.0 .INDENT 0.0 .IP \(bu 2 عدم بسته‌بندی wheelهای \fBwheel\fP (به‌جز در Python 3.8)؛ \fBsetuptools\fP شامل پشتیبانی بومی از \fBbdist_wheel\fP است. به‌روزرسانی \fBpip\fP به \fB25.1\fP\&. (#2868 \%) .UNINDENT .SS رفع اشکالات \- 20.31.0 .INDENT 0.0 .IP \(bu 2 \fBget_embed_wheel()\fP دیگر هنگام فراخوانی با یک \fIdistribution\fP ناشناخته با خطای \fBTypeError\fP \% شکست نمی‌خورد\&. (#2877 \%) .IP \(bu 2 رفع خطای \fBHelpFormatter\fP با Python 3.14.0b1\&. (#2878 \%) .UNINDENT .SS v20.30.0 (2025\-03\-31) .SS قابلیت‌ها \- 20.30.0 .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از GraalPy \%\&. (#2832 \%) .UNINDENT .SS رفع اشکالات \- 20.30.0 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools به \fB78.1.0\fP از \fB75.3.2\fP (#2863 \%) .UNINDENT .UNINDENT .SS v20.29.3 (2025\-03\-06) .SS رفع اشکالات \- 20.29.3 .INDENT 0.0 .IP \(bu 2 نادیده‌گرفتن دایرکتوری‌های غیرقابل خواندن در \fBPATH\fP\&. (#2794 \%) .UNINDENT .SS v20.29.2 (2025\-02\-10) .SS رفع اشکالات \- 20.29.2 .INDENT 0.0 .IP \(bu 2 حذف wheel قدیمی virtualenv از توزیع کد منبع \- توسط @gaborbernat \%\&. (#2841 \%) .IP \(bu 2 ارتقای wheel تعبیه‌شدهٔ pip به \fB25.0.1\fP از \fB24.3.1\fP \- توسط @gaborbernat \%\&. (#2843 \%) .UNINDENT .SS v20.29.1 (2025\-01\-17) .SS رفع اشکالات \- 20.29.1 .INDENT 0.0 .IP \(bu 2 رفع هشدارهای ناسازگاری حافظهٔ پنهان PyInfo \- توسط @robsdedude \%\&. (#2827 \%) .UNINDENT.SS v20.29.0 (2025\-01\-15) .SS ویژگی‌ها \- 20.29.0 .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از انتخاب مفسرهای پایتون free\-threaded، مانند \fIpython3.13t\fP\&. (#2809 \%) .UNINDENT .SS رفع باگ‌ها \- 20.29.0 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools از \fB75.6.0\fP به \fB75.8.0\fP (#2823 \%) .UNINDENT .UNINDENT .SS v20.28.1 (2025\-01\-02) .SS رفع باگ‌ها \- 20.28.1 .INDENT 0.0 .IP \(bu 2 صرف‌نظر از آزمون‌های tcsh در نسخه‌های خراب tcsh \- توسط @gaborbernat \%\&. (#2814 \%) .UNINDENT .SS v20.28.0 (2024\-11\-25) .SS ویژگی‌ها \- 20.28.0 .INDENT 0.0 .IP \(bu 2 نوشتن فایل CACHEDIR.TAG در زمان ایجاد \- توسط \(dquser:\fIneilramsay\fP\&. (#2803 \%) .UNINDENT .SS v20.27.2 (2024\-11\-25) .SS رفع باگ‌ها \- 20.27.2 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools از \fB75.2.0\fP به \fB75.3.0\fP (#2798 \%) .UNINDENT .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 wheel از \fB0.44.0\fP به \fB0.45.0\fP .IP \(bu 2 setuptools به \fB75.5.0\fP (#2800 \%) .UNINDENT .IP \(bu 2 عدم اعمال اجباری echo off در طول فعال‌سازی batch در ویندوز (#2801 \%) .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools از \fB75.5.0\fP به \fB75.6.0\fP .IP \(bu 2 wheel از \fB0.45.0\fP به \fB0.45.1\fP (#2804 \%) .UNINDENT .UNINDENT .SS v20.27.1 (2024\-10\-28) .SS رفع باگ‌ها \- 20.27.1 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 pip از \fB24.2\fP به \fB24.3.1\fP (#2789 \%) .UNINDENT .UNINDENT .SS v20.27.0 (2024\-10\-17) .SS ویژگی‌ها \- 20.27.0 .INDENT 0.0 .IP \(bu 2 توقف پشتیبانی از 3.7 زیرا محیط‌های CI دیگر اجازه اجرای آن را نمی‌دهند \- توسط @gaborbernat \%\&. (#2758 \%) .UNINDENT .SS رفع باگ‌ها \- 20.27.0 .INDENT 0.0 .IP \(bu 2 هنگامی که وجود یک مدخل \fB$PATH\fP قابل بررسی نیست، به جای پایان دادن، از آن صرف‌نظر شود \- توسط @hroncok \%\&. (#2782 \%) .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools از \fB75.1.0\fP به \fB75.2.0\fP .IP \(bu 2 حذف pip نسخه \fB24.0\fP .IP \(bu 2 حذف setuptools نسخه \fB68.0.0\fP .IP \(bu 2 حذف wheel نسخه \fB0.42.0\fP .IP \(bu 2 توسط @gaborbernat \%\&. (#2783 \%) .UNINDENT .IP \(bu 2 رفع خرابی zipapp در ویندوز پس از نسخه \fB0.3.9\fP از distlib \- توسط @gaborbernat \%\&. (#2784 \%) .UNINDENT.SS v20.26.6 (2024\-09\-27) .SS رفع باگ‌ها \- 20.26.6 .INDENT 0.0 .IP \(bu 2 کوتیشن‌گذاری مناسب جانگهدارنده‌های رشته در قالب‌های اسکریپت فعال‌سازی جهت کاهش خطر تزریق احتمالی دستور \- توسط @y5c4l3 \%\&. (#2768 \%) .UNINDENT .SS v20.26.5 (2024\-09\-17) .SS رفع باگ‌ها \- 20.26.5 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: setuptools به \fB75.1.0\fP از \fB74.1.2\fP \- توسط @gaborbernat \%\&. (#2765 \%) .UNINDENT .SS v20.26.4 (2024\-09\-07) .SS رفع باگ‌ها \- 20.26.4 .INDENT 0.0 .IP \(bu 2 عدم تولید خروجی \fI()\fP در کنسول در حین فعال‌سازی virtualenv توسط فایل .bat. (#2728 \%) .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 wheel به \fB0.44.0\fP از \fB0.43.0\fP .IP \(bu 2 pip به \fB24.2\fP از \fB24.1\fP .IP \(bu 2 setuptools به \fB74.1.2\fP از \fB70.1.0\fP (#2760 \%) .UNINDENT .UNINDENT .SS v20.26.3 (2024\-06\-21) .SS رفع باگ‌ها \- 20.26.3 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools به \fB70.1.0\fP از \fB69.5.1\fP .IP \(bu 2 pip به \fB24.1\fP از \fB24.0\fP (#2741 \%) .UNINDENT .UNINDENT .SS v20.26.2 (2024\-05\-13) .SS رفع باگ‌ها \- 20.26.2 .INDENT 0.0 .IP \(bu 2 بسته \fBvirtualenv.pyz\fP دیگر در صورت وجود پیوند نمادین (symlink) در مسیر zipapp دچار خطا نمی‌شود \- توسط @HandSonic \% و @petamas \%\&. (#1949 \%) .IP \(bu 2 اصلاح کد بازگشتی نادرست از activate.sh در صورت غیرفعال بودن hashing \- توسط :user:\(aqfenkes\-ibm\(aq. (#2717 \%) .UNINDENT .SS v20.26.1 (2024\-04\-29) .SS رفع باگ‌ها \- 20.26.1 .INDENT 0.0 .IP \(bu 2 رفع مشکل شناسایی Python مبتنی بر PATH در Windows \- توسط @ofek \%\&. (#2712 \%) .UNINDENT .SS v20.26.0 (2024\-04\-23) .SS رفع باگ‌ها \- 20.26.0 .INDENT 0.0 .IP \(bu 2 امکان شناسایی مفسرهای خاص (مانند \fBpython3.12\fP) توسط قابلیت شناسایی توکار (builtin discovery) هنگام ارائه یک مشخصه عمومی (مانند \fBpython3\fP) \- توسط @flying\-sheep \%\&. (#2709 \%) .UNINDENT .SS v20.25.3 (2024\-04\-17) .SS رفع باگ‌ها \- 20.25.3 .INDENT 0.0 .IP \(bu 2 تغییر نام pathmod به parser در Python 3.13.0a6. (#2702 \%) .UNINDENT .SS v20.25.2 (2024\-04\-16) .SS رفع باگ‌ها \- 20.25.2 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools از \fB69.1.0\fP به \fB69.5.1\fP .IP \(bu 2 wheel از \fB0.42.0\fP به \fB0.43.0\fP (#2699 \%) .UNINDENT .UNINDENT.SS v20.25.1 (2024\-02\-21) .SS رفع باگ‌ها \- 20.25.1 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای توکار: .INDENT 2.0 .IP \(bu 2 setuptools از \fB69.0.2\fP به \fB69.0.3\fP .IP \(bu 2 pip از \fB23.3.1\fP به \fB23.3.2\fP (#2681 \%) .UNINDENT .IP \(bu 2 ارتقای wheelهای توکار: .INDENT 2.0 .IP \(bu 2 pip از \fB23.3.2\fP به \fB24.0\fP، .IP \(bu 2 setuptools از \fB69.0.3\fP به \fB69.1.0\fP\&. (#2691 \%) .UNINDENT .UNINDENT .SS متفرقه \- 20.25.1 .INDENT 0.0 .IP \(bu 2 #2688 \% .UNINDENT .SS v20.25.0 (2023\-12\-01) .SS ویژگی‌ها \- 20.25.0 .INDENT 0.0 .IP \(bu 2 اکنون آزمون‌ها در CI با Python 3.13.0a2 پاس می‌شوند \- توسط @hroncok \%\&. (#2673 \%) .UNINDENT .SS رفع باگ‌ها \- 20.25.0 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای توکار: .INDENT 2.0 .IP \(bu 2 wheel از \fB0.41.2\fP به \fB0.41.3\fP (#2665 \%) .UNINDENT .IP \(bu 2 ارتقای wheelهای توکار: .INDENT 2.0 .IP \(bu 2 wheel از \fB0.41.3\fP به \fB0.42.0\fP .IP \(bu 2 setuptools از \fB68.2.2\fP به \fB69.0.2\fP (#2669 \%) .UNINDENT .UNINDENT .SS v20.24.6 (2023\-10\-23) .SS رفع باگ‌ها \- 20.24.6 .INDENT 0.0 .IP \(bu 2 استفاده از متد get_hookimpls به‌جای ویژگی خصوصی در آزمون‌ها. (#2649 \%) .IP \(bu 2 ارتقای wheelهای توکار: .INDENT 2.0 .IP \(bu 2 setuptools از \fB68.2.0\fP به \fB68.2.2\fP .IP \(bu 2 pip از \fB23.2.1\fP به \fB23.3.1\fP (#2656 \%) .UNINDENT .UNINDENT .SS v20.24.5 (2023\-09\-08) .SS رفع باگ‌ها \- 20.24.5 .INDENT 0.0 .IP \(bu 2 اعلام پشتیبانی از PyPy 3.10 \- توسط @cclauss \%\&. (#2638 \%) .IP \(bu 2 Brew در macOS دیگر ساخت‌های رونوشت (copy builds) را مجاز نمی‌داند \- جلوگیری از انتخاب این مورد توسط @gaborbernat \%\&. (#2640 \%) .IP \(bu 2 ارتقای wheelهای توکار: .INDENT 2.0 .IP \(bu 2 setuptools از \fB68.1.2\fP به \fB68.2.0\fP (#2642 \%) .UNINDENT .UNINDENT .SS v20.24.4 (2023\-08\-30) .SS رفع باگ‌ها \- 20.24.4 .INDENT 0.0 .IP \(bu 2 ارتقای wheelهای توکار: .INDENT 2.0 .IP \(bu 2 setuptools از \fB68.1.0\fP به \fB68.1.2\fP در \fB3.8+\fP .IP \(bu 2 wheel از \fB0.41.1\fP به \fB0.41.2\fP در \fB3.7+\fP (#2628 \%) .UNINDENT .UNINDENT.SS v20.24.3 (2023\-08\-11) .SS رفع باگ‌ها \- 20.24.3 .INDENT 0.0 .IP \(bu 2 رفع ResourceWarning هنگام خروج ناشی از زیرپردازش به‌روزرسانی دوره‌ای (#2472 \%) .IP \(bu 2 ارتقای بسته‌های wheel تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 wheel از \fB0.41.0\fP به \fB0.41.1\fP (#2622 \%) .UNINDENT .UNINDENT .SS متفرقه \- 20.24.3 .INDENT 0.0 .IP \(bu 2 #2610 \% .UNINDENT .SS v20.24.2 (2023\-07\-24) .SS رفع باگ‌ها \- 20.24.2 .INDENT 0.0 .IP \(bu 2 ارتقای بسته‌های wheel تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 pip از \fB23.2\fP به \fB23.2.1\fP .IP \(bu 2 wheel از \fB0.40.0\fP به \fB0.41.0\fP (#2614 \%) .UNINDENT .UNINDENT .SS v20.24.1 (2023\-07\-19) .SS رفع باگ‌ها \- 20.24.1 .INDENT 0.0 .IP \(bu 2 ارتقای بسته‌های wheel تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 pip از \fB23.1.2\fP به \fB23.2\fP \- توسط @arielkirkwood \% (#2611 \%) .UNINDENT .UNINDENT .SS v20.24.0 (2023\-07\-14) .SS ویژگی‌ها \- 20.24.0 .INDENT 0.0 .IP \(bu 2 صدور پیشوند اعلان (prompt prefix) به عنوان \fBVIRTUAL_ENV_PROMPT\fP هنگام فعال‌سازی یک محیط مجازی \- توسط @jimporter \%\&. (#2194 \%) .UNINDENT .SS رفع باگ‌ها \- 20.24.0 .INDENT 0.0 .IP \(bu 2 رفع اشکال مجموعه آزمون \- توسط @gaborbernat \%\&. (#2592 \%) .IP \(bu 2 ارتقای بسته‌های wheel تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools از \fB67.8.0\fP به \fB68.0.0\fP (#2607 \%) .UNINDENT .UNINDENT .SS v20.23.1 (2023\-06\-16) .SS رفع باگ‌ها \- 20.23.1 .INDENT 0.0 .IP \(bu 2 به‌روزرسانی و ساده‌سازی اسکریپت فعال‌سازی nushell، رفع مشکلی در Windows که منجر به خطاهای متوالی command not found می‌شد \- توسط @melMass \%\&. (#2572 \%) .IP \(bu 2 ارتقای بسته‌های wheel تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 setuptools از \fB67.7.2\fP به \fB67.8.0\fP (#2588 \%) .UNINDENT .UNINDENT .SS v20.23.0 (2023\-04\-27) .SS ویژگی‌ها \- 20.23.0 .INDENT 0.0 .IP \(bu 2 عدم نصب بسته‌های آغازین (seed) \fBwheel\fP و \fBsetuptools\fP برای Python 3.12+. برای بازگرداندن رفتار قبلی از موارد زیر استفاده کنید: .INDENT 2.0 .IP \(bu 2 برای \fBwheel\fP از متغیر محیطی \fBVIRTUALENV_WHEEL=bundle\fP یا گزینه خط فرمان \fB\-\-wheel=bundle\fP استفاده کنید، .IP \(bu 2 برای \fBsetuptools\fP از متغیر محیطی \fBVIRTUALENV_SETUPTOOLS=bundle\fP یا گزینه خط فرمان \fB\-\-setuptools=bundle\fP استفاده کنید. .UNINDENT .sp توسط @chrysle \%\&. (#2487 \%) .IP \(bu 2 پشتیبانی از 3.12 \- توسط @gaborbernat \%\&. (#2558 \%) .UNINDENT.SS رفع باگ‌ها \- 20.23.0 .INDENT 0.0 .IP \(bu 2 جلوگیری از \fBPermissionError\fP هنگام استفاده از سازنده venv روی سیستم‌هایی که فایل‌ها را بدون مجوز نوشتن کاربر ارائه می‌دهند \- توسط @kulikjak \%\&. (#2543 \%) .IP \(bu 2 ارتقای setuptools از \fB67.6.1\fP به \fB67.7.2\fP و pip از \fB23.1\fP به \fB23.1.2\fP \- توسط @szleb \%\&. (#2560 \%) .UNINDENT .SS v20.22.0 (2023\-04\-19) .SS ویژگی‌ها \- 20.22.0 .INDENT 0.0 .IP \(bu 2 حذف پشتیبانی از ساخت مفسرهای Python <=3.6 (شامل ۲). حذف pip نسخه‌های \fB20.3.4\fP و \fB21.3.1\fP؛ wheel نسخه \fB0.37.1\fP؛ setuptools نسخه‌های \fB59.6.0\fP، \fB44.1.1\fP و \fB50.3.2\fP \- توسط @gaborbernat \%\&. (#2548 \%) .UNINDENT .SS v20.21.1 (2023\-04\-19) .SS رفع باگ‌ها \- 20.21.1 .INDENT 0.0 .IP \(bu 2 افزودن \fBtox.ini\fP به sdist \- توسط @mtelka \%\&. (#2511 \%) .IP \(bu 2 تغییر نحوه استفاده از \(aqlet\(aq در nushell جهت اطمینان از سازگاری با نسخه‌های آتی nushell، جایی که دیگر فرض نمی‌شود مقداردهی اولیه \(aqlet\(aq یک عبارت کامل است. (#2527 \%) .IP \(bu 2 دستور \(aqstr collect\(aq در nushell با دستور \(aqstr join\(aq جایگزین شده است. اسکریپت activate.nu برای اعمال این تغییر به‌روزرسانی شد. (#2532 \%) .IP \(bu 2 ارتقای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 wheel از \fB0.38.4\fP به \fB0.40.0\fP .IP \(bu 2 setuptools از \fB67.4.0\fP به \fB67.6.1\fP .IP \(bu 2 pip از \fB23.0.1\fP به \fB23.1\fP (#2546 \%) .UNINDENT .UNINDENT .SS v20.21.0 (2023\-03\-12) .SS ویژگی‌ها \- 20.21.0 .INDENT 0.0 .IP \(bu 2 آغاز صریح ساختار دستوری closure با {||. (#2512 \%) .UNINDENT .SS رفع باگ‌ها \- 20.21.0 .INDENT 0.0 .IP \(bu 2 افزودن دستور \fBprint\fP به print_prompt در nushell جهت تضمین سازگاری با انتشار آینده nushell، جایی که دستورهای میانی دیگر خروجی خود را در stdout چاپ نمی‌کنند. (#2514 \%) .IP \(bu 2 عدم اتکا به کدگذاری پیش‌فرض. (#2515 \%) .IP \(bu 2 ایمن‌سازی \fBReentrantFileLock\fP در برابر نخ‌ها (thread\-safe) و در نتیجه، رفع شرایط رقابت در \fBvirtualenv.cli_run\fP \- توسط @radoering \%\&. (#2516 \%) .UNINDENT .SS v20.20.0 (2023\-02\-28) .SS ویژگی‌ها \- 20.20.0 .INDENT 0.0 .IP \(bu 2 تغییر بررسی وجود متغیر محیطی در اسکریپت فعال‌سازی Nushell به‌منظور عدم استفاده از دستور منسوخ‌شده. (#2506 \%) .UNINDENT .SS رفع باگ‌ها \- 20.20.0 .INDENT 0.0 .IP \(bu 2 شناسایی پیاده‌سازی‌های CPython توزیع‌شده در Windows توسط هر سازمانی \- توسط @faph \%\&. (#2504 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB67.1.0\fP به \fB67.4.0\fP و pip از \fB23.0\fP به \fB23.0.1\fP \- توسط @gaborbernat \%\&. (#2510 \%) .UNINDENT .SS v20.19.0 (2023\-02\-07) .SS ویژگی‌ها \- 20.19.0 .INDENT 0.0 .IP \(bu 2 پشتیبانی از نسخه \fB3\fP بسته platformdirs \- توسط @cdce8p \%\&. (#2499 \%) .UNINDENT .SS v20.18.0 (2023\-02\-06) .SS ویژگی‌ها \- 20.18.0 .INDENT 0.0 .IP \(bu 2 حذف پشتیبانی از محیط زمان اجرای \fB3.6\fP (همچنان امکان ساخت \fB2.7+\fP وجود دارد) \- توسط @gaborbernat \%\&. (#2489 \%) .UNINDENT.SS رفع باگ‌ها \- 20.18.0 .INDENT 0.0 .IP \(bu 2 رفع مشکل پرامپت در Nushell هنگام فعال‌سازی محیط مجازی \- توسط @kubouc \%\&. (#2481 \%) .IP \(bu 2 ارتقای pip تعبیه‌شده به \fB23.0\fP و setuptools به \fB67.1\fP \- توسط @gaborbernat \%\&. (#2489 \%) .UNINDENT .SS v20.17.1 (2022\-12\-05) .SS رفع باگ‌ها \- 20.17.1 .INDENT 0.0 .IP \(bu 2 مشخصه \fBpy\fP یا \fBpython\fP به معنای هر پایتونی است نه صرفاً \fBCPython\fP \- توسط @gaborbernat \%\&. (#2460 \%) .IP \(bu 2 رعایت \fBVIRTUAL_ENV_DISABLE_PROMPT\fP در \fBactivate.nu\fP و عدم تنظیم پرامپت در صورت درخواست \- توسط @m\-lima \%\&. (#2461 \%) .UNINDENT .SS v20.17.0 (2022\-11\-27) .SS قابلیت‌ها \- 20.17.0 .INDENT 0.0 .IP \(bu 2 تغییر اسکریپت فعال‌سازی Nushell به یک ماژول با هدف فعال‌سازی به عنوان overlay. (#2422 \%) .IP \(bu 2 به‌روزرسانی عملگر استفاده‌شده در اسکریپت فعال‌سازی Nushell جهت سازگاری با نسخه‌های آینده. (#2450 \%) .UNINDENT .SS رفع باگ‌ها \- 20.17.0 .INDENT 0.0 .IP \(bu 2 عدم استفاده از API منسوخ‌شده از \fBimportlib.resources\fP در پایتون ۳.۱۰ یا بالاتر \- توسط @gaborbernat \%\&. (#2448 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده به \fB65.6.3\fP از \fB65.5.1\fP \- توسط @gaborbernat \%\&. (#2451 \%) .UNINDENT .SS v20.16.7 (2022\-11\-12) .SS رفع باگ‌ها \- 20.16.7 .INDENT 0.0 .IP \(bu 2 استفاده از دایرکتوری والد فایل اجرایی پایتون برای مقدار \(dqhome\(dq در pyvenv.cfg طبق PEP 405 \- توسط @vfazio \%\&. (#2440 \%) .IP \(bu 2 در محیط‌های مجازی POSIX، آزمودن نام‌های باینری جایگزین در صورت عدم وجود \fBsys._base_executable\fP \- توسط @vfazio \%\&. (#2442 \%) .IP \(bu 2 ارتقای wheel تعبیه‌شده به \fB0.38.4\fP، و pip به \fB22.3.1\fP از \fB22.3\fP، و setuptools به \fB65.5.1\fP از \fB65.5.0\fP \- توسط @gaborbernat \%\&. (#2443 \%) .UNINDENT .SS v20.16.6 (2022\-10\-25) .SS قابلیت‌ها \- 20.16.6 .INDENT 0.0 .IP \(bu 2 حذف واسط‌های (shim) غیرضروری برای ساختار دایرکتوری PyPy3 (#2426 \%) .UNINDENT .SS رفع باگ‌ها \- 20.16.6 .INDENT 0.0 .IP \(bu 2 اصلاح طرحواره (scheme) انتخاب‌شده در مشتقات دبیان برای پایتون ۳.۱۰ زمانی که \fBpython3\-distutils\fP نصب نیست یا طرحواره \fBvenv\fP در دسترس نیست \- توسط @asottile \%\&. (#2350 \%) .IP \(bu 2 مجاز ساختن قبولی مجموعه آزمون‌ها حتی با C shell اصلی (به جای \fBtcsh\fP) \- توسط @kulikjak \%\&. (#2418 \%) .IP \(bu 2 اصلاح سازوکار جایگزین (fallback) برای دانلود wheelهای بسته‌های تجمیع‌شده \- توسط @schaap \%\&. (#2429 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده به \fB65.5.0\fP از \fB65.3.0\fP و pip به \fB22.3\fP از \fB22.2.2\fP \- توسط @gaborbernat \%\&. (#2434 \%) .UNINDENT .SS v20.16.5 (2022\-09\-07) .SS رفع باگ‌ها \- 20.16.5 .INDENT 0.0 .IP \(bu 2 عدم خاموش کردن echo برای دستورهای پسین در اسکریپت‌های فعال‌ساز دسته‌ای (\fBactivate.bat\fP و \fBdeactivate.bat\fP) \- توسط @pawelszramowski \%\&. (#2411 \%) .UNINDENT .SS v20.16.4 (2022\-08\-29) .SS رفع باگ‌ها \- 20.16.4 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools تعبیه‌شده به \fB65.3\fP \- توسط @gaborbernat \%\&. (#2405 \%) .UNINDENT .SS v20.16.3 (2022\-08\-04) .SS رفع باگ‌ها \- 20.16.3 .INDENT 0.0 .IP \(bu 2 ارتقای pip تعبیه‌شده به \fB22.2.2\fP از \fB22.2.1\fP و setuptools به \fB63.4.1\fP از \fB63.2.0\fP \- توسط @gaborbernat \%\&. (#2395 \%) .UNINDENT.SS v20.16.2 (2022\-07\-27) .SS رفع باگ‌ها \- 20.16.2 .INDENT 0.0 .IP \(bu 2 ارتقای pip جاسازی‌شده از \fB22.2\fP به \fB22.2.1\fP \- توسط @gaborbernat \%\&. (#2391 \%) .UNINDENT .SS v20.16.1 (2022\-07\-26) .SS ویژگی‌ها \- 20.16.1 .INDENT 0.0 .IP \(bu 2 به‌روزرسانی اسکریپت‌های فعال‌سازی Nushell به نسخهٔ 0.67 \- توسط @kubouch \%\&. (#2386 \%) .UNINDENT .SS v20.16.0 (2022\-07\-25) .SS ویژگی‌ها \- 20.16.0 .INDENT 0.0 .IP \(bu 2 حذف پشتیبانی از اجرا تحت Python 2 (همچنان امکان ساخت محیط‌های Python 2 وجود دارد) \- توسط @gaborbernat \%\&. (#2382 \%) .IP \(bu 2 ارتقای pip جاسازی‌شده به \fB22.2\fP از \fB22.1.2\fP و setuptools به \fB63.2.0\fP از \fB62.6.0\fP \- توسط @gaborbernat \%\&. (#2383 \%) .UNINDENT .SS v20.15.1 (2022\-06\-28) .SS رفع باگ‌ها \- 20.15.1 .INDENT 0.0 .IP \(bu 2 رفع عملکرد نادرست هنگامی که افزونه‌های \fBsetuptools\fP در \fBstdout\fP خروجی تولید می‌کنند\&. (#2335 \%) .IP \(bu 2 نادیده گرفتن دایرکتوری مفقود \fBDLLs\fP توسط سازندهٔ CPython3Windows\&. (#2368 \%) .UNINDENT .SS v20.15.0 (2022\-06\-25) .SS ویژگی‌ها \- 20.15.0 .INDENT 0.0 .IP \(bu 2 پشتیبانی از بستهٔ پایتون تعبیه‌پذیر در ویندوز (Windows embeddable Python package): گنجاندن \fBpython.zip\fP در منابع سازنده \- توسط @reksarka \%\&. (#1774 \%) .UNINDENT .SS رفع باگ‌ها \- 20.15.0 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools جاسازی‌شده به \fB62.3.3\fP از \fB62.6.0\fP و pip به \fB22.1.2\fP از \fB22.0.4\fP \- توسط @gaborbernat \%\&. (#2348 \%) .IP \(bu 2 استفاده از \fBshlex.quote\fP به‌جای تابع منسوخ‌شدهٔ \fBpipes.quote\fP در Python 3 \- توسط @frenzymadness \%\&. (#2351 \%) .IP \(bu 2 رفع مشکل Windows PyPy 3.6 \- توسط @reksarka \%\&. (#2363 \%) .UNINDENT .SS v20.14.1 (2022\-04\-11) .SS ویژگی‌ها \- 20.14.1 .INDENT 0.0 .IP \(bu 2 پشتیبانی از ایجاد یک محیط مجازی از چارچوب Python 2.7 در macOS 12 \- توسط @nickhutchinson \%\&. (#2284 \%) .UNINDENT .SS رفع باگ‌ها \- 20.14.1 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools جاسازی‌شده به \fB62.1.0\fP از \fB61.0.0\fP \- توسط @gaborbernat \%\&. (#2327 \%) .UNINDENT .SS v20.14.0 (2022\-03\-25) .SS ویژگی‌ها \- 20.14.0 .INDENT 0.0 .IP \(bu 2 پشتیبانی از اسکریپت‌های فعال‌سازی Nushell با نسخهٔ nu \fB0.60\fP \- توسط @kubouch \%\&. (#2321 \%) .UNINDENT .SS رفع باگ‌ها \- 20.14.0 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools جاسازی‌شده به \fB61.0.0\fP از \fB60.10.0\fP \- توسط @gaborbernat \%\&. (#2322 \%) .UNINDENT .SS v20.13.4 (2022\-03\-18) .SS رفع باگ‌ها \- 20.13.4 .INDENT 0.0 .IP \(bu 2 بهبود کارایی راه‌اندازی پایتون درون محیط‌های مجازی ایجادشده \- توسط @asottile \%\&. (#2317 \%) .IP \(bu 2 ارتقای setuptools جاسازی‌شده به \fB60.10.0\fP از \fB60.9.3\fP \- توسط @gaborbernat \%\&. (#2320 \%) .UNINDENT .SS v20.13.3 (2022\-03\-07) .SS رفع باگ‌ها \- 20.13.3 .INDENT 0.0 .IP \(bu 2 جلوگیری از ایجاد پیوند نمادین (symlink) از محتویات \fB/usr\fP به درون محیط‌های مجازی +PyPy3.8 \- توسط @stefanor \%\&. (#2310 \%) .IP \(bu 2 ارتقای pip جاسازی‌شده از \fB22.0.3\fP به \fB22.0.4\fP \- توسط @gaborbernat \%\&. (#2311 \%) .UNINDENT.SS v20.13.2 (2022\-02\-24) .SS رفع باگ‌ها \- 20.13.2 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB60.6.0\fP به \fB60.9.3\fP \- توسط @gaborbernat \%\&. (#2306 \%) .UNINDENT .SS v20.13.1 (2022\-02\-05) .SS رفع باگ‌ها \- 20.13.1 .INDENT 0.0 .IP \(bu 2 رفع خطای \(dqexecv() arg 2 must contain only strings\(dq روی M1 MacOS (#2282 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB60.2.0\fP به \fB60.5.0\fP \- توسط @asottile \%\&. (#2289 \%) .IP \(bu 2 ارتقای pip تعبیه‌شده به \fB22.0.3\fP و setuptools به \fB60.6.0\fP \- توسط @gaborbernat \% و @asottile \%\&. (#2294 \%) .UNINDENT .SS v20.13.0 (2022\-01\-02) .SS ویژگی‌ها \- 20.13.0 .INDENT 0.0 .IP \(bu 2 افزودن اطلاعات wheel دانلودشده به فایل JSON تعبیه‌شده مربوطه جهت جلوگیری از دانلود مجدد همان wheel. \- توسط @mayeut \%\&. (#2268 \%) .UNINDENT .SS رفع باگ‌ها \- 20.13.0 .INDENT 0.0 .IP \(bu 2 رفع خطای \fBAttributeError: \(aqbool\(aq object has no attribute \(aqerror\(aq\fP هنگام ایجاد یک virtualenv پایتون 2.x روی macOS \- توسط \fBmoreati\fP\&. (#2269 \%) .IP \(bu 2 رفع خطای \fBPermissionError: [Errno 1] Operation not permitted\fP هنگام ایجاد یک virtualenv پایتون 2.x روی macOS/arm64 \- توسط \fBmoreati\fP\&. (#2271 \%) .UNINDENT .SS v20.12.1 (2022\-01\-01) .SS رفع باگ‌ها \- 20.12.1 .INDENT 0.0 .IP \(bu 2 تلاش برای استفاده از به‌روزرسانی‌های قبلی \fBpip\fP، \fBsetuptools\fP و \fBwheel\fP در طول دوره فرجه به‌روزرسانی به جای بازگشت همیشگی به wheelهای تعبیه‌شده \- توسط @mayeut \%\&. (#2265 \%) .IP \(bu 2 نسخه‌های وصله‌ای جدید \fBpip\fP، \fBsetuptools\fP و \fBwheel\fP اکنون در بازه زمانی مورد انتظار بازگردانده می‌شوند. \- توسط @mayeut \%\&. (#2266 \%) .IP \(bu 2 ارتقاهای دستی \fBpip\fP، \fBsetuptools\fP و \fBwheel\fP در اثر به‌روزرسانی‌های دوره‌ای نادیده گرفته نمی‌شوند \- توسط @mayeut \%\&. (#2267 \%) .UNINDENT .SS v20.12.0 (2021\-12\-31) .SS ویژگی‌ها \- 20.12.0 .INDENT 0.0 .IP \(bu 2 امضای فایل اجرایی python2 روی Darwin arm64 \- توسط @tmspicer \%\&. (#2233 \%) .UNINDENT .SS رفع باگ‌ها \- 20.12.0 .INDENT 0.0 .IP \(bu 2 رفع اشکال گزینه \fB\-\-download\fP \- توسط @mayeut \%\&. (#2120 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB60.1.1\fP به \fB60.2.0\fP \- توسط @gaborbernat \%\&. (#2263 \%) .UNINDENT .SS v20.11.2 (2021\-12\-29) .SS رفع باگ‌ها \- 20.11.2 .INDENT 0.0 .IP \(bu 2 رفع مشکل نصب نسخه‌های تثبیت‌شده (pinned) از \fBpip\fP، \fBsetuptools\fP و \fBwheel\fP \- توسط @mayeut \%\&. (#2203 \%) .UNINDENT .SS v20.11.1 (2021\-12\-29) .SS رفع باگ‌ها \- 20.11.1 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB60.1.0\fP به \fB60.1.1\fP \- توسط @gaborbernat \%\&. (#2258 \%) .UNINDENT .SS v20.11.0 (2021\-12\-28) .SS ویژگی‌ها \- 20.11.0 .INDENT 0.0 .IP \(bu 2 جلوگیری از هشدار منسوخ‌شدگی ناشی از آرگومان py\-filelock \- توسط @ofek \%\&. (#2237 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB58.3.0\fP به \fB61.1.0\fP \- توسط @gaborbernat \%\&. (#2240 \%) .IP \(bu 2 حذف وابستگی زمان اجرای \fBbackports.entry\-points\-selectable\fP \- توسط @hroncok \%\&. (#2246 \%) .IP \(bu 2 پوسته Fish: متغیرهای PATH هنگام مقداردهی نباید داخل گیومه قرار گیرند \- توسط @d3dave \%\&. (#2248 \%) .UNINDENT.SS v20.10.0 (2021\-11\-01) .SS ویژگی‌ها \- 20.10.0 .INDENT 0.0 .IP \(bu 2 اگر یک طرح نصب \fB\(dqvenv\(dq\fP در \fBsysconfig\fP وجود داشته باشد، virtualenv اکنون از آن برای ایجاد محیط‌های مجازی جدید استفاده می‌کند. این به توزیع‌کنندگان Python، مانند Fedora، اجازه می‌دهد تا طرح نصب پیش‌فرض را بدون تأثیر بر مسیرها در محیط‌های مجازی جدید وصله/جایگزین کنند. روش مشابهی برای Python و ماژول venv پیشنهاد شده بود \% \- توسط \fBhroncok\fP (#2208 \%) .IP \(bu 2 اعلان (پرامپت) فعال‌شدهٔ virtualenv اکنون همیشه در پرانتز قرار می‌گیرد. این امر بر محیط‌های مجازی ایجادشده با مشخصهٔ \fB\-\-prompt\fP تأثیر می‌گذارد و رفتار virtualenv را با venv همگام و هم‌تراز می‌کند. (#2224 \%) .UNINDENT .SS رفع باگ‌ها \- 20.10.0 .INDENT 0.0 .IP \(bu 2 رفع پرامپت خراب تنظیم‌شده توسط activate.bat \- توسط @SiggyBar \%\&. (#2225 \%) .UNINDENT .SS v20.9.0 (2021\-10\-23) .SS ویژگی‌ها \- 20.9.0 .INDENT 0.0 .IP \(bu 2 در نظر گرفتن حالت خاص برای \fB\-\-prompt .\fP با تبدیل آن به نام دایرکتوری جاری \- توسط @rkm \%\&. (#2220 \%) .IP \(bu 2 افزودن libffi\-8.dll به نسخهٔ ویندوز pypy #2218 \% \- توسط @mattip \% .UNINDENT .SS رفع باگ‌ها \- 20.9.0 .INDENT 0.0 .IP \(bu 2 رفع تداخل مسیر که هنگام استفاده از PyPy3.8 می‌توانست منجر به PermissionError یا نوشتن در دایرکتوری‌های سیستمی شود \- توسط @mgorny \%\&. (#2182 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB58.1.0\fP به \fB58.3.0\fP و pip از \fB21.2.4\fP به \fB21.3.1\fP \- توسط @gaborbernat \%\&. (#2205 \%) .IP \(bu 2 حذف پرانتز بسته اضافی در activate.bat \- توسط @SiggyBar \%\&. (#2221 \%) .UNINDENT .SS v20.8.1 (2021\-09\-24) .SS رفع باگ‌ها \- 20.8.1 .INDENT 0.0 .IP \(bu 2 رفع باگی که در آن هنگام ایجاد یک venv بر روی یک نسخهٔ موجود، بدون پاک‌سازی، در صورت عدم تطابق نسخهٔ wheel مقدماتی (seeded)، ممکن بود چندین دایرکتوری \fB\&.dist\-info\fP وجود داشته باشد که کشف نقطه ورود (entrypoint) را مختل می‌کرد \- توسط @arcivanov \% (#2185 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB58.0.4\fP به \fB58.1.0\fP \- توسط @gaborbernat \%\&. (#2195 \%) .UNINDENT .SS متفرقه \- 20.8.1 .INDENT 0.0 .IP \(bu 2 #2189 \% .UNINDENT .SS v20.8.0 (2021\-09\-16) .INDENT 0.0 .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB57.4.0\fP به \fB58.0.4\fP و pip از \fB21.2.3\fP به \fB21.2.4\fP .IP \(bu 2 افزودن اسکریپت فعال‌سازی برای nushell .UNINDENT .SS v20.7.2 (2021\-08\-10) .SS رفع باگ‌ها \- 20.7.2 .INDENT 0.0 .IP \(bu 2 ارتقای pip تعبیه‌شده از \fB21.2.2\fP به \fB21.2.3\fP و wheel از \fB0.36.2\fP به \fB0.37.0\fP \- توسط @gaborbernat \%\&. (#2168 \%) .UNINDENT .SS v20.7.1 (2021\-08\-09) .SS رفع باگ‌ها \- 20.7.1 .INDENT 0.0 .IP \(bu 2 رفع مشکل باز کردن آیتم‌های دیکشنری در PythonInfo.install_path (#2165 \%) .UNINDENT .SS v20.7.0 (2021\-07\-31) .SS رفع باگ‌ها \- 20.7.0 .INDENT 0.0 .IP \(bu 2 ارتقای pip تعبیه‌شده از \fB21.1.3\fP به \fB21.2.2\fP و setuptools از \fB57.1.0\fP به \fB57.4.0\fP \- توسط @gaborbernat \% (#2159 \%) .UNINDENT .SS موارد منسوخ و حذف‌شده \- 20.7.0 .INDENT 0.0 .IP \(bu 2 حذف فعال‌کنندهٔ (activator) \fBxonsh\fP به دلیل خرابی مکرر در CI و عدم پشتیبانی از سوی نگه‌دارندگان این بسته‌ها؛ به بالادست توصیه می‌شود پشتیبانی از پروژه را به صورت یک پلاگین ادامه دهد \% \- توسط @gaborbernat \%\&. (#2160 \%) .UNINDENT.SS v20.6.0 (2021\-07\-14) .SS ویژگی‌ها \- 20.6.0 .INDENT 0.0 .IP \(bu 2 پشتیبانی از مفسرهای Python بدون \fBdistutils\fP (در این موارد به عنوان جایگزین از \fBsyconfig\fP استفاده می‌شود) \- توسط @gaborbernat \%\&. (#1910 \%) .UNINDENT .SS v20.5.0 (2021\-07\-13) .SS ویژگی‌ها \- 20.5.0 .INDENT 0.0 .IP \(bu 2 افزونه‌ها اکنون از نقاط ورود \(aqselectable\(aq استفاده می‌کنند \- توسط @jaraco \%\&. (#2093 \%) .IP \(bu 2 افزودن libffi\-7.dll به فهرست ثابت dllها برای PyPy (#2141 \%) .IP \(bu 2 استفاده از \fBplatformdirs\fP با نگهداری بهتر به‌جای \fBappdirs\fP \- توسط @gaborbernat \%\&. (#2142 \%) .UNINDENT .SS رفع باگ‌ها \- 20.5.0 .INDENT 0.0 .IP \(bu 2 ارتقای pip توکار به \fB21.1.3\fP و setuptools به \fB57.1.0\fP \- توسط @gaborbernat \%\&. (#2135 \%) .UNINDENT .SS موارد منسوخ و حذف‌شده \- 20.5.0 .INDENT 0.0 .IP \(bu 2 حذف پشتیبانی از python \fB3.4\fP به دلیل گذشت بیش از ۲ سال از EOL \- توسط @gaborbernat \%\&. (#2141 \%) .UNINDENT .SS v20.4.7 (2021\-05\-24) .SS رفع باگ‌ها \- 20.4.7 .INDENT 0.0 .IP \(bu 2 ارتقای pip توکار به \fB21.1.2\fP و setuptools به \fB57.0.0\fP \- توسط @gaborbernat \%\&. (#2123 \%) .UNINDENT .SS v20.4.6 (2021\-05\-05) .SS رفع باگ‌ها \- 20.4.6 .INDENT 0.0 .IP \(bu 2 رفع خرابی \fBsite.getsitepackages()\fP در python2 روی debian \- توسط @freundTech \%\&. (#2105 \%) .UNINDENT .SS v20.4.5 (2021\-05\-05) .SS رفع باگ‌ها \- 20.4.5 .INDENT 0.0 .IP \(bu 2 ارتقای pip به \fB21.1.1\fP از \fB21.0.1\fP \- توسط @gaborbernat \%\&. (#2104 \%) .IP \(bu 2 رفع نادیده‌گرفتن \fB\-\-system\-site\-packages\fP توسط \fBsite.getsitepackages()\fP در python2 \- توسط @freundTech \%\&. (#2106 \%) .UNINDENT .SS v20.4.4 (2021\-04\-20) .SS رفع باگ‌ها \- 20.4.4 .INDENT 0.0 .IP \(bu 2 کلاس discovery توکار همواره بر کلاس‌های ارائه‌شده توسط افزونه‌ها ترجیح داده می‌شود. (#2087 \%) .IP \(bu 2 ارتقای setuptools توکار به \fB56.0.0\fP توسط @gaborbernat \%\&. (#2094 \%) .UNINDENT .SS v20.4.3 (2021\-03\-16) .SS رفع باگ‌ها \- 20.4.3 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools توکار از \fB52.0.0\fP به \fB54.1.2\fP \- توسط @gaborbernat \% (#2069 \%) .IP \(bu 2 رفع نادرست‌بودن stdlib برای PyPy3 روی Windows \- توسط @gaborbernat \%\&. (#2071 \%) .UNINDENT .SS v20.4.2 (2021\-02\-01) .SS رفع باگ‌ها \- 20.4.2 .INDENT 0.0 .IP \(bu 2 رفع مشکل از کار افتادن هنگام اجرای virtualenv با \fB\-\-upgrade\-embed\-wheels\fP \- توسط @gaborbernat \%\&. (#2058 \%) .UNINDENT .SS v20.4.1 (2021\-01\-31) .SS رفع باگ‌ها \- 20.4.1 .INDENT 0.0 .IP \(bu 2 ارتقای بسته‌های توکار pip و setuptools به آخرین نسخه‌های پشتیبانی‌شده در بالادست (\fB21.0.1\fP و \fB52.0.0\fP) \- توسط @gaborbernat \%\&. (#2060 \%) .UNINDENT .SS v20.4.0 (2021\-01\-19) .SS ویژگی‌ها \- 20.4.0 .INDENT 0.0 .IP \(bu 2 امکان ارسال دیکشنری متغیرهای محیطی برای استفاده در API برنامه‌نویسی، با مقدار پیش‌فرض \fBos.environ\fP در صورت عدم تعیین \- توسط @gaborbernat \%\&. (#2054 \%) .UNINDENT.SS رفع باگ‌ها \- 20.4.0 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools تعبیه‌شده به \fB51.3.3\fP از \fB51.1.2\fP \- توسط @gaborbernat \%\&. (#2055 \%) .UNINDENT .SS v20.3.1 (2021\-01\-13) .SS رفع باگ‌ها \- 20.3.1 .INDENT 0.0 .IP \(bu 2 ارتقای pip تعبیه‌شده به \fB20.3.3\fP، setuptools به \fB51.1.1\fP و wheel به \fB0.36.2\fP \- توسط @gaborbernat \%\&. (#2036 \%) .IP \(bu 2 اجازه دادن به شکست بدون خطای لغو تعریف تابع (unfunctioning) برای pydoc تا virtualenvها بتوانند تحت Zsh با set \-e فعال شوند (زیرا در غیر این صورت، چنانچه تابع در Zsh وجود نداشته باشد، دستورات \fBunset \-f\fP و \fBunfunction\fP با کد ۱ خارج می‌شوند) \- توسط @d125q \%\&. (#2049 \%) .IP \(bu 2 دور ریختن اطلاعات کش‌شدهٔ python در صورتی که فایل اجرایی سیستم دیگر وجود نداشته باشد (برای مثال زمانی که فایل اجرایی یک shim است و فایل اجرایی نگاشت‌شده جایگزین شده باشد \- مانند موردی که در pyenv رخ می‌دهد) \- توسط @gaborbernat \%\&. (#2050 \%) .UNINDENT .SS v20.3.0 (2021\-01\-10) .SS ویژگی‌ها \- 20.3.0 .INDENT 0.0 .IP \(bu 2 سازوکار شناسایی توکار اکنون یک آرگومان \fB\-\-try\-first\-with\fP می‌پذیرد و ابتدا این موارد به عنوان مفسرهای معتبر آزموده می‌شوند. می‌توان از این گزینه برای تحمیل شناسایی یک فایل اجرایی مشخص python در مواقعی که ترتیب یا سازوکار شناسایی با خطا مواجه می‌شود استفاده کرد \- توسط @gaborbernat \%\&. (#2046 \%) .UNINDENT .SS رفع باگ‌ها \- 20.3.0 .INDENT 0.0 .IP \(bu 2 در توزیع‌های python \fB3.7+\fP در ویندوز که در آن‌ها shim فایل exe وجود ندارد، بازگشت به روش‌های قدیمی صورت می‌گیرد \- توسط @gaborbernat \%\&. (#1986 \%) .IP \(bu 2 هنگام شناسایی مفسرها در ویندوز از طریق PEP\-514، انتشار‌های \fBPythonCore\fP نسبت به سایر موارد ترجیح داده می‌شوند. virtualenv بیشتر از طریق pip با این توزیع به کار می‌رود، بنابراین نسبت به سایرین مانند conda در اولویت قرار می‌گیرد \- توسط @gaborbernat \%\&. (#2046 \%) .UNINDENT .SS v20.2.2 (2020\-12\-07) .SS رفع باگ‌ها \- 20.2.2 .INDENT 0.0 .IP \(bu 2 ارتقای pip به \fB20.3.1\fP، setuptools به \fB51.0.0\fP و wheel به \fB0.36.1\fP \- توسط @gaborbernat \%\&. (#2029 \%) .UNINDENT .SS v20.2.1 (2020\-11\-23) .sp تغییرات چشمگیری وجود ندارد. .SS v20.2.0 (2020\-11\-21) .SS ویژگی‌ها \- 20.2.0 .INDENT 0.0 .IP \(bu 2 امکان چشم‌پوشی اختیاری از دستور ignore مربوط به VCS برای کل دایرکتوری virtualenv، با استفاده از گزینهٔ \fBno\-vcs\-ignore\fP \%<#\:no-vcs-ignore>، که به‌طور پیش‌فرض \fBFalse\fP است\&. (#2003 \%) .IP \(bu 2 افزودن گزینهٔ \fB\-\-read\-only\-app\-data\fP جهت اجازه برای ساخت بر پایهٔ یک کش موجود از app data که غیرقابل نوشتن است. این مورد ممکن است (برای مثال) جهت تولید یک ایمیج docker که در آن app\-data از پیش پر شده است، مفید باشد. .INDENT 2.0 .INDENT 3.5 .sp .EX ENV \e VIRTUALENV_OVERRIDE_APP_DATA=/opt/virtualenv/cache \e VIRTUALENV_SYMLINK_APP_DATA=1 RUN virtualenv venv && rm \-rf venv ENV VIRTUALENV_READ_ONLY_APP_DATA=1 USER nobody # this virtualenv has symlinks into the read\-only app\-data cache RUN virtualenv /tmp/venv .EE .UNINDENT .UNINDENT .sp پچ از @asottile \%\&. (#2009 \%) .UNINDENT .SS رفع باگ‌ها \- 20.2.0 .INDENT 0.0 .IP \(bu 2 اصلاح پردازش متغیر محیطی \fBVIRTUALENV_PYTHON\fP و چندمقداری کردن آن (جداشده با کاما) \- توسط @pneff \%\&. (#1998 \%) .UNINDENT .SS v20.1.0 (2020\-10\-25) .SS ویژگی‌ها \- 20.1.0 .INDENT 0.0 .IP \(bu 2 مشخصهٔ python اکنون می‌تواند یک یا چند مقدار بپذیرد؛ نخستین مورد یافت‌شده برای ساخت محیط مجازی استفاده می‌شود \- توسط @gaborbernat \%\&. (#1995 \%) .UNINDENT.SS v20.0.35 (2020\-10\-15) .SS رفع باگ‌ها \- 20.0.35 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB50.3.0\fP به \fB50.3.1\fP \- توسط @gaborbernat \%\&. (#1982 \%) .IP \(bu 2 پس از وارد کردن virtualenv، ارسال cwd به فراخوانی‌های subprocess با خطای \fBinvalid directory\fP متوقف می‌شد \- توسط @gaborbernat \%\&. (#1983 \%) .UNINDENT .SS v20.0.34 (2020\-10\-12) .SS رفع باگ‌ها \- 20.0.34 .INDENT 0.0 .IP \(bu 2 هماهنگ‌سازی با ماژول venv هنگام ایجاد محیط‌های مجازی با سازنده توکار در ویندوز پایتون ۳.۷ و بالاتر \- توسط @gaborbernat \%\&. (#1782 \%) .IP \(bu 2 مدیریت تبدیل مسیر Cygwin در اسکریپت فعال‌سازی \- توسط @davidcoghlan \%\&. (#1969 \%) .UNINDENT .SS v20.0.33 (2020\-10\-04) .SS رفع باگ‌ها \- 20.0.33 .INDENT 0.0 .IP \(bu 2 رفع خطای نوع \fBNone\fP در cygwin در صورت وجود مسیر POSIX در dest \- توسط @danyeaw \%\&. (#1962 \%) .IP \(bu 2 رفع ناسازگاری‌های Python 3.4 (افزوده شدن مجدد به CI) \- توسط @gaborbernat \%\&. (#1963 \%) .UNINDENT .SS v20.0.32 (2020\-10\-01) .SS رفع باگ‌ها \- 20.0.32 .INDENT 0.0 .IP \(bu 2 استفاده همیشگی از پایانه‌های خط UNIX برای اسکریپت‌های فعال‌سازی (مگر مواردی که مربوط به شل BATCH باشند) \- توسط @saytosid \%\&. (#1818 \%) .IP \(bu 2 ارتقای pip تعبیه‌شده به \fB20.2.1\fP و setuptools به \fB49.4.0\fP \- توسط @gaborbernat \%\&. (#1918 \%) .IP \(bu 2 جلوگیری از باز شدن پنجره‌های جدید هنگام ارتقای بسته‌های seed در پس‌زمینه در Windows \- توسط @gaborbernat \%\&. (#1928 \%) .IP \(bu 2 رفع باگی که در آن خواندن و نوشتن روی یک فایل یکسان ممکن بود باعث شرایط رقابتی (race condition) بین چندین فرآیند شود. (#1938 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده به \fB50.2.0\fP و pip به \fB20.2.3\fP \- توسط @gaborbernat \%\&. (#1939 \%) .IP \(bu 2 ارائه مسیر صحیح برای فعال‌ساز bash در cygwin یا msys2 \- توسط @danyeaw \%\&. (#1940 \%) .IP \(bu 2 تسهیل پیش‌نیاز importlib برای مجاز کردن version<3 \- توسط @usamasadiq \% (#1953 \%) .IP \(bu 2 عدم پردازش فایل‌های pth روی CPython2 در صورتی که $PYTHONPATH به site\-packages/ اشاره می‌کرد \- توسط @navytux \%\&. (#1959 \%) (#1960 \%) .UNINDENT .SS v20.0.31 (2020\-08\-17) .SS رفع باگ‌ها \- 20.0.31 .INDENT 0.0 .IP \(bu 2 ارتقای pip تعبیه‌شده به \fB20.2.1\fP، setuptools به \fB49.6.0\fP و wheel به \fB0.35.1\fP \- توسط @gaborbernat \%\&. (#1918 \%) .UNINDENT .SS v20.0.30 (2020\-08\-04) .SS رفع باگ‌ها \- 20.0.30 .INDENT 0.0 .IP \(bu 2 ارتقای pip به \fB20.2.1\fP و setuptools به \fB49.2.1\fP \- توسط @gaborbernat \%\&. (#1915 \%) .UNINDENT .SS v20.0.29 (2020\-07\-31) .SS رفع باگ‌ها \- 20.0.29 .INDENT 0.0 .IP \(bu 2 ارتقای pip تعبیه‌شده از نسخه \fB20.1.2\fP به \fB20.2\fP \- توسط @gaborbernat \%\&. (#1909 \%) .UNINDENT .SS v20.0.28 (2020\-07\-24) .SS رفع باگ‌ها \- 20.0.28 .INDENT 0.0 .IP \(bu 2 رفع مشکل شکست مجموعه‌آزمون در صورت اجرا از طریق Python سیستمی \- توسط @gaborbernat \%\&. (#1882 \%) .IP \(bu 2 ارائه پرچم \fBsetup_logging\fP به API پایتون تا در صورتی که برنامه کاربران از پیش این کار را انجام می‌دهد، بتوانند از مدیریت لاگ‌گیری گذر کنند \- توسط @gaborbernat \%\&. (#1896 \%) .IP \(bu 2 استفاده از \fB\en\fP به جای \fB\er\en\fP به عنوان جداکننده خط برای گزارش (زیرا Python این تبدیل را به طور خودکار هنگام نوشتن در پایپ لاگ‌گیری انجام می‌دهد) \- توسط @gaborbernat \%\&. (#1905 \%) .UNINDENT .SS v20.0.27 (2020\-07\-15) .SS رفع باگ‌ها \- 20.0.27 .INDENT 0.0 .IP \(bu 2 عدم درون‌ریزی پیشاپیش (preimport) ماژول threading برای رفع مشکل پشتیبانی از gpython \% و gevent \% \- توسط @navytux \%\&. (#1897 \%) .IP \(bu 2 ارتقای setuptools از \fB49.2.0\fP در \fBPython 3.5+\fP \- توسط @gaborbernat \%\&. (#1898 \%) .UNINDENT.SS v20.0.26 (2020\-07\-07) .SS رفع باگ‌ها \- 20.0.26 .INDENT 0.0 .IP \(bu 2 ارتقای وابستگی به \fBdistutils >= 0.3.1\fP \- توسط @gaborbernat \%\&. (#1880 \%) .IP \(bu 2 بهبود مدیریت به‌روزرسانی دوره‌ای: .INDENT 2.0 .IP \(bu 2 خروجی گزارش‌گیری بهتر هنگام اجرا و فعال‌سازی گزارش‌گیری در فراخوانی فرایند پس‌زمینه (از \fB_VIRTUALENV_PERIODIC_UPDATE_INLINE\fP می‌توان برای اشکال‌زدایی درون‌خطی رفتار استفاده کرد) .IP \(bu 2 استفاده از بافت تاییدنشده (unverified context) به‌عنوان جایگزین هنگام استعلام تاریخ انتشار از PyPi، .IP \(bu 2 توقف بارگیری wheelها به محض رسیدن به نسخه تعبیه‌شده، .UNINDENT .sp توسط @gaborbernat \%\&. (#1883 \%) .IP \(bu 2 عدم چاپ پیام خطا در صورتی که برنامه با \fBSystemExit(0)\fP خارج شود \- توسط @gaborbernat \%\&. (#1885 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB47.3.1\fP به \fB49.1.0\fP برای Python \fB3.5+\fP \- توسط @gaborbernat \%\&. (#1887 \%) .UNINDENT .SS v20.0.25 (2020\-06\-23) .SS رفع باگ‌ها \- 20.0.25 .INDENT 0.0 .IP \(bu 2 رفع مشکلی که در آن هنگام شکست در ایجاد تصویر بذرپاش‌های \fBapp\-data\fP، استثنا در سکوت نادیده گرفته می‌شد. جلوگیری از تداخل فرایندهای ایجاد دو محیط مجازی با یکدیگر با استفاده از قفل هنگام ایجاد تصاویر پایه. توسط @gaborbernat \%\&. (#1869 \%) .UNINDENT .SS v20.0.24 (2020\-06\-22) .SS قابلیت‌ها \- 20.0.24 .INDENT 0.0 .IP \(bu 2 اطمینان از اینکه بسته‌های بذرپاشی‌شده بیش از حد قدیمی نشوند: .INDENT 2.0 .IP \(bu 2 افزودن پرچم خط فرمان برای شروع ارتقای wheelهای تعبیه‌شده تحت \fBupgrade\-embed\-wheels\fP \%<#\:upgrade-embed-wheels> .IP \(bu 2 ارتقای دوره‌ای (هر ۱۴ روز یک‌بار) wheelهای تعبیه‌شده در فرایندی در پس‌زمینه، و استفاده از آن‌ها در صورتی که بیش از ۲۸ روز از انتشارشان گذشته باشد (از طریق \fBno\-periodic\-update\fP \%<#\:no-periodic-update> قابل غیرفعال‌سازی است) .UNINDENT .sp جزئیات بیشتر در Wheel acquisition \%<#\:wheels> \- توسط @gaborbernat \%\&. (#1821 \%) .IP \(bu 2 ارتقای محتوای wheelهای تعبیه‌شده: .INDENT 2.0 .IP \(bu 2 ارائه بسته‌های wheel برای Python \fB3.9\fP و \fB3.10\fP .IP \(bu 2 ارتقای setuptools برای Python \fB3.5+\fP از \fB47.1.1\fP به \fB47.3.1\fP .UNINDENT .sp توسط @gaborbernat \%\&. (#1841 \%) .IP \(bu 2 نمایش نسخه‌های بسته‌های بذر (seed) نصب‌شده در خروجی نهایی خلاصه، به عنوان مثال: .INDENT 2.0 .INDENT 3.5 .sp .EX created virtual environment CPython3.8.3.final.0\-64 in 350ms creator CPython3Posix(dest=/x, clear=True, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/y/virtualenv) added seed packages: pip==20.1.1, setuptools==47.3.1, wheel==0.34.2 .EE .UNINDENT .UNINDENT .sp توسط @gaborbernat \%\&. (#1864 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.24 .INDENT 0.0 .IP \(bu 2 عدم ایجاد یا بازنویسی \fB\&.gitignore\fP در صورتی که در مسیر مقصد از قبل وجود داشته باشد \- توسط @gaborbernat \%\&. (#1862 \%) .IP \(bu 2 بهبود پیام خطا هنگام عدم وجود \fB\&.dist\-info\fP درون بذرپاش کپی \fBapp\-data\fP \- توسط @gaborbernat \%\&. (#1867 \%) .UNINDENT .SS بهبود مستندات \- 20.0.24 .INDENT 0.0 .IP \(bu 2 نحوه شناسایی (و به‌روز نگه‌داشتن خودکار) بسته‌های wheel توسط سازوکارهای بذرپاشی در Wheel acquisition \%<#\:wheels> \- توسط @gaborbernat \%\&. (#1821 \%) .IP \(bu 2 نحوه مدیریت ارائه بسته‌های wheel تعبیه‌شده اختصاصی توسط توزیع‌ها در Distribution maintainer patching \%<#\:distribution-wheels> \- توسط @gaborbernat \%\&. (#1840 \%) .UNINDENT.SS v20.0.23 (2020\-06\-12) .SS رفع باگ‌ها \- 20.0.23 .INDENT 0.0 .IP \(bu 2 رفع غلط املایی در \fBsetup.cfg\fP \- توسط @RowdyHowell \%\&. (#1857 \%) .UNINDENT .SS v20.0.22 (2020\-06\-12) .SS رفع باگ‌ها \- 20.0.22 .INDENT 0.0 .IP \(bu 2 کاهش محدودیت پیش‌نیاز \fBimportlib.resources\fP برای مجاز کردن نسخهٔ ۲ نیز \- توسط @asottile \%\&. (#1846 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده به \fB44.1.1\fP برای python 2 و به \fB47.1.1\fP برای python3.5+ \- توسط @gaborbernat \%\&. (#1855 \%) .UNINDENT .SS v20.0.21 (2020\-05\-20) .SS ویژگی‌ها \- 20.0.21 .INDENT 0.0 .IP \(bu 2 تولید فایل ignore برای سامانه‌های کنترل نسخه جهت جلوگیری از ردیابی پیش‌فرض محیط‌های مجازی. در صورتی که کاربران همچنان مایل به ردیابی هستند باید این فایل‌ها را حذف کنند. در حال حاضر ما تنها از \fBgit\fP پشتیبانی می‌کنیم \- توسط @gaborbernat \%\&. (#1806 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.21 .INDENT 0.0 .IP \(bu 2 رفع خطای virtualenv در برخی مواقع هنگام اجرای هم‌روند؛ تداخل پرچم \fB\-\-clear\-app\-data\fP با پرچم \fBclear\fP \%<#\:clear> در صورت فعال بودن خلاصه‌سازی پرچم‌ها. برای دور زدن این مشکل در حین مجاز شمردن پرچم‌های خلاصه‌شده در خط فرمان، مجبور شدیم آن را به \fBreset\-app\-data\fP \%<#\:reset-app-data> تغییر دهیم \- توسط @gaborbernat \%\&. (#1824 \%) .IP \(bu 2 ارتقای \fBsetuptools\fP تعبیه‌شده به \fB46.4.0\fP از \fB46.1.3\fP در Python \fB3.5+\fP، و \fBpip\fP از \fB20.1\fP به \fB20.1.1\fP \- توسط @gaborbernat \%\&. (#1827 \%) .IP \(bu 2 اکنون seeder pip گزینهٔ \fB\-\-extra\-search\-dir\fP را به‌درستی مدیریت می‌کند \- توسط @frenzymadness \%\&. (#1834 \%) .UNINDENT .SS v20.0.20 (2020\-05\-04) .SS رفع باگ‌ها \- 20.0.20 .INDENT 0.0 .IP \(bu 2 رفع شکست دانلود با python 3.4 \- توسط @gaborbernat \%\&. (#1809 \%) .IP \(bu 2 رفع مشکل استفادهٔ نسخه‌های قدیمی‌تر CPython2 از \fB_get_makefile_filename\fP به جای \fBget_makefile_filename\fP در \fBsysconfig\fP \- توسط @ianw \%\&. (#1810 \%) .IP \(bu 2 رفع مشکل \fBTrue\fP بودن download به‌طور پیش‌فرض \- توسط @gaborbernat \%\&. (#1813 \%) .IP \(bu 2 شکست عملیات seed در \fBapp\-data\fP در صورت ناموفق بودن دانلود wheel و ارائهٔ پیام خطای بهتر \- توسط @gaborbernat \%\&. (#1814 \%) .UNINDENT .SS v20.0.19 (2020\-05\-03) .SS رفع باگ‌ها \- 20.0.19 .INDENT 0.0 .IP \(bu 2 رفع مشکلی که در آن ایجاد یک محیط Python 2 از طریق Python 3 باعث ایجاد فعال‌ساز (activator) نامعتبر python می‌شد \- توسط @gaborbernat \%\&. (#1776 \%) .IP \(bu 2 رفع خطای ایجادشدهٔ \fBInvalid Requirement\fP هنگام پین کردن بسته‌های seed از طریق seeder بستر \fBapp\-data\fP \- توسط @gaborbernat \%\&. (#1779 \%) .IP \(bu 2 متوقف نکردن فرایند کشف مفسر (interpreter discovery) در صورت عدم موفقیت در یافتن مفسر سیستم برای یک فایل اجرایی در طول فرایند کشف \- توسط @gaborbernat \%\&. (#1781 \%) .IP \(bu 2 در پلتفرم‌های POSIX مربوط به CPython2 اطمینان حاصل شود که \fBsyconfig.get_makefile_filename\fP در داخل محیط مجازی وجود دارد (این مورد توسط برخی کتابخانه‌های مبتنی بر افزونه‌های C \- مانند numpy \- برای ساخت استفاده می‌شود) \- توسط @gaborbernat \%\&. (#1783 \%) .IP \(bu 2 مدیریت بهتر گزینه‌های \fBcopies\fP \%<#\:copies> و \fBsymlinks\fP \%<#\:symlinks>\&. معرفی اولویت‌بندی برای محل تنظیم گزینه بر اساس این ترتیب: CLI، متغیر محیطی، فایل، هاردکدشده. اگر هر دو در یک سطح تنظیم شوند، نسخهٔ رونوشت (copy) بر پیوند نمادین (symlink) ارجحیت دارد \- توسط @gaborbernat \%\&. (#1784 \%) .IP \(bu 2 ارتقای pip برای Python \fB2.7\fP و \fB3.5+\fP از \fB20.0.2\fP به \fB20.1\fP \- توسط @gaborbernat \%\&. (#1793 \%) .IP \(bu 2 رفع عدم شناسایی CPython از طریق رجیستری Windows، و کشف مفسرهای python از رجیستری Windows به ترتیب نزولی نسخه \- توسط @gaborbernat \%\&. (#1796 \%) .IP \(bu 2 رفع مشکل شناسایی symlink برای سازنده‌ها (creators) \- توسط @asottile \% (#1803 \%) .UNINDENT .SS v20.0.18 (2020\-04\-16) .SS رفع باگ‌ها \- 20.0.18 .INDENT 0.0 .IP \(bu 2 وارد کردن (import) setuptools پیش از cli_run می‌توانست به دلیل وصله‌زدن \fBdistutils.dist.Distribution\fP توسط setuptools باعث شکست استعلام اطلاعات python شود \- توسط @gaborbernat \%\&. (#1771 \%) .UNINDENT .SS v20.0.17 (2020\-04\-09) .SS ویژگی‌ها \- 20.0.17 .INDENT 0.0 .IP \(bu 2 گسترش متغیرهای محیطی بررسی‌شده برای پیکربندی جهت بررسی نام‌های مستعار (مثلاً تنظیم هر یک از \fBVIRTUALENV_COPIES\fP یا \fBVIRTUALENV_ALWAYS_COPY\fP کارساز خواهد بود) \- توسط @gaborbernat \%\&. (#1763 \%) .UNINDENT.SS v20.0.16 (2020\-04\-04) .SS رفع باگ‌ها \- 20.0.16 .INDENT 0.0 .IP \(bu 2 اجازه دادن به فایل‌های wheel اولیه (seed wheel) در پوشه‌های \fBextra\-search\-dir\fP \%<#\:extra-search-dir> که فرادادهٔ \fBRequires\-Python\fP برای آن‌ها مشخص نشده است؛ این فایل‌ها سازگار با تمام نسخه‌های python در نظر گرفته می‌شوند \- توسط @gaborbernat \%\&. (#1757 \%) .UNINDENT .SS v20.0.15 (2020\-03\-27) .SS ویژگی‌ها \- 20.0.15 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB46.1.1\fP به \fB46.1.3\fP \- توسط @gaborbernat \%\&. (#1752 \%) .UNINDENT .SS v20.0.14 (2020\-03\-25) .SS ویژگی‌ها \- 20.0.14 .INDENT 0.0 .IP \(bu 2 حذف \fB__PYVENV_LAUNCHER__\fP در macOS برای Python \fB3.7.(<8)\fP و \fB3.8.(<3)\fP هنگام راه‌اندازی مفسر از طریق فایل \fBpth\fP؛ این کار وصلهٔ بالادست \% را اعمال می‌کند \- توسط @gaborbernat \%\&. (#1704 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده برای Python \fB3.5+\fP به \fB46.1.1\fP، و برای Python \fB2.7\fP به \fB44.1.0\fP \- توسط @gaborbernat \%\&. (#1745 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.14 .INDENT 0.0 .IP \(bu 2 رفع شناسایی مفسر بر اساس نام از \fBPATH\fP در صورتی که با قالب spec مطابقت ندارد \- توسط @gaborbernat \%\&. (#1746 \%) .UNINDENT .SS v20.0.13 (2020\-03\-19) .SS رفع باگ‌ها \- 20.0.13 .INDENT 0.0 .IP \(bu 2 عدم بروز خطا هنگام نبود فایل‌های pyc برای Python 2 میزبان \- توسط @gaborbernat \%\&. (#1738 \%) .IP \(bu 2 پشتیبانی از پایتون‌های با بسته‌بندی معیوب که هدرهای include را به جای الگوی sysconfig در الگوی distutils قرار می‌دهند \- توسط @gaborbernat \%\&. (#1739 \%) .UNINDENT .SS v20.0.12 (2020\-03\-19) .SS رفع باگ‌ها \- 20.0.12 .INDENT 0.0 .IP \(bu 2 رفع شناسایی مفسرها از طریق مسیر نسبی \- توسط @gaborbernat \%\&. (#1734 \%) .UNINDENT .SS v20.0.11 (2020\-03\-18) .SS ویژگی‌ها \- 20.0.11 .INDENT 0.0 .IP \(bu 2 بهبود پیام خطا هنگامی که پایتون میزبان پیش‌نیازهای لازم برای ایجاد محیط‌های مجازی را برآورده نمی‌کند (اکنون وقتی سازنده‌ای منطبق یافت نمی‌شود، اما سازندگانی وجود دارند که مفسر پایتون داده‌شده را توصیف می‌کنند، چاپ می‌شود که کدام فایل‌های میزبان ناسازگار/مفقود هستند و برای کدام سازندگان \- همچنان عدم پشتیبانی از سازنده برای Jython چاپ می‌شود، اما در مورد CPython/PyPy دقیقاً مشخص می‌شود کدام فایل‌های میزبان مانع ایجاد محیط‌های مجازی هستند) \- توسط @gaborbernat \%\&. (#1716 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.11 .INDENT 0.0 .IP \(bu 2 پشتیبانی از Python 3 Framework توزیع‌شده از طریق XCode در macOS Catalina و قبل از آن \- توسط @gaborbernat \%\&. (#1663 \%) .IP \(bu 2 رفع پشتیبانی از Python در Windows Store، عدم اجازهٔ ایجاد از طریق پیوند نمادین (symlink) چرا که طبق طراحی کار نخواهد کرد \- توسط @gaborbernat \%\&. (#1709 \%) .IP \(bu 2 رفع خطای \fBAttributeError\fP در \fBactivate_this.py\fP در ویندوز هنگامی که محیط مجازی از طریق سازوکار cross python ایجاد شده است \- توسط @gaborbernat \%\&. (#1710 \%) .IP \(bu 2 رفع مشکل نادیده گرفته شدن گزینه‌های \fB\-\-no\-pip\fP، \fB\-\-no\-setuptools\fP و \fB\-\-no\-wheel\fP \- توسط @gaborbernat \%\&. (#1712 \%) .IP \(bu 2 مجاز دانستن نبود فایل‌های \fB\&.py\fP در صورتی که نسخه کامپایل‌شدهٔ \fB\&.pyc\fP در دسترس باشد \- توسط @tucked \%\&. (#1714 \%) .IP \(bu 2 عدم بروز خطا در صورتی که وصله زدن distutils/setuptools روی یک لودر اکستنشن C (مانند \fBzipimporter\fP در Python 3.7 یا قبل‌تر) رخ دهد \- توسط @gaborbernat \%\&. (#1715 \%) .IP \(bu 2 پشتیبانی از پیاده‌سازی‌های Python 2 که نیاز دارند فایل‌های شاخص (landmark) و \fBsite.py\fP به جای مسیر کتابخانه استاندارد محیط مجازی در کتابخانه استاندارد پلتفرم باشند (به‌ویژه برخی موارد RHEL، مانند ایمیج داکر \fBamazonlinux:1\fP) \- توسط @gaborbernat \%\&. (#1719 \%) .IP \(bu 2 اجازه به گذراندن موفقیت‌آمیز مجموعه آزمون‌ها حتی زمانی که با Python سیستم فراخوانی می‌شوند \- جهت تسهیل بسته‌بندی مجدد ابزار برای توزیع‌های لینوکس \- توسط @gaborbernat \%\&. (#1721 \%) .IP \(bu 2 تولید اسکریپت کنسول \fBpipx.y\fP در کنار \fBpip\-x.y\fP به منظور سازگاری با نحوه نصب خودِ pip \- توسط @gaborbernat \%\&. (#1723 \%) .IP \(bu 2 ایجاد خودکار پوشهٔ داده‌های برنامه در صورتی که وجود نداشته باشد \- توسط @gaborbernat \%\&. (#1728 \%) .UNINDENT.SS بهبود مستندات \- 20.0.11 .INDENT 0.0 .IP \(bu 2 بخش پشتیبانی \%<#\:compatibility-requirements> اکنون به صراحت مشخص می‌کند که از کدام نسخه‌های نصب‌شدهٔ Python پشتیبانی می‌شود \- توسط @gaborbernat \%\&. (#1714 \%) .UNINDENT .SS v20.0.10 (2020\-03\-10) .SS رفع باگ‌ها \- 20.0.10 .INDENT 0.0 .IP \(bu 2 رفع مشکلی که در آن دریافت اطلاعات python ممکن بود توسط فایل‌های پیکربندی distutils تغییر کرده و باعث ایجاد محیط‌های مجازی با ساختار نادرست شود \- توسط @gaborbernat \%\&. (#1663 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB45.3.0\fP به \fB46.0.0\fP در Python \fB3.5+\fP \- توسط @gaborbernat \%\&. (#1702 \%) .UNINDENT .SS بهبود مستندات \- 20.0.10 .INDENT 0.0 .IP \(bu 2 مستندسازی پیش‌نیازها (pip + سرور ایندکس) هنگام نصب از طریق pip در بخش نصب \- توسط @gaborbernat \%\&. (#1618 \%) .IP \(bu 2 مستندسازی نصب در سامانه‌های غیر PEP\-518 \- توسط @gaborbernat \%\&. (#1619 \%) .IP \(bu 2 مستندسازی نصب آخرین نسخهٔ منتشرنشده از Github \- توسط @gaborbernat \%\&. (#1620 \%) .UNINDENT .SS v20.0.9 (2020\-03\-08) .SS رفع باگ‌ها \- 20.0.9 .INDENT 0.0 .IP \(bu 2 کارکرد \fBpythonw.exe\fP همانند \fBpython.exe\fP در Windows \- توسط @gaborbernat \%\&. (#1686 \%) .IP \(bu 2 مدیریت بارگذارهای قدیمی (legacy loaders) برای قلاب‌های واردسازی virtualenv که جهت وصله‌کردن بارگذاری پیکربندی distutils به کار می‌روند \- توسط @gaborbernat \%\&. (#1690 \%) .IP \(bu 2 پشتیبانی از پلتفرم‌های python 2 که فایل‌های نشانه‌گذاری (landmark files) را به جای \fBstdlib\fP در \fBplatstdlib\fP ذخیره می‌کنند (مانند RHEL) \- توسط @gaborbernat \%\&. (#1694 \%) .IP \(bu 2 ارتقای setuptools تعبیه‌شده از \fB45.2.0\fP به \fB45.3.0\fP برای Python \fB3.5+\fP \- توسط @gaborbernat \%\&. (#1699 \%) .UNINDENT .SS v20.0.8 (2020\-03\-04) .SS رفع باگ‌ها \- 20.0.8 .INDENT 0.0 .IP \(bu 2 رفع مشکلی که در آن وجود فایل‌های پیکربندی distutils \% حاوی مقادیر \fBprefix\fP و \fBinstall_scripts\fP باعث نصب بسته‌ها در مکان نادرست می‌شد \- توسط @gaborbernat \%\&. (#1663 \%) .IP \(bu 2 رفع مشکل بازنویسی شدن \fBPYTHONPATH\fP در Python 2 — توسط @jd \%\&. (#1673 \%) .IP \(bu 2 رفع مشکل تجزیهٔ مقادیر فهرستی پیکربندی از فایل پیکربندی یا متغیر محیطی \- توسط @gaborbernat \%\&. (#1674 \%) .IP \(bu 2 اصلاح اعلان پوسته در اسکریپت فعال‌سازی Batch برای نمایش نام محیط به صورت پیش‌فرض \- توسط @spetafree \%\&. (#1679 \%) .IP \(bu 2 رفع کندی راه‌اندازی virtualenv در Python 2 \- این مشکل ناشی از محاسبهٔ توزیع مجموعه‌کاری توسط setuptools بود \- توسط @gaborbernat \%\&. (#1682 \%) .IP \(bu 2 رفع مشکلی که در آن نقاط ورود (entry points) برای نصب‌های قابل‌ویرایش در Python 2 مقداردهی نمی‌شدند، به دلیل اینکه مجموعه‌کاری setuptools پیش از اجرای \fBeasy_install.pth\fP محاسبه می‌شد \- توسط @gaborbernat \%\&. (#1684 \%) .IP \(bu 2 رفع خطای شکست واردسازی \fBattr:\fP برای setuptools \- توسط @gaborbernat \%\&. (#1685 \%) .UNINDENT .SS v20.0.7 (2020\-02\-26) .SS رفع باگ‌ها \- 20.0.7 .INDENT 0.0 .IP \(bu 2 غیرفعال‌سازی اصلاحیهٔ distutils برای python 3 تا زمانی که pypa/pip #7778 \% برطرف و منتشر شود \- توسط @gaborbernat \%\&. (#1669 \%) .UNINDENT .SS v20.0.6 (2020\-02\-26) .SS رفع باگ‌ها \- 20.0.6 .INDENT 0.0 .IP \(bu 2 رفع مشکل اضافه‌شدن همیشگی بستهٔ سراسری site-package در ساخت‌های همراه با چارچوب python در macOS \- توسط @gaborbernat \%\&. (#1561 \%) .IP \(bu 2 رفع مشکلی که در آن اسکریپت‌های تولیدشده به جای اطلاعات نسخهٔ هدف، از نسخهٔ میزبان استفاده می‌کردند \- توسط @gaborbernat \%\&. (#1600 \%) .IP \(bu 2 رفع ارجاع چرخشی پیشوند در عناصر تکی (پذیرش آن‌ها به عنوان فایل‌های اجرایی سامانه و چاپ پیام اطلاع‌رسانی دربارهٔ ارجاع به خودشان) \- توسط @gaborbernat \%\&. (#1632 \%) .IP \(bu 2 مدیریت وضعیتی که در آن پوشهٔ داده‌های برنامه فقط‌خواندنی است: .INDENT 2.0 .IP \(bu 2 پوشهٔ داده‌های برنامه اکنون از طریق \fBapp\-data\fP \%<#\:app-data> قابل کنترل است، .IP \(bu 2 گزینهٔ \fBclear\-app\-data\fP اکنون کل پوشهٔ داده‌های برنامه را پاک‌سازی می‌کند، نه فقط مسیر بذرپاش \fBapp\-data\fP، .IP \(bu 2 بررسی اینکه آیا مسیر داده‌های برنامهٔ ارائه‌شده وجود ندارد یا فقط‌خواندنی است، و بازگشت خودکار به یک دایرکتوری موقت، .IP \(bu 2 داده‌های برنامه در دایرکتوری موقت به طور خودکار در پایان اجرا پاک‌سازی می‌شوند، .IP \(bu 2 مقدار \fBsymlink\-app\-data\fP \%<#\:symlink-app-data> در زمانی که داده‌های برنامه موقت هستند، همیشه \fBFalse\fP است .UNINDENT .sp توسط @gaborbernat \%\&. (#1640 \%) .IP \(bu 2 رفع مشکلی که در آن پودمان‌های توکار PyPy 2 به جای توکار بودن، از کتابخانهٔ استاندارد وارد می‌شدند \- توسط @gaborbernat \%\&. (#1652 \%) .IP \(bu 2 رفع مشکل ایجاد نقاط ورود هنگامی که مسیر شامل فاصله است \- توسط @nsoranzo \%\&. (#1660 \%) .IP \(bu 2 اصلاح مسیرهای نسبی برای zipapp (برای python \fB3.7+\fP) \- توسط @gaborbernat \%\&. (#1666 \%) .UNINDENT.SS v20.0.5 (2020\-02\-21) .SS ویژگی‌ها \- 20.0.5 (Features) .INDENT 0.0 .IP \(bu 2 همچنین ایجاد فایل‌های اجرایی \fBpythonX.X\fP هنگام ساخت virtualenvهای pypy \- توسط @asottile \% (#1612 \%) .IP \(bu 2 شکست با پیام خطای بهتر در صورت تلاش برای نصب سورس با \fBsetuptools\fP پشتیبانی‌نشده، مجاز دانستن \fBsetuptools\-scm >= 2\fP و انتقال به قالب قدیمی \fBsetuptools\-scm\fP جهت پشتیبانی بهتر از سکوهای قدیمی‌تر (\fBCentOS 7\fP و نظایر آن) \- توسط @gaborbernat \%\&. (#1621 \%) .IP \(bu 2 گزارش محیط مجازی ایجادشده اکنون به‌جای یک خط طولانی، در چهار خط کوتاه تقسیم می‌شود \- توسط @gaborbernat \% (#1641 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.5 (Bugfixes) .INDENT 0.0 .IP \(bu 2 افزودن پشتیبانی از Framework پایتون ۲ در macOs (اکنون در CI از طریق brew آزمایش می‌شود) \- توسط @gaborbernat \% (#1561 \%) .IP \(bu 2 رفع مشکل از دست رفتن libpypy\-c.so هنگامی که فایل اجرایی pypy یک symlink است \- توسط @asottile \% (#1614 \%) .IP \(bu 2 شناسایی مفسر python به صورت غیرحساس به حروف بزرگ و کوچک \- توسط @PrajwalM2212 \% (#1624 \%) .IP \(bu 2 رفع پشتیبانی از مفسر متقابل (cross interpreter) هنگامی که پایتون میزبان \fBsys.base_executable\fP را بر اساس \fB__PYVENV_LAUNCHER__\fP تنظیم می‌کند \- توسط @cjolowicz \% (#1643 \%) .UNINDENT .SS v20.0.4 (2020\-02\-14) .SS ویژگی‌ها \- 20.0.4 (Features) .INDENT 0.0 .IP \(bu 2 هنگام ساخت نام مستعار برای مفسرها، از پیوندهای نمادین نسبی استفاده شود \- توسط @asottile \%\&. (#1596 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.4 (Bugfixes) .INDENT 0.0 .IP \(bu 2 امکان استفاده از \fB/\fP به عنوان جداکننده مؤلفه‌های مسیر در Windows \- توسط \fBvphilippon\fP (#1582 \%) .IP \(bu 2 کاهش حداقل نسخه مورد نیاز six به 1.9 \- توسط \fBssbarnea\fP (#1606 \%) .UNINDENT .SS v20.0.3 (2020\-02\-12) .SS رفع باگ‌ها \- 20.0.3 (Bugfixes) .INDENT 0.0 .IP \(bu 2 در Python 2 با ساخت‌های Apple Framework، در صورت مشخص نشدن \fBsystem\-site\-packages\fP \%<#\:system-site-packages> بسته سراسری (site package) دیگر اضافه نمی‌شود \- توسط @gaborbernat \%\&. (#1561 \%) .IP \(bu 2 رفع سازوکار شناسایی python سیستم هنگامی که پیشوندها شامل بخش‌های نسبی هستند (مانند \fB\&..\fP) از طریق حل مسیرها درون پرسمان اطلاعات python \- توسط @gaborbernat \%\&. (#1583 \%) .IP \(bu 2 ارائه یک API برنامه‌نویسی به صورت \fBfrom virtualenv import cli_run\fP \- توسط @gaborbernat \%\&. (#1585 \%) .IP \(bu 2 رفع اشکال تزریق مسیر اضافی \fB\&.dist\-info.virtualenv\fP توسط \fBapp\-data\fP \fBseeder\fP \%<#\:seeder> که \fBimportlib.metadata\fP را مختل می‌کرد؛ اکنون یک \fB\&.virtualenv\fP اضافی تزریق می‌شود \- توسط @gaborbernat \%\&. (#1589 \%) .UNINDENT .SS بهبود مستندات \- 20.0.3 (Improved Documentation) .INDENT 0.0 .IP \(bu 2 مستندسازی یک API برنامه‌نویسی به صورت \fBfrom virtualenv import cli_run\fP ذیل Python \%<#\:programmatic-api> \- توسط @gaborbernat \%\&. (#1585 \%) .UNINDENT .SS v20.0.2 (2020\-02\-11) .SS ویژگی‌ها \- 20.0.2 (Features) .INDENT 0.0 .IP \(bu 2 چاپ یک پیام تک‌خطی درباره محیط مجازی ایجادشده زمانی که هیچ \fBverbose\fP \%<#\:verbose> تنظیم نشده باشد؛ اکنون می‌توان آن را از طریق پرچم \fBquiet\fP \%<#\:quiet> بی‌صدا کرد تا رفتار پیشین بازگردد \- توسط @pradyunsg \%\&. (#1557 \%) .IP \(bu 2 امکان بازنویسی حافظه پنهان داده‌های برنامه در virtualenv توسط \fBVIRTUALENV_OVERRIDE_APP_DATA\fP \- توسط @asottile \%\&. (#1559 \%) .IP \(bu 2 ارائه نام/مسیر محیط مجازی اکنون الزامی است (دیگر به طور پیش‌فرض \fBvenv\fP نیست) \- توسط @gaborbernat \%\&. (#1568 \%) .IP \(bu 2 افزودن پرچم خط فرمان \fBwith\-traceback\fP \%<#\:with-traceback> که امکان نمایش رد پشته (stacktrace) مربوط به virtualenv را هنگام بروز خطا فراهم می‌کند \- توسط @gaborbernat \%\&. (#1572 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.2 (Bugfixes) .INDENT 0.0 .IP \(bu 2 پشتیبانی از نام‌های مسیر طولانی برای نقطه‌های ورود کنسولی محیط مجازیِ تولیدشده (مانند \fBpip\fP) هنگام استفاده از \fBapp\-data\fP \fBseeder\fP \%<#\:seeder> \- توسط @gaborbernat \%\&. (#997 \%) .IP \(bu 2 بهبود سازوکار شناسایی python: .INDENT 2.0 .IP \(bu 2 در صورت وجود فایل‌های اجرایی در \fBPATH\fP که پرس‌وجوی آن‌ها ناموفق است (مثلاً به دلیل عدم دسترسی اجرا به آن)، عملیات با شکست مواجه نشود، .IP \(bu 2 علاوه بر پوشه پیشوند، پوشه باینری وابسته به سکو درون آن نیز بررسی شود، .UNINDENT .sp توسط @gaborbernat \%\&. (#1545 \%) .IP \(bu 2 هنگام رونوشت‌برداری (چه فایل‌ها یا درخت‌ها)، بیت‌های مجوز، زمان آخرین دسترسی، زمان آخرین تغییر و پرچم‌ها کپی نشوند؛ چرا که ممکن است دسترسی به این موارد ممنوع باشد (مثلاً در مورد Framework Python در macOs) و برای استفاده کاربر از محیط مجازی نیازی به آن‌ها نیست \- توسط @gaborbernat \%\&. (#1561 \%) .IP \(bu 2 هنگام شناسایی فایل‌های اجرایی python، مفسرهایی که قابل پرس‌وجو نیستند اکنون به‌جای warning با سطح info نمایش داده می‌شوند؛ بنابراین دیگر به‌طور پیش‌فرض نشان داده نمی‌شوند (این‌ها ممکن است صرفاً فایل‌های اجرایی باشند که به آن‌ها دسترسی نداریم یا خراب هستند؛ اگر Python هدف مورد نظر ما نیست هشدار داده نشود) \- توسط @gaborbernat \%\&. (#1574 \%) .IP \(bu 2 بخش \fBapp\-data\fP \fBseeder\fP \%<#\:seeder> دیگر بسته‌ها را در UNIX پیوند نمادین (symlink) و در Windows کپی نمی‌کند. در عوض به‌طور پیش‌فرض همیشه کپی می‌کند، اما اکنون دارای پرچم \fBsymlink\-app\-data\fP \%<#\:symlink-app-data> است که به کاربران اجازه می‌دهد این روش کم‌تر پایدار اما سریع‌تر را درخواست کنند \- توسط @gaborbernat \%\&. (#1575 \%) .UNINDENT.SS مستندات بهبودیافته \- 20.0.2 .INDENT 0.0 .IP \(bu 2 افزودن پیوند به مستندات قدیمی \% برای گزارش تغییرات توسط @jezdez \%\&. (#1547 \%) .IP \(bu 2 تنظیم دقیق چیدمان مستندات: عرض پیش‌فرض پوسته، امکان شکسته‌شدن خطوط جدول‌ها، گوشه‌های گرد برای قطعه‌کدها \- توسط @pradyunsg \%\&. (#1548 \%) .UNINDENT .SS v20.0.1 (2020\-02\-10) .SS ویژگی‌ها \- 20.0.1 .INDENT 0.0 .IP \(bu 2 ارتقای setuptools تعبیه‌شده به \fB45.2.0\fP از \fB45.1.0\fP برای Python \fB3.4+\fP \- توسط @gaborbernat \%\&. (#1554 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.1 .INDENT 0.0 .IP \(bu 2 محیط‌های مجازی ساخته‌شده از طریق مسیر نسبی در Windows، فایل‌های اجرایی کنسول نادرست ایجاد می‌کردند \- توسط @gaborbernat \%\&. (#1552 \%) .IP \(bu 2 به نظر می‌رسد گاهی venvهای ایجادشده فایل اجرایی پایه خود را روی خودشان تنظیم می‌کردند؛ این موارد بدون راستی‌آزمایی پذیرفته می‌شدند، بنابراین محیط‌های مجازی را به عنوان پایتون سیستم در نظر می‌گرفت که باعث بروز مشکلاتی می‌شد \- توسط @gaborbernat \%\&. (#1553 \%) .UNINDENT .SS v20.0.0. (2020\-02\-10) .SS مستندات بهبودیافته \- 20.0.0. .INDENT 0.0 .IP \(bu 2 رفع غلط‌های املایی، کلمات تکراری و فاصله‌گذاری ناهماهنگ سرعنوان‌ها. بازنویسی بخش‌هایی از مستندات توسعه و مستندات CLI. بسط دادن اختصاراتی مانند \fBenv var\fP و \fBconfig\fP به شکل کامل آن‌ها. استفاده از توضیحات مستندات مربوطه برای پروژه‌های فهرست‌شده در \fBrelated links\fP \- توسط @pradyunsg \%\&. (#1540 \%) .UNINDENT .SS v20.0.0b2 (2020\-02\-04) .SS ویژگی‌ها \- 20.0.0b2 .INDENT 0.0 .IP \(bu 2 بهبود سازوکار شناسایی فایل اجرایی پایه: .INDENT 2.0 .IP \(bu 2 چاپ دلیل رد کردن برخی گزینه‌ها در سطح اشکال‌زدایی (debug)، .IP \(bu 2 هنگامی که هیچ گزینه‌ای تطابق دقیق ندارد، به جای شکست قطعی، استفاده از نزدیک‌ترین تطابق با اولویت ویژگی‌های: پیاده‌سازی پایتون، نسخه اصلی (major)، نسخه فرعی (minor)، معماری، نسخه وصله (patch)، سطح انتشار و شماره سریال (این برای تسهیل کارکرد در زمانی است که ارتقای سیستم‌عامل، پایتون سیستم را با نسخه‌ای جدیدتر از آنچه پایتون میزبان virtualenv با آن ساخته شده جایگزین یا ارتقا می‌دهد)، .IP \(bu 2 حل همیشگی اطلاعات system_executable در حین فرایند شناسایی مفسر، به طوری که محیط شناسایی‌شده به جای venv/virtualenv، مفسر سیستم باشد (این کار پیش‌تر به صورت تنبلانه در اولین دسترسی انجام می‌شد و باعث می‌شد گزارش شود که محیط مجازی ایجادشده از نوع نسخه پایتون میزبان virtualenv است، نه نسخه پایتون سیستم \- این دو می‌توانند در صورتی که سیستم‌عامل پایتون سیستم را ارتقا داده باشد و میزبان virtualenv از طریق رونوشت ایجاد شده باشد، متفاوت باشند)، .UNINDENT .sp توسط @gaborbernat \%\&. (#1515 \%) .IP \(bu 2 تولید فعال‌سازهای \fBbash\fP و \fBfish\fP در Windows نیز (چرا که ممکن است با git bash، cygwin یا msys2 در دسترس باشند) \- توسط @gaborbernat \%\&. (#1527 \%) .IP \(bu 2 ارتقای بسته \fBwheel\fP بسته‌بندی‌شده از \fB0.34.0\fP به \fB0.34.2\fP \- توسط @gaborbernat \%\&. (#1531 \%) .UNINDENT .SS رفع باگ‌ها \- 20.0.0b2 .INDENT 0.0 .IP \(bu 2 اسکریپت فعال‌سازی Bash نباید به جای \fB\&.sh\fP دارای پسوند باشد (این کار یکپارچگی با virtualenvwrapper \% را برطرف می‌کند) \- توسط @gaborbernat \%\&. (#1508 \%) .IP \(bu 2 نمایش اطلاعات کمتر هنگام اجرا با سطح پرگویی منفرد (\fB\-v\fP): .INDENT 2.0 .IP \(bu 2 دیگر اطلاعات مفسرهای پذیرفته‌شده نمایش داده نمی‌شود (زیرا آخرین مورد پیشنهادشده همواره همان مورد پذیرفته‌شده است)، .IP \(bu 2 عدم نمایش صفت \fBstr_spec\fP برای \fBPythonSpec\fP زیرا می‌توان آن‌ها را از سایر صفت‌ها استنباط کرد، .IP \(bu 2 برای بذرپاش (seeder) \fBapp\-data\fP نوع قفل نشان داده نمی‌شود، فقط مسیر دایرکتوری داده‌های برنامه نمایش داده می‌شود، .UNINDENT .sp توسط @gaborbernat \%\&. (#1510 \%) .IP \(bu 2 رفع اشکال عدم شناسایی مفسر پایتونی که قبلاً تحت مسیری دیگر شناسایی شده بود (مانند زمانی که چندین پیوند نمادین به همان مفسر وجود دارد) \- توسط @gaborbernat \%\&. (#1512 \%) .IP \(bu 2 پشتیبانی از مسیرهای نسبی برای \fB\-p\fP \- توسط @gaborbernat \%\&. (#1514 \%) .IP \(bu 2 ایجاد هم‌روند محیط‌های مجازی به دلیل ناتوانی در دریافت قفل درون app data با شکست مواجه می‌شد \- توسط @gaborbernat \%\&. (#1516 \%) .IP \(bu 2 فایل‌های pth در مفسرهای Debian CPython2 پردازش نمی‌شدند \- توسط @gaborbernat \%\&. (#1517 \%) .IP \(bu 2 رفع مشکل نمایش نادرست خط اعلان در نسخه آتی fish 3.10 به دلیل حفظ نشدن \fB$pipestatus\fP \- توسط @krobelus \%\&. (#1530 \%) .IP \(bu 2 ترتیب پایدار در \fBpyenv.cfg\fP و افزودن \fBinclude\-system\-site\-packages\fP تنها برای سازندگانی که به پایتون سراسری ارجاع می‌دهند \- توسط user:\fIgaborbernat\fP\&. (#1535 \%) .UNINDENT.SS بهبود مستندات \- 20.0.0b2 .INDENT 0.0 .IP \(bu 2 ایجاد نخستین تکرار از مستندات جدید \- توسط @gaborbernat \%\&. (#1465 \%) .IP \(bu 2 قالب فایل readme پروژه اکنون به جای reStructuredText از نوع MarkDown است \- توسط @gaborbernat \%\&. (#1531 \%) .UNINDENT .SS v20.0.0b1 (2020\-01\-28) .INDENT 0.0 .IP \(bu 2 نخستین انتشار عمومی از نسخهٔ بازنویسی‌شده؛ همه‌چیز کاملاً جدید بوده و به‌تازگی اضافه شده است. .IP \(bu 2 مقدار پیش‌فرض \fB\-\-download\fP برابر با \fBFalse\fP است .IP \(bu 2 دیگر ماژول توکار \fBsite\fP با نسخهٔ سفارشی تعبیه‌شده در خودِ کدِ virtualenv \%\& جایگزین نمی‌شود. تنها برای رفع اشکالات در Python 2 از یک ماژول رابط (shim) ساده استفاده شده است. .UNINDENT .sp \fBهشدار:\fP .INDENT 0.0 .INDENT 3.5 بستهٔ virtualenv کنونی دومین تکرار از پیاده‌سازی است. از نسخهٔ \fB0.8\fP تا \fB16.7.9\fP تکرار نخست شماره‌گذاری شده بود. نسخهٔ \fB20.0.0b1\fP یک بازنویسی کامل از این بسته است و از همین رو تاریخچهٔ این انتشار از آنجا آغاز می‌شود. گزارش تغییرات قدیمی همچنان در مستندات شاخهٔ قدیمی (legacy) \%\& در دسترس است. .UNINDENT .UNINDENT .SH "نویسندگان (AUTHORS)" نام نویسنده تعیین نشده است .SH "کپی‌رایت و تکثیر (COPYRIGHT)" 2007-2026, PyPA, PyPA .\" End of generated man page.