در پایتون 3.12، ماژول distutils
به عنوان یک ماژول مستقل حذف شده و فقط از طریق setuptools
در دسترس است.
برای حل این مشکل، میتوانید از یکی از راهحلهای زیر استفاده کنید:
در فایل patcher.py در مسیر نصب کتابخانه undetected-chromedriver (معمولاً در site-packages)، خط زیر را:
from distutils.version import LooseVersion
به یکی از این حالات تغییر دهید:
# گزینه ۱: استفاده از packaging (توصیه شده)
from packaging.version import parse as LooseVersion
# گزینه ۲: استفاده از setuptools
from setuptools.distutils.version import LooseVersion
# گزینه ۳: import با خطاگیری
try:
from distutils.version import LooseVersion
except ImportError:
from packaging.version import parse as LooseVersion
میتوانید یک پکیج مجازی distutils ایجاد کنید که version.py را شامل شود:
mkdir -p distutils
touch distutils/__init__.py
سپس در فایل distutils/version.py
بنویسید:
from packaging.version import parse as LooseVersion
سپس PYTHONPATH
را به گونهای تنظیم کنید که این پوشه در مسیر پایتون قرار گیرد.
pip install setuptools
در Railway میتوانید از پایتون 3.10 یا 3.11 استفاده کنید که هنوز از distutils پشتیبانی میکنند:
[nixpacks]
python = { version = "3.10" }
این روش پیشرفتهتر است و قبل از import کردن undetected-chromedriver، یک ماژول distutils مجازی در sys.modules تزریق میکند:
import sys
from types import ModuleType
# ایجاد ماژولهای مجازی
distutils_module = ModuleType("distutils")
version_module = ModuleType("distutils.version")
sys.modules["distutils"] = distutils_module
sys.modules["distutils.version"] = version_module
# پیادهسازی LooseVersion
from packaging.version import parse
class LooseVersion(parse):
pass
# اضافه کردن به ماژول version
version_module.LooseVersion = LooseVersion
# حالا undetected_chromedriver را import کنید
import undetected_chromedriver as uc