2025, Nov 01 22:02

venv में pip नहीं चल रहा? Ubuntu 24.04 पर noexec माउंट का असर और समाधान

Ubuntu 24.04 और Python 3.12 में venv पर pip/NumPy एरर? वजह अक्सर noexec माउंट है. लक्षण, mount से जाँच, python -m pip, और exec के साथ remount समाधान.

कभी‑कभी वर्चुअल एनवायरनमेंट सक्रिय दिखता है, लेकिन pip सहयोग नहीं करता — वजह Python से बाहर भी हो सकती है। Ubuntu 24.04 और Python 3.12 पर, यदि venv ऐसे माउंट पॉइंट के नीचे बनाया गया है जहाँ execution की अनुमति नहीं है, तो pip सिस्टम वाली कॉपी पर लौट आता है और compiled wheels import के समय फेल हो जाते हैं। शुरुआत में लक्षण उलझाने वाले लगते हैं: venv वाला Python चलता है, लेकिन pip ग्लोबल वाले की ओर इशारा करता है, और venv के pip को चलाने की कोशिश “Permission denied” पर खत्म होती है। अगर आप python -m pip से आगे बढ़ते हैं, तो NumPy इंस्टॉल होता दिखता है—पर import करते समय shared object mapping error के साथ असफल हो जाता है।

समस्या को दोहराकर देखना

वर्कफ़्लो /mnt के नीचे किसी माउंट पर मौजूद डायरेक्टरी में शुरू होता है:

python3 -m venv .venv
source ./.venv/bin/activate
which pip
which python
./.venv/bin/pip install numpy

आउटपुट असंगति दिखाता है और venv के pip को चलाने में विफलता भी:

(.venv) $ which pip
/usr/bin/pip
(.venv) $ which python
/mnt/DATA/AUC/Research Assistant/Pedestrian-Estimation-Dataset-Annotation/test/.venv/bin/python
(.venv) $ ./.venv/bin/pip install numpy
bash: ./.venv/bin/pip: Permission denied

इंटरप्रेटर के ज़रिए इंस्टॉलेशन काम करता है:

python -m pip install numpy

लेकिन उसी एनवायरनमेंट से NumPy जैसी compiled extension को import करना असफल हो जाता है:

ImportError: ... _multiarray_umath.cpython-312-x86_64-linux-gnu.so: failed to map segment from shared object
...
ImportError: Error importing numpy: you should not try to import numpy from
        its source directory; please exit the numpy source tree, and relaunch
        your python interpreter from there.

एक छोटा‑सा स्क्रिप्ट जो import चरण को ट्रिगर करे, गलती को दिखाने के लिए काफ़ी है:

# फ़ाइल: run_infer.py
import numpy as nx
print(nx.__version__)

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

समस्या न pip है, न Python, न ही NumPy। असल मुद्दा है फाइलसिस्टम के mount options। एनवायरनमेंट /mnt के नीचे उस पाथ पर है जिसे noexec के साथ माउंट किया गया है। यह फ़्लैग फ़ाइल अनुमतियों की परवाह किए बिना उस फाइलसिस्टम से बाइनरी और स्क्रिप्ट चलने नहीं देता। नतीजतन, आपका शेल .venv/bin/pip को वैध executable नहीं मानता और उसकी जगह /usr/bin/pip दिखाता है। पाथ देकर venv का pip चलाने पर भी कर्नेल “Permission denied” के साथ execution रोक देता है।

यही पाबंदी compiled extensions को लोड करना भी तोड़ देती है, इसलिए NumPy import के दौरान “failed to map segment from shared object” जैसी त्रुटि आती है। बताए गए सेटअप में डिवाइस NTFS में फ़ॉर्मैट था और fuseblk के जरिए noexec के साथ माउंट था। mount options की जाँच करने से बात साफ़ हो जाती है:

mount | grep -F /mnt

उदाहरण आउटपुट, जो समस्या दिखाता है, फ़्लैग्स में noexec को शामिल करता है:

(rw,nosuid,nodev,noexec,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,user,x-gvfs-show)

इसे ठीक कैसे करें

आगे बढ़ने के दो सीधे तरीके हैं। पहला, मौजूदा पाबंदी के भीतर रहकर इंटरप्रेटर के जरिए pip चलाएँ, ताकि कर्नेल python को चलाए (जिसकी अनुमति है) और Python मॉड्यूल को स्क्रिप्ट की तरह लोड करे:

python .venv/bin/pip <args>

या फिर इसी का समकक्ष:

python -m pip <args>

दूसरा तरीका स्रोत पर से पाबंदी हटाना है। यदि venv (और आपका प्रोजेक्ट) ऐसे फाइलसिस्टम पर है जो noexec के साथ माउंट है, तो उसे exec के साथ remount करें ताकि executables और shared objects चल सकें। बदलाव से पहले fstab एंट्री कुछ ऐसी थी:

UUID=349264BD926484E8 /mnt/DATA  auto rw,user,uid=1000,gid=1000,dmask=0002,fmask=0002,nosuid,nodev,nofail,x-gvfs-show 0 0

exec जोड़ने से उस माउंट पर execution सक्षम हो जाता है:

UUID=349264BD926484E8 /mnt/DATA  auto rw,user,exec,uid=1000,gid=1000,dmask=0002,fmask=0002,nosuid,nodev,nofail,x-gvfs-show 0 0

परिवर्तन लागू कर remount करने के बाद venv का pip सामान्य रूप से चलता है, और NumPy को import करना बिना त्रुटि के हो जाता है। विकल्प के तौर पर आप वर्चुअल एनवायरनमेंट ऐसे फाइलसिस्टम पर दोबारा बना सकते हैं जहाँ noexec न हो।

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

वर्चुअल एनवायरनमेंट venv की bin डायरेक्टरी में मौजूद शिम्स और एंट्री‑पॉइंट्स पर निर्भर रहता है। अगर नीचे का फाइलसिस्टम execution की अनुमति नहीं देता, तो अलगाव की सामान्य गारंटियाँ सूक्ष्म तरीकों से टूट जाती हैं। शेल चुपचाप pip को ग्लोबल कॉपी पर रेज़ॉल्व कर देता है, जिससे इंस्टॉलेशन एनवायरनमेंट के बाहर लीक हो जाते हैं। Compiled wheels import के समय shared objects लोड करते हैं; noexec होने पर लोडर segments को सही ढंग से map नहीं कर पाता, और यह उलझाने वाले ImportError संदेशों के रूप में दिखता है। Mount options ठीक करने से अपेक्षित व्यवहार लौट आता है और वे रनटाइम त्रुटियाँ नहीं होतीं जिन्हें निदान करना मुश्किल होता है।

निष्कर्ष

यदि सक्रिय venv में pip सिस्टम बाइनरी पर रेज़ॉल्व हो रहा है या venv का pip “Permission denied” के साथ फेल हो रहा है, तो Python को डिबग करने से पहले mount options जाँचें। mount | grep -F /mnt पर एक नज़र सामान्य बाहरी या NTFS‑समर्थित माउंट्स पर noexec दिखा देगी। फिलहाल के उपाय के तौर पर python -m pip का उपयोग करें, फिर या तो exec के साथ remount करें या एनवायरनमेंट को ऐसे फाइलसिस्टम पर ले जाएँ जहाँ noexec न हो। एक बार execution की अनुमति मिल जाने पर pip और NumPy जैसी compiled extensions अपेक्षित रूप से काम करती हैं, और आपका वर्चुअल एनवायरनमेंट सचमुच अलग‑थलग रहता है।

यह लेख StackOverflow पर प्रश्न (लेखक: abdo Salm) और phd द्वारा दिए गए उत्तर पर आधारित है।