Python उन साझा वस्तुओं को क्यों नहीं खोज सकता जो sys.path में निर्देशिका में हैं?


124

मैं आयात करने की कोशिश कर रहा हूं pycurl:

$ python -c "import pycurl"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: libcurl.so.4: cannot open shared object file: No such file or directory

अब, libcurl.so.4में है /usr/local/lib। जैसा कि आप देख सकते हैं, यह इस प्रकार है sys.path:

$ python -c "import sys; print(sys.path)"
['', '/usr/local/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg', 
'/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', 
'/usr/local/lib/python2.5/plat-linux2', '/usr/local/lib/python2.5/lib-tk', 
'/usr/local/lib/python2.5/lib-dynload', 
'/usr/local/lib/python2.5/sitepackages', '/usr/local/lib', 
'/usr/local/lib/python2.5/site-packages']

किसी भी प्रकार की सहायता सराहनीय होगी।


यदि आपने LD_LIBRARY_PATHसही तरीके से सेट नहीं किया है, तो मेरा अपडेट किया गया उत्तर देखें (मुझे लगा कि आपकी टिप्पणी में एक लापता बृहदान्त्र था)।
बजे विनय साजिप

1
क्या कहीं टूटी हुई सिम्बल है जिसका नाम libcurl.so.4 है? यह मुझे ऐसा लग रहा है जैसे यह फ़ाइल ढूंढ रहा है लेकिन इसे खोलने में असमर्थ है। यदि अन्य सभी विफल रहता है, तो दुभाषिया को स्ट्रेस करें और असफल कॉलिंग की तलाश करें।
चार्ल्स डफी

जवाबों:


158

sys.pathकेवल पायथन मॉड्यूल के लिए खोजा गया है। डायनेमिक लिंक्ड लाइब्रेरी के लिए, खोजे गए रास्तों में होना चाहिए LD_LIBRARY_PATH। जांचें कि क्या आपके LD_LIBRARY_PATHशामिल हैं /usr/local/lib, और यदि यह नहीं है, तो इसे जोड़ें और पुन: प्रयास करें।

कुछ और जानकारी ( स्रोत ):

लिनक्स में, पर्यावरण चर LD_LIBRARY_PATH निर्देशिकाओं का एक बृहदान्त्र-अलग-अलग सेट है जहाँ निर्देशिकाओं के मानक सेट से पहले पुस्तकालयों को पहले खोजा जाना चाहिए; यह तब उपयोगी होता है जब किसी नए पुस्तकालय में डिबगिंग या विशेष उद्देश्यों के लिए गैर-मानक लाइब्रेरी का उपयोग किया जाता है। पर्यावरण चर LD_PRELOAD उन कार्यों के साथ साझा पुस्तकालयों को सूचीबद्ध करता है जो मानक सेट को ओवरराइड करते हैं, जैसे /etc/ld.so.preload करता है। ये लोडर /lib/ld-linux.so द्वारा कार्यान्वित किए जाते हैं। मुझे ध्यान देना चाहिए कि, LD_LIBRARY_PATH कई यूनिक्स जैसी प्रणालियों पर काम करता है, यह सभी पर काम नहीं करता है; उदाहरण के लिए, यह कार्यक्षमता HP-UX पर उपलब्ध है लेकिन पर्यावरण चर SHLIB_PATH के रूप में, और AIX पर यह कार्यक्षमता चर LIBPATH (समान सिंटैक्स, एक कोलोन-अलग सूची के साथ) के माध्यम से है।

अपडेट: सेट करने के लिए LD_LIBRARY_PATHनिम्न में से एक का उपयोग करें, आदर्श अपने में ~/.bashrc या समकक्ष फ़ाइल:

export LD_LIBRARY_PATH=/usr/local/lib

या

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

यदि यह खाली है (पहले खाली स्ट्रिंग के बराबर, या बिल्कुल मौजूद नहीं है), और यदि ऐसा नहीं है तो पहले फॉर्म का उपयोग करें। निर्यात के उपयोग पर ध्यान दें ।


2
धन्यवाद। मेरा LD_LIBRARY_PATH सेट नहीं था, इसलिए: $ LD_LIBRARY_PATH = / usr / local / lib $ LD_LIBRARY_PATH / usr / local / lib लेकिन मुझे अभी भी वही त्रुटि मिली है: $ python -c "import pycurl" Traceback (सबसे हाल का कॉल अंतिम): "<string>", पंक्ति 1, में <मॉड्यूल> ImportError: libcurl.so.4: साझा की गई फ़ाइल को नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं

2
मुझे अपने उपयोगकर्ता को LD_LIBRARY_PATH चर सेट करने के बाद लाइब्रेरी पढ़ने की अनुमति भी देनी थी। अब यह अंत में काम करता है।
जोस रिकार्डो

56

सुनिश्चित करें कि आपका libcurl.so मॉड्यूल सिस्टम लाइब्रेरी पथ में है, जो कि पाइथन लाइब्रेरी पथ से अलग और अलग है।

एक "क्विक फिक्स" इस पथ को LD_LIBRARY_PATH चर में जोड़ना है। हालाँकि, उस सिस्टम को चौड़ा (या यहाँ तक कि खाता चौड़ा) सेट करना एक BAD IDEA है, क्योंकि इसे इस तरह से सेट करना संभव है कि कुछ प्रोग्रामों में लाइब्रेरी मिलेगी, या इससे भी बदतर, सुरक्षा छेद खोलें।

यदि आपकी "स्थानीय रूप से स्थापित लाइब्रेरी" में स्थापित हैं, उदाहरण के लिए, / usr / स्थानीय / lib, इस निर्देशिका को /etc/ld.so.conf (यह एक पाठ फ़ाइल है) में जोड़ें और "ldconfig" चलाएं

कमांड एक कैशिंग उपयोगिता चलाएगा, लेकिन लोडर सिस्टम को कार्य करने के लिए आवश्यक सभी "प्रतीकात्मक लिंक" भी बनाएगा। यह आश्चर्य की बात है कि libcurl के लिए "मेक इनस्टॉल" ने पहले से ही ऐसा नहीं किया है, लेकिन यह संभव है कि यह नहीं हो सकता है अगर / usr / स्थानीय / lib /etc/ld.so.conf में पहले से ही नहीं है।

पुनश्च: यह संभव है कि आपके /etc/ld.so.conf में "ld.so.con..d.d / * शामिल हैं।" आप इसके बाद भी एक निर्देशिका पथ जोड़ सकते हैं, या बस उस निर्देशिका के अंदर एक नई फ़ाइल बना सकते हैं जिसे इसमें से शामिल किया जा रहा है। इसके बाद "ldconfig" चलाना न भूलें।

सावधान रहे। यह गलत हो रहा है आपके सिस्टम को खराब कर सकता है।

अतिरिक्त रूप से: सुनिश्चित करें कि आपका अजगर मॉड्यूल libcurl के THAT संस्करण के खिलाफ संकलित है। अगर आपने अभी कुछ फाइलों को दूसरे सिस्टम से कॉपी किया है, तो यह हमेशा काम नहीं करेगा। यदि संदेह है, तो अपने मॉड्यूल को उस सिस्टम पर संकलित करें जिसे आप उन्हें चलाने का इरादा रखते हैं।


धन्यवाद - यह काम किया। मुझे आश्चर्य है कि मेरे पहले के "त्वरित सुधार" ने LD_LIBRARY_PATH चर को बदलने का प्रयास क्यों नहीं किया।

2
बहुत सारे कारकों पर निर्भर करता है। यहां एक संभावना है: आपका कोड अपाचे या क्रोन से चलाया जा रहा था। वे प्रोग्राम आम तौर पर पर्यावरण को "साफ" करते हैं, इसलिए आपको पर्यावरण चर प्राप्त करने के लिए अतिरिक्त सामान करना होगा। उदाहरण के लिए, अपाचे में "सेटएएनवी", या क्रोन के लिए क्रॉस्टैब फ़ाइल में चर को सही सेट करना। गलतियों की संभावनाएं अनंत हैं!
Ch'marr

24

जब आप पहली बार में pycurl संकलित करते हैं, तो आप अपने उपयोगकर्ता वातावरण में LD_RUN_PATH को / usr / स्थानीय / lib में भी सेट कर सकते हैं। यह C एक्सटेंशन मॉड्यूल की RPATH विशेषता में / usr / स्थानीय / lib को एम्बेड करेगा। ताकि यह स्वचालित रूप से पता चल सके कि रन टाइम में लाइब्रेरी को कहां खोजना है बिना रन टाइम में LD_LIBRARY_PATH सेट करें।


4
वैकल्पिक रूप से, python setup.py build_ext --rpath=/usr/local/libविस्तार मॉड्यूल का उपयोग करते समय rpath
kanan

10

ठीक यही मुद्दा था। मैंने यह सुनिश्चित करने के लिए कर्ल 7.19 / ऑप्ट / कर्ल / स्थापित किया कि मैं अपने उत्पादन सर्वर पर वर्तमान कर्ल को प्रभावित नहीं करूंगा। एक बार मैंने libcurl.so.4 को / usr / lib से जोड़ा:

सुडो ln -s /opt / curl/lib/libcurl.so /usr/lib/libcurl.so.4

मुझे अभी भी वही त्रुटि मिली है! Durf।

लेकिन रनिंग ldconfig मेरे लिए लिंकेज बनाता है और वह काम करता है। LD_RUN_PATH या LD_LIBRARY_PATH को सेट करने की कोई आवश्यकता नहीं है। बस ldconfig चलाने की जरूरत है।


क्या होगा अगर मेरे पास सूडो विशेषाधिकार नहीं है? मैं ldconfig नहीं चला सकता? क्या उपरोक्त त्रुटि को दूर करने का कोई तरीका है?
प्रसन्ना

2
@SPRajagopal: यदि आपके पास सिस्टम विशेषताओं को संशोधित करने के लिए विशेषाधिकार नहीं हैं, तो आपको LD_LIBRARY_PATHऊपर वर्णित पर्यावरण चर विधि का उपयोग करना होगा । यदि आप इसे अपने में सेट नहीं करना चाहते हैं ~/.bashrc(उस सेटिंग को जोड़ना एक अच्छा विचार नहीं है IMO) आप एक शेल स्क्रिप्ट लिख सकते हैं जो इस चर को सेट करता है फिर अजगर चलाता है, फिर उस स्क्रिप्ट को कॉल करें।
MadScientist

8

उपरोक्त उत्तरों के पूरक के रूप में - मैं बस एक ऐसी ही समस्या से टकरा रहा हूं, और पूरी तरह से डिफ़ॉल्ट रूप से स्थापित अजगर पर काम कर रहा हूं।

जब मैं उस साझा ऑब्जेक्ट लाइब्रेरी का उदाहरण कहता हूं जिसे मैं देख रहा हूं LD_LIBRARY_PATH, तो मुझे कुछ इस तरह मिलता है:

$ LD_LIBRARY_PATH=/path/to/mysodir:$LD_LIBRARY_PATH python example-so-user.py
python: can't open file 'example-so-user.py': [Errno 2] No such file or directory

विशेष रूप से, यह आयात के बारे में भी शिकायत नहीं करता है - यह स्रोत फ़ाइल के बारे में शिकायत करता है!

लेकिन अगर मैं उपयोग करते हुए ऑब्जेक्ट को लोड करने पर मजबूर करता हूं LD_PRELOAD:

$ LD_PRELOAD=/path/to/mysodir/mypyobj.so python example-so-user.py
python: error while loading shared libraries: libtiff.so.5: cannot open shared object file: No such file or directory

... मुझे तुरंत एक अधिक सार्थक त्रुटि संदेश मिलता है - एक लापता निर्भरता के बारे में!

बस मैंने सोचा कि मैं इसे नीचे लिख दूंगा - चीयर्स!


क्या आप सुनिश्चित हैं कि ओपी की त्रुटि से पहले यह एक नई त्रुटि नहीं है?
डेविड निप्प

1

मैं उपयोग करता हूं python setup.py build_ext -R/usr/local/lib -I/usr/local/include/libcalg-1.0और संकलित .so फ़ाइल बिल्ड फ़ोल्डर के अंतर्गत है। आप python setup.py --help build_ext-R और -I के स्पष्टीकरण देखने के लिए टाइप कर सकते हैं


1

मेरे लिए यहां जो काम करता है वह एक संस्करण प्रबंधक जैसे कि pyenv का उपयोग करना है , जिसे मैं दृढ़ता से आपके प्रोजेक्ट वातावरण और पैकेज संस्करणों को अच्छी तरह से प्रबंधित करने और ऑपरेटिव सिस्टम से अलग करने की सलाह देता हूं।

ओएस अपडेट के बाद मेरी यही त्रुटि थी, लेकिन आसानी से तय किया गया था pyenv install 3.7-dev(जिस संस्करण का मैं उपयोग करता हूं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.