2025, Oct 31 15:32

VS Code में Code Runner से venv से पहले Python चलना: कारण और समाधान

VS Code में Code Runner Python को venv से पहले चला देता है; पहली रन में मॉड्यूल त्रुटि आती है। executorMap से $pythonPath या venv पाथ सेट कर समाधान पाएं.

हालिया VS Code अपडेट के बाद, कुछ डेवलपर्स ने देखा कि Code Runner एक्सटेंशन से Python फाइलें चलाने पर पहले सिस्टम इंटरप्रेटर चल जाता है और उसके बाद ही वर्चुअल एनवायरनमेंट सक्रिय होता है। पहली रन में मॉड्यूल न मिलने की वजह से त्रुटि आती है, जबकि दूसरी बार चलाने पर सफलता मिलती है क्योंकि venv बाद में सक्रिय हो चुका होता है। यह VS Code की बग नहीं है; यह गलत कॉन्फ़िगरेशन और VS Code व Code Runner के बीच लॉन्च-ऑर्डर का असंतुलन है।

लक्षण को पुनरुत्पादित करना

एक साधारण फाइल लें जो वर्चुअल एनवायरनमेंट में इंस्टॉल किए पैकेज पर निर्भर है:

from flask import Flask
print("File Executed")

Code Runner के जरिए चलाने पर टर्मिनल में दिखता है कि वर्चुअल एनवायरनमेंट सक्रिय होने से पहले ही Python प्रोसेस शुरू हो जाता है। नतीजा—एक import त्रुटि, उसके बाद देर से सक्रियण, और फिर जाकर सफल पुन: रन:

python -u "/home/user/project/panel/__init__.py"
ModuleNotFoundError: No module named 'flask'
source /home/user/project/.venv/bin/activate.fish
python -u "/home/user/project/panel/__init__.py"
File Executed

यदि Code Runner को निष्क्रिय कर दें और VS Code के बिल्ट-इन रन व्यवहार का उपयोग करें, तो क्रम बदल जाता है: पहले सक्रियण कमांड चलता है, और उसके बाद वर्चुअल एनवायरनमेंट वाला Python इंटरप्रेटर स्क्रिप्ट चलाता है:

source /home/user/project/.venv/bin/activate.fish
/home/user/project/.venv/bin/python "/home/user/project/panel/__init__.py"

वास्तव में हो क्या रहा है

Code Runner तुरंत Python प्रोसेस शुरू कर देता है, इसलिए कमांड ग्लोबल इंटरप्रेटर का उपयोग करता है। उसके बाद VS Code का टर्मिनल venv को सक्रिय करता है, लेकिन जो कमांड पहले ही चल चुका है उसके लिए यह बहुत देर हो चुकी होती है। Code Runner को बंद करने पर अपेक्षित क्रम लौट आता है, जिसमें निष्पादन से पहले सक्रियण होता है। इस व्यवहार पर Code Runner के इश्यू ट्रैकर में चर्चा हो चुकी है और इसे इस बात से जोड़ा गया है कि एक्सटेंशन Python कमांड को कैसे रिज़ॉल्व करता है।

गलत कॉन्फ़िगरेशन को ठीक करना

समाधान यह है कि Code Runner उसी इंटरप्रेटर का उपयोग करे जिसे VS Code ने वर्कस्पेस के लिए चुना है। एक्सीक्यूटर मैप को अपडेट करें ताकि Python कमांड VS Code द्वारा दिए गए इंटरप्रेटर पाथ का उपयोग करे:

"code-runner.executorMap": {
  "python": "$pythonPath -u $fullFileName"
}

वैकल्पिक रूप से, आप Code Runner को सीधे अपने venv के अंदर वाले Python बायनरी की ओर निर्देशित कर सकते हैं:

"code-runner.executorMap": {
  "python": "/home/user/project/.venv/bin/python -u $fullFileName"
}

इनमें से किसी भी विकल्प के साथ, Code Runner शुरू से सही इंटरप्रेटर को लॉन्च करेगा, जिससे स्क्रिप्ट इच्छित एनवायरनमेंट में चलेगी और import त्रुटि गायब हो जाएगी।

आपके वर्कफ़्लो के लिए यह क्यों मायने रखता है

एनवायरनमेंट ड्रिफ्ट असफलताओं का एक सूक्ष्म कारण है, खासकर जब आपकी निर्भरताएँ venv के अंदर हों। यदि आपका रनर गलत इंटरप्रेटर को बुलाता है, तो नतीजे असंगत मिलते हैं: पहली रन में पैकेज गायब, अगली कोशिशों में उलझाने वाली सफलता, और fish या bash जैसे शेल्स में गैर-पुनरुत्पादनशील व्यवहार। Code Runner को VS Code की इंटरप्रेटर चयन के साथ संरेखित कर देने से यह असंगति दूर होती है और निष्पादन अनुमानित बना रहता है।

व्यावहारिक निष्कर्ष

यह सुनिश्चित करें कि जो टूल Python चलाता है, वही इंटरप्रेटर पाथ भी प्रदान कर रहा हो। यदि आप विभिन्न भाषाओं में एक ही “run” शॉर्टकट के लिए Code Runner पर निर्भर हैं, तो उसके Python एक्सीक्यूटर को $pythonPath उपयोग करने के लिए कॉन्फ़िगर करें या उसे अपने प्रोजेक्ट के venv वाले Python पर पिन करें। यदि आप एक्सटेंशन के बिना डिफ़ॉल्ट व्यवहार पसंद करते हैं, तो VS Code आपकी फाइल चलाने से पहले ही venv को सक्रिय कर देता है। दोनों स्थितियों में उद्देश्य एक है: प्रक्रिया सही इंटरप्रेटर के तहत शुरू हो ताकि आपके मॉड्यूल अपेक्षित रूप से रिज़ॉल्व हों।

एक बार एक्सीक्यूटर मैप सेट कर दें, और आपकी रनिंग फिर से सुसंगत हो जाएगी—न अतिरिक्त कीस्ट्रोक्स, न दूसरी रन की कोई अप्रत्याशितता।

यह लेख StackOverflow के एक प्रश्न (द्वारा: S M Shahriar Zarir) और Sindik के उत्तर पर आधारित है।