पायथन निष्पादन योग्य लिबाय्थथॉन साझा पुस्तकालय नहीं ढूंढ रहा है


143

मैं सेंटोस 5 पर पायथन 2.7 स्थापित कर रहा हूं। मैंने पायथन को निम्न प्रकार से बनाया और स्थापित किया है

./configure --enable-shared --prefix=/usr/local
make
make install

जब मैं / usr / स्थानीय / बिन / अजगर को चलाने की कोशिश करता हूं, तो मुझे यह त्रुटि संदेश मिलता है

/usr/local/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory

जब मैं / usr / स्थानीय / बिन / अजगर पर ldd चलाते हैं, तो मुझे मिलता है

ldd /usr/local/bin/python
    libpython2.7.so.1.0 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030e9a00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000030e9200000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00000030fa200000)
    libm.so.6 => /lib64/libm.so.6 (0x00000030e9600000)
    libc.so.6 => /lib64/libc.so.6 (0x00000030e8e00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000030e8a00000)

मैं पायथन को कैसे बताऊं कि लिबायथॉन कहां है?

जवाबों:


204

निम्नलिखित आज़माएँ:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python

/usr/local/libउस फ़ोल्डर से बदलें जहाँ आपने स्थापित किया है libpython2.7.so.1.0यदि वह अंदर नहीं है /usr/local/lib

यदि यह काम करता है और आप परिवर्तनों को स्थायी बनाना चाहते हैं, तो आपके पास दो विकल्प हैं:

  1. अपने होम डायरेक्टरी में अपने export LD_LIBRARY_PATH=/usr/local/libको जोड़ें .profile(यह केवल तभी काम करता है जब आप एक शेल का उपयोग कर रहे हैं जो इस फ़ाइल को लोड करता है जब एक नया शेल इंस्टेंस शुरू होता है)। यह सेटिंग केवल आपके उपयोगकर्ता को प्रभावित करेगी।

  2. जोड़े /usr/local/libको /etc/ld.so.confऔर चलाने के ldconfig। यह निश्चित रूप से एक सिस्टम-वाइड सेटिंग है।


क्या इसे निर्यात करने का कोई तरीका है ताकि यह ग्रहण के साथ काम करे? मैंने इसे अपने प्रॉफ़िटेबल में जोड़ लिया है, लेकिन फिर ग्रहण जीडीबी लॉन्च करने में सक्षम नहीं है। (नोट: इसे जोड़ने के लिए ld.so.conf हालांकि काम करता है)
सेरटन

इसलिए मैंने जांच की कि पर्यावरण चर किसके साथ चल रहे हैं और इसमें उचित LD_LIBRARY_PATH है। मेरा मानना ​​है कि जब यह GDB लॉन्च करता है तो यह किसी भी शेल का उपयोग नहीं करता है और इसलिए इसे कोई पर्यावरण चर नहीं मिलता है! डिबग कॉन्फिगरेशन में लिबायथॉन सेट करना न तो तब से मदद करता है, जब तक कि केवल gdb वास्तव में लोड नहीं होता है (लेकिन मुझे लोड करने के लिए gdb के लिए lib की आवश्यकता है)
सेडरन

1
जब आप gdbकमांड लाइन से चलते हैं तो क्या आप एप्लिकेशन को सफलतापूर्वक डिबग कर सकते हैं और LD_LIBRARY_PATH को टर्मिनल में ठीक से सेट किया गया है? यदि नहीं, तो आपको संभवतः अपनी .gdbinitफ़ाइल में LD_LIBRARY_PATH सेट करना होगा । अधिक जानकारी के लिए यह उत्तर देखें: stackoverflow.com/a/7041845/156771
तमसे

मुझे लॉन्च के लिए LD_LIBRARY_PATH की आवश्यकता है (python libs) मेरे आवेदन के वास्तविक डिबगिंग के लिए नहीं। अब तक मैं इसे केवल ldconfig में सेट करके ठीक करने में कामयाब रहा हूं। मैं सीएलआई के माध्यम से आवेदन को डीबग कर सकता हूं क्योंकि यह मेरी ZSHRC फ़ाइल से LD_LIBRARY_PATH पिक करेगा।
सेटरन

10
बस यह कोशिश करने वाले किसी व्यक्ति के लिए एक नोट: यह सिर्फ "/ usr / स्थानीय / कामगार" है, न कि "मूल" के रूप में "ld.so.conf.d / *। Conf" शामिल करने के लिए एक प्रारंभिक "शामिल है"।
समयसीमा

79

मेरी कब्र पर टोपी डाल ...

सबसे अच्छा तरीका है कि मैं यह पता करने के लिए मिल गया है संकलन समय पर है। चूँकि आप वैसे भी एक उपसर्ग स्थापित कर रहे हैं, साथ ही निष्पादन योग्य को स्पष्ट रूप से बता सकते हैं कि इसकी साझा लाइब्रेरी कहाँ मिलेगी। ओपनएसएसएल और अन्य सॉफ्टवेयर पैकेजों के विपरीत, पायथन आपको वैकल्पिक लाइब्रेरी रास्तों को संभालने के लिए अच्छा कॉन्फ़िगर निर्देश नहीं देता है (हर कोई आपको पता है कि रूट है ...) सबसे आसान मामले में आपको निम्नलिखित की आवश्यकता है:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-Wl,--rpath=/usr/local/lib"

या यदि आप नॉन-लाइनक्स संस्करण पसंद करते हैं:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-R/usr/local/lib"

" rpath" ध्वज अजगर को बताता है कि उसके पास उस विशेष पथ में रनटाइम लाइब्रेरी है। मानक सिस्टम स्थानों की तुलना में भिन्न स्थान पर स्थापित निर्भरता को संभालने के लिए आप इस विचार को आगे ले जा सकते हैं। उदाहरण के लिए, मेरे सिस्टम पर चूंकि मेरे पास रूट एक्सेस नहीं है और लगभग पूरी तरह से स्व-निहित पायथन स्थापित करने की आवश्यकता है, मेरी कॉन्फ़िगर लाइन इस तरह दिखती है:

./configure --enable-shared \
            --with-system-ffi \
            --with-system-expat \
            --enable-unicode=ucs4 \
            --prefix=/apps/python-${PYTHON_VERSION} \
            LDFLAGS="-L/apps/python-${PYTHON_VERSION}/extlib/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/extlib/lib" \
            CPPFLAGS="-I/apps/python-${PYTHON_VERSION}/extlib/include"

इस मामले में मैं पुस्तकालयों संकलन कर रहा हूँ कि अजगर उपयोग करता है (जैसे ffi, readline, आदि) एक में extlibअजगर निर्देशिका वृक्ष के भीतर ही निर्देशिका। इस तरह से मैं अजगर - $ {PYTHON_VERSION} डायरेक्टरी को टारगेट कर सकता हूं और इसे कहीं भी लैंड कर सकता हूं और यह "काम" करेगा (बशर्ते आप इसमें भाग libcया libmसंघर्ष न करें)। यह भी मदद करता है जब आप एक ही बॉक्स पर पायथन के कई संस्करणों को चलाने की कोशिश कर रहे हैं, क्योंकि आपको अपने को बदलते रहने की आवश्यकता नहीं हैLD_LIBRARY_PATH पायथन लाइब्रेरी के गलत संस्करण को चुनने के बारे में चिंता को या चिंता ।

संपादित करें: उल्लेख करना भूल गए, संकलन शिकायत करेगा यदि आप PYTHONPATHपर्यावरण के चर को अपने उपसर्ग के रूप में उपयोग नहीं करते हैं और कुछ मॉड्यूल संकलित करने में विफल रहते हैं, उदाहरण के लिए, उपरोक्त उदाहरण का विस्तार करने के लिए, PYTHONPATHउपरोक्त में प्रयुक्त उपसर्ग को सेट करें उदाहरण के साथ export PYTHONPATH=/apps/python-${PYTHON_VERSION}...


//, यह वैसा दिखता है जैसा मैं देख रहा हूं। मुझे "पायथन-संस्करण निर्देशिका को टार करने और इसे कहीं भी लैंड करने के तरीकों के बारे में अधिक जानकारी मिल सकती है और यह" काम करेगा "(बशर्ते आप लिबास या लिबम संघर्षों में नहीं भागते)" ? क्या आपको लगता है कि यह अलग से stackoverflow.com बनाने के लायक है?
नाथन बसानी

//, इसके अलावा, किसी को कैसे सेट करना चाहिए $PYTHON_VERSION?
नाथन बसानी 21

//, मैं $PYTHON_VERSIONकॉन्फ़िगर करने के बाद सेट करता हूं । $PYTHON_VERSIONहालांकि, सेट के साथ भी, कंपाइलर के बारे में शिकायत हैPython build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
नाथन बासानी

//, क्या इसके लिए makeकमांड और अन्य इंस्टॉलेशन कमांड में किसी भी संशोधन की आवश्यकता है ?
नाथन बसानी 22

1
@NathanBasanese लापता bz2, शाप, gdbm, lzma, आदि के मामले में, आप पहले से ही /apps/python-${PYTHON_VERSION}/extlibउनके पुस्तकालयों और शीर्षकों को खोजने के लिए पायथन बनाने के लिए उचित स्थान पर हैं सुनिश्चित करने के लिए उपसर्ग के साथ उनमें से प्रत्येक को संकलित करने की आवश्यकता होगी । सिस्टम स्तर पैकेज के रूप में, आप शायद पहले से ही उन लोगों को स्थापित करने के लिए एक रूट उपयोगकर्ता पर निर्भर हो जाएंगे। या एक ऐसा विकल्प ढूंढना, जिसे संकलित किया जा सकता है औरextlib
Foosh

21

मुझे भी यही समस्या थी और मैंने इसे इस तरह हल किया:

यदि आप जानते हैं कि लिबासथॉन किस स्थान पर रहता है, तो मेरा मानना ​​है कि यह /usr/local/lib/libpython2.7.so.1.0आपके मामले में होगा , आप इसे केवल एक प्रतीकात्मक लिंक बना सकते हैं:

sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0

फिर फिर से चलाने की कोशिश lddकरें और देखें कि क्या यह काम करता है।


6

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

tail /var/log/httpd/error_log
AH01215: /opt/rh/rh-python35/root/usr/bin/python: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory

मैं एक ऐसे सिस्टम परमानेंट सॉल्यूशन चाहता था, जो सभी यूजर्स के लिए काम करे, ताकि एक्सपोर्ट स्टेटमेंट को .profile या .bashrc फाइल्स में शामिल न किया जाए। Red Hat समाधान पृष्ठ पर आधारित एक एक पंक्ति समाधान है । टिप्पणी के लिए धन्यवाद जो इसे इंगित करता है:

echo 'source scl_source enable rh-python35' | sudo tee --append /etc/profile.d/python35.sh

पुनः आरंभ करने के बाद, शेल पर यह सब अच्छा है, लेकिन कभी-कभी मेरा वेब सर्वर अभी भी शिकायत करता है। एक और दृष्टिकोण है जो हमेशा शेल और सर्वर दोनों के लिए काम करता है, और अधिक सामान्य है। मैंने यहां समाधान देखा और फिर महसूस किया कि यह वास्तव में यहां भी एक उत्तर में वर्णित है! वैसे भी, CentOS 7 पर, ये चरण हैं:

 vim /etc/ld.so.conf

जो मेरी मशीन पर बस था:

include ld.so.conf.d/*.conf

इसलिए मैंने एक नई फ़ाइल बनाई:

vim /etc/ld.so.conf.d/rh-python35.conf

और जोड़ा:

/opt/rh/rh-python35/root/usr/lib64/

और कैश को मैन्युअल रूप से पुनर्निर्माण करने के लिए:

sudo ldconfig

यही है, स्क्रिप्ट ठीक काम!

यह एक अस्थायी समाधान था, जो रीबूट में काम नहीं करता था:

sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v

-V (क्रिया) विकल्प सिर्फ यह देखने के लिए था कि क्या चल रहा है। मैंने देखा कि इसने किया: / ऑप्ट / आरएच / आरएच-पाइथन 35 / रूट / यूएसआर / लीबी 64: libpython3.so.rh-python35 -> libpython3.so.rh-python35 libpython3.5m.so.rh-python35-1-1। libpython3.5m.so.rh-python35-1.0

यह विशेष त्रुटि दूर हो गई। संयोग से, मुझे chownउपयोगकर्ता को उसके बाद एक अनुमति त्रुटि से छुटकारा पाने के लिए अपाचे करना पड़ा ।

ध्यान दें कि मैं प्रयोग किया जाता है खोजने के पुस्तकालय के लिए निर्देशिका का पता लगाने की। आप भी कर सकते हैं:

sudo yum install mlocate
sudo updatedb
locate libpython3.5m.so.rh-python35-1.0

मेरे वीएम रिटर्न पर कौन सा:

/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0

जो कि मुझे ldconfig को देने की आवश्यकता है, जैसा कि ऊपर दिखाया गया है।


1
: आप /etc/profile.d के लिए जा रहा है और उस में निम्नलिखित के साथ एक फ़ाइल बनाने के द्वारा अपने आप को कुछ परेशानी रक्षा कर सकता था #!/bin/bashऔर source scl_source enable rh-python35उस में। access.redhat.com/solutions/527703
डग

2

सोलारिस 11 पर

LD_LIBRARY_PATH_64अजगर के लिबास में सिमलिंक को हल करने के लिए उपयोग करें ।

Python3.6 के लिए मेरे मामले में LD_LIBRARY_PATHकाम नहीं किया लेकिनLD_LIBRARY_PATH_64 किया।

उम्मीद है की यह मदद करेगा।
सादर


1

यह मेरे लिए काम किया ...

$ sudo apt-get install python2.7-dev

नमस्ते यह सही समाधान नहीं है, क्योंकि इसके बाद, आपका कस्टम बिल्ड पायथन बाइनरी आपके द्वारा apt-get से स्थापित किए गए .so का उपयोग कर रहा है। जब उनके समान संस्करण होते हैं, तो यह समस्या हो सकती है, या यदि आपने अजगर स्रोत कोड को संशोधित किया है, तो यह प्रयास नहीं करेगा।
अजूसा नाकानो

0

मैंने कमांड का उपयोग कर स्थापित किया:

./configure --prefix=/usr       \
            --enable-shared     \
            --with-system-expat \
            --with-system-ffi   \
            --enable-unicode=ucs4 &&

make

अब, रूट उपयोगकर्ता के रूप में:

make install &&
chmod -v 755 /usr/lib/libpython2.7.so.1.0

फिर मैंने अजगर को मारने की कोशिश की और त्रुटि मिली:

/ usr / स्थानीय / बिन / अजगर: साझा पुस्तकालयों को लोड करते समय त्रुटि: libpython2.7.so.1.0: साझा की गई वस्तु फ़ाइल को नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं

फिर, मैंने रूट उपयोगकर्ता से लॉग आउट किया और फिर से पायथन को निष्पादित करने का प्रयास किया और इसने सफलतापूर्वक काम किया।


0

सभी की जरूरत है libpython [3 या 2] देव फ़ाइलों की स्थापना।


-1

बस अजगर- lib स्थापित करें। (Python27-लिब)। यह libpython2.7.so1.0 स्थापित करेगा। हमें मैन्युअल रूप से कुछ भी सेट करने की आवश्यकता नहीं है।


4
//, और यदि आप कह रहे हैं, CEntOS 6.3? यह काम नहीं करता है, और आमतौर पर लोग पायथन को एक ऐसे मामले से निपटने के लिए तैयार कर रहे हैं, जहां सिस्टम पायथन एक अजीब संस्करण है, टूटा हुआ, अविश्वसनीय, या समग्र प्रणाली को छूने के लिए कुछ अन्य इच्छा नहीं है।
नाथन बसानी 21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.