2025, Oct 19 23:32

Windows पर gensim इंस्टॉलेशन फेल क्यों होता है और आसान समाधान

Windows पर gensim इंस्टॉल के दौरान SciPy की metadata-generation व Fortran कंपाइलर त्रुटि क्यों आती है, Python 3.13 में कारण, और Python 3.12 पर सरल समाधान.

Windows पर gensim की इंस्टॉलेशन, भले ही आपका टूलचेन पूरा लगता हो, अनपेक्षित रूप से SciPy बिल्ड एरर के साथ फेल हो सकती है। मुख्य संकेत यह होता है कि pip install के दौरान SciPy की metadata-generation विफल हो जाती है। यह गाइड सरल भाषा में बताती है कि यह क्यों होता है और बिना कंपाइलर सेटअप के साफ-सुथरी इंस्टॉलेशन कैसे करें।

क्या विफल होता है और यह कैसा दिखता है

आमतौर पर यह समस्या साधारण इंस्टॉल कमांड चलाते समय दिखाई देती है। सेशन SciPy की मेटाडेटा एरर पर खत्म होता है, जिसमें Meson का आउटपुट और बार-बार आने वाला संदेश शामिल होता है कि कोई Fortran कंपाइलर उपलब्ध नहीं है।

pip install gensim

Collecting gensim
Using cached gensim-4.3.3.tar.gz (23.3 MB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Collecting numpy<2.0,>=1.18.5 (from gensim)
Using cached numpy-1.26.4.tar.gz (15.8 MB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Installing backend dependencies ... done
Preparing metadata (pyproject.toml) ... done
Collecting scipy<1.14.0,>=1.7.0 (from gensim)
Using cached scipy-1.13.1.tar.gz (57.2 MB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Installing backend dependencies ... done
Preparing metadata (pyproject.toml) ... error
error: subprocess-exited-with-error

× Preparing metadata (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [...snip...]
ERROR: Unknown compiler(s): [['ifort'], ['gfortran'], ['flang-new'], ['flang'], ['pgfortran'], ['g95']]
Running `ifort --help` gave "Den angivne fil blev ikke fundet"
Running `gfortran --help` gave "Den angivne fil blev ikke fundet"
[...snip...]
error: metadata-generation-failed

उस डैनिश पंक्ति का अर्थ है “निर्दिष्ट फ़ाइल नहीं मिली”, जो कि कंपाइलर के अनुपलब्ध होने से मेल खाता है।

असल में हो क्या रहा है

Gensim, SciPy को 1.14.0 से पहले की रिलीज़ पर पिन करता है, क्योंकि यह SciPy के एक पुराने प्राइवेट API पर निर्भर करता है जिसे बहुत पहले डिप्रिकेट किया गया था और SciPy 1.14.0 में स्थानांतरित कर दिया गया। व्यावहारिक रूप से, इसका मतलब है कि gensim को संतुष्ट करने के लिए pip SciPy 1.13.x इंस्टॉल करने की कोशिश करता है। Python 3.13 पर SciPy 1.13.x के प्रीबिल्ट व्हील्स उपलब्ध नहीं हैं, क्योंकि वह लाइन Python 3.13 को सपोर्ट नहीं करती। ऐसे में pip सोर्स से SciPy बनाने पर लौट आता है, जिससे Meson चलता है और Fortran टूलचेन की जाँच होती है। जब कोई Fortran कंपाइलर नहीं मिलता, तो बिल्ड मेटाडेटा प्रिपरेशन के दौरान ही रुक जाता है।

SciPy की टूलचेन पॉलिसी भी इसी Python/SciPy संयोजन के लिए बिल्ड न होने की पुष्टि करती है। टूलचेन रोडमैप देखें: https://docs.scipy.org/doc/scipy/dev/toolchain.html#numpy.

व्यावहारिक समाधान

आगे बढ़ने के तीन सीधे रास्ते हैं। आप ऐसा Python संस्करण उपयोग कर सकते हैं जिसे SciPy 1.13.1 सपोर्ट करता है। आप चाहें तो SciPy 1.13.1 को सोर्स से बिल्ड कर सकते हैं, जिसके लिए Windows पर Fortran कंपाइलर सेटअप करना पड़ेगा। या फिर gensim को नए SciPy के साथ काम करने के लिए संशोधित कर सकते हैं, जिससे यह पुरानी निर्भरता हट जाए। सभी विकल्प संभव हैं, पर लागत और जोखिम अलग-अलग हैं।

सबसे कम दर्द वाला तरीका है gensim को Python 3.12 या उससे पुराने, SciPy 1.13.1 समर्थित संस्करण पर चलाना। इससे सोर्स बिल्ड की ज़रूरत नहीं पड़ती क्योंकि प्रीबिल्ट व्हील्स उपलब्ध होते हैं।

सबसे सरल उपाय अपनाएँ: Python 3.12 का उपयोग करें

Python 3.12 वाले एक एन्वायरनमेंट को बनाएँ और उसी में gensim इंस्टॉल करें। आम टूलिंग के साथ न्यूनतम उदाहरण नीचे दिए हैं।

# conda का उपयोग करते हुए
conda create -y -n gensim312 python=3.12
conda activate gensim312
pip install --upgrade pip
pip install gensim
# venv का उपयोग (यदि आप pip/venv पसंद करते हैं)
python3.12 -m venv .venv312
.venv312\Scripts\activate
python -m pip install --upgrade pip
pip install gensim

इंस्टॉलेशन के बाद एक त्वरित इम्पोर्ट जाँच यह पुष्टि कर देती है कि स्टैक बिना SciPy को सोर्स से बनाने के भी सुसंगत है।

python -c "import gensim, scipy; print(gensim.__version__, scipy.__version__)"

वैकल्पिक रास्ते (सावधानियों के साथ)

Windows पर SciPy 1.13.1 को सोर्स से बिल्ड करना संभव तो है, लेकिन आसान नहीं है और Fortran कंपाइलर सेटअप की आवश्यकता होगी। उस संस्करण के लिए आधिकारिक गाइड यहाँ है: https://docs.scipy.org/doc/scipy-1.13.1/building/index.html. खासकर तब चुनौती बढ़ जाती है जब पुराने SciPy को बहुत नए Python रिलीज़ के साथ जोड़ना हो।

Gensim को नए SciPy के साथ काम कराने के लिए रिफैक्टर करना भी एक विकल्प है। सार यह है कि SciPy 1.14.0 में स्थानांतरित हुए उसके प्राइवेट API पर निर्भरता हटानी होगी। चर्चा यहाँ ट्रैक की जा रही है: https://github.com/piskvorky/gensim/issues/3623.

यह क्यों मायने रखता है

Python के वैज्ञानिक इकोसिस्टम में बाइनरी कम्पैटिबिलिटी, NumPy, SciPy, कंपाइलरों और खुद Python के बीच समन्वित संस्करण सपोर्ट पर टिकती है। केवल एक पुरानी पिनिंग भी आपके इंस्टॉलर को चुपचाप सोर्स-बिल्ड के रास्ते पर धकेल सकती है, जहाँ नैटिव टूलचेन और कंपाइलर अनिवार्य हो जाते हैं। इन बाध्यताओं को समझना उन घंटों को बचा सकता है जो असल उपयोग‑मामले से असंबंधित टूलचेन एरर पीछा करने में लगते हैं।

मुख्य निष्कर्ष

यदि gensim इंस्टॉल करते समय pip SciPy को सोर्स से बनाने की कोशिश करता है और Meson या Fortran कंपाइलर के अभाव से फेल हो जाता है, तो बहुत सम्भव है कि आप Python 3.13 पर हैं और SciPy की पिनिंग 1.14.0 से पुरानी है। सबसे प्रभावी समाधान है उस एन्वायरनमेंट के लिए Python 3.12 इंस्टॉल कर उसका उपयोग करना, जिससे SciPy के प्रीबिल्ट व्हील्स उपलब्ध हो जाते हैं और नैटिव बिल्ड की ज़रूरत नहीं रहती। खुद SciPy बनाना या gensim को पैच करना भी वैध विकल्प हैं, मगर अधिक भारी। लाइब्रेरी कम्पैटिबिलिटी मैट्रिस और प्रोजेक्ट इश्यू ट्रैकर्स पर नज़र रखने से अगली बार ऐसी पिनिंग आने पर आप सबसे कम प्रतिरोध वाला रास्ता चुन पाएँगे।

यह लेख StackOverflow पर प्रश्न (लेखक: Choptdei) और Nick ODell के उत्तर पर आधारित है।