2009-07-08 13 views
90

मैं pycurl आयात करने की कोशिश कर रहा हूं:पायथन को साझा ऑब्जेक्ट्स क्यों नहीं मिल सकते हैं जो sys.path में निर्देशिका में हैं?

$ 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'] 

किसी भी मदद की सराहना की जाएगी।

+0

के स्पष्टीकरण देखने के लिए आप python setup.py --help build_ext टाइप कर सकते हैं, यदि आपने 'LD_LIBRARY_PATH' सही तरीके से सेट नहीं किया है (मैंने सोचा था कि आपकी टिप्पणी में एक गुम कॉलन था) तो मेरा अपडेट किया गया जवाब देखें। –

+1

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

उत्तर

124

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

कुछ अधिक जानकारी (source):

In Linux, the environment variable LD_LIBRARY_PATH is a colon-separated set of directories where libraries should be searched for first, before the standard set of directories; this is useful when debugging a new library or using a nonstandard library for special purposes. The environment variable LD_PRELOAD lists shared libraries with functions that override the standard set, just as /etc/ld.so.preload does. These are implemented by the loader /lib/ld-linux.so. I should note that, while LD_LIBRARY_PATH works on many Unix-like systems, it doesn't work on all; for example, this functionality is available on HP-UX but as the environment variable SHLIB_PATH, and on AIX this functionality is through the variable LIBPATH (with the same syntax, a colon-separated list).

अद्यतन: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/स्थानीय/lib $ LD_LIBRARY_PATH /usr/स्थानीय/lib लेकिन मैं अभी भी एक ही त्रुटि मिलती है: $ अजगर -c "आयात pycurl" Traceback (सबसे हालिया कॉल अंतिम): फ़ाइल "", लाइन 1, आयात त्रुटि: libcurl.so.4: साझा ऑब्जेक्ट फ़ाइल नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका –

+1

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

46

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

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

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

इस निर्देशिका जोड़ने

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

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

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

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

+0

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

+1

कई कारकों पर निर्भर करता है। यहां एक संभावना है: आपका कोड अपाचे या क्रॉन से चलाया जा रहा था। वे कार्यक्रम आमतौर पर पर्यावरण को "साफ" करते हैं, इसलिए आपको पर्यावरण चर प्राप्त करने के लिए अतिरिक्त सामान करना पड़ता है। उदाहरण के लिए, अपाचे में "SetEnv", या cron के लिए crontab फ़ाइल में चर दाएं सेट करना। गलतियों की संभावनाएं अनंत हैं! –

+0

ग्रेट उत्तर, धन्यवाद – glarrain

22

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

+0

+1 जो मैं खोज रहा था। धन्यवाद! –

+3

वैकल्पिक रूप से, 'पायथन सेटअप का उपयोग करें।py build_ext --rpath =/usr/local/lib' * rpath * – kynan

+0

में सेंकने के लिए एक्सटेंशन मॉड्यूल का निर्माण करते समय धन्यवाद यह 'ldconfig' चलाने के लिए स्वीकृत उत्तर –

8

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

sudo ln -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4

मैं अभी भी मिल गया एक ही त्रुटि! Durf।

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

+0

+1 होना चाहिए, सभी त्रुटियों को ठीक किया गया –

+0

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

+1

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

7

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

जब मैं साझा वस्तु पुस्तकालय मैं 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 

... मैं तुरंत और अधिक सार्थक त्रुटि संदेश मिलता है - के बारे में याद आ रही निर्भरता!

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

+0

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

0

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

संबंधित मुद्दे