পাইথন 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 অনেকগুলি ইউনিক্স-মতো সিস্টেমে কাজ করে, এটি সমস্ত ক্ষেত্রে কাজ করে না; উদাহরণস্বরূপ, এই কার্যকারিতাটি এইচপি-ইউএক্স এ উপলব্ধ তবে পরিবেশগত পরিবর্তনশীল 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
ধন্যবাদ। আমার এলডি_লিবিআরএআইপিএটি সেট করা হয়নি, সুতরাং: D এলডি_লিবারি_প্যাথ = / ইউএসআর / লোকাল / লাইব $ এলডি_লিবারি_প্যাথ / ইউএসআর / লোকাল / লাইব তবে আমি এখনও একই ত্রুটি পেয়েছি: $ পাইথন-সি "আমদানি পাইকারল" ট্রেসব্যাক (সর্বশেষতম কল): ফাইল "<স্ট্রিং>", লাইন 1, <মডুল> আমদানি ত্রুটি: libcurl.so.4: ভাগ করা অবজেক্ট ফাইলটি খুলতে পারে না: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই

2
আমার ব্যবহারকারীকে এলডি_লিবিআরএআরএফটি ভেরিয়েবল সেট করার পরে লাইব্রেরি পড়ার অনুমতিও দিতে হয়েছিল। এখন অবশেষে এটি কাজ করে।
জোসে রিকার্ডো

56

আপনার libcurl.so মডিউলটি সিস্টেম লাইব্রেরির পাথে রয়েছে তা নিশ্চিত করুন, যা পাইথন লাইব্রেরি পথ থেকে পৃথক এবং পৃথক।

একটি "কুইক ফিক্স" হ'ল এই পাথটিকে একটি এলডি_আইবিআরবিআরএইপিএটিএইচ ভেরিয়েবলের সাথে যুক্ত করা। তবে, সিস্টেমের প্রশস্ত (বা এমনকি অ্যাকাউন্ট প্রশস্ত) সেট করা একটি বিএডি আইডিইএ, কারণ এটি এমনভাবে সেট করা সম্ভব যে কোনও প্রোগ্রামগুলি এমন একটি লাইব্রেরি খুঁজে পাবে যা এটির উচিত নয় বা আরও খারাপ, সুরক্ষা গর্তগুলি খুলতে পারে।

যদি আপনার "স্থানীয়ভাবে ইনস্টল করা লাইব্রেরি" ইনস্টল করা থাকে, উদাহরণস্বরূপ, / usr / local / lib, এই ডিরেক্টরিটি /etc/ld.so.conf এ যুক্ত করুন (এটি একটি পাঠ্য ফাইল) এবং "ldconfig" চালান

কমান্ডটি একটি ক্যাচিং ইউটিলিটি চালাবে, তবে লোডার সিস্টেমটি কার্যকর করতে প্রয়োজনীয় সমস্ত "প্রতীকী লিঙ্কগুলি" তৈরি করবে। অবাক করা বিষয় যে লাইবকার্লের জন্য "মেক ইনস্টল" এটি ইতিমধ্যে না করে তবে এটি সম্ভব যে যদি / ইউএসআর / লোকাল / লিব ইতিমধ্যে /etc/ld.so.conf এ না থাকে তবে এটি সম্ভব না।

PS: এটি সম্ভবত সম্ভব যে আপনার /etc/ld.so.conf এ "ld.so.conf.d / *। কনফিড অন্তর্ভুক্ত" ছাড়া আর কিছু নেই। আপনি এর পরেও একটি ডিরেক্টরি পাথ যুক্ত করতে পারেন, বা কেবল এটির ডিরেক্টরি অন্তর্ভুক্ত করা হচ্ছে তার ভিতরে একটি নতুন ফাইল তৈরি করতে পারেন। এর পরে "ldconfig" চালাতে ভুলবেন না।

সতর্ক হোন. এই ভুলটি পেতে আপনার সিস্টেমে স্ক্রু তৈরি করতে পারে।

অতিরিক্তভাবে: নিশ্চিত করুন যে আপনার পাইথন মডিউলটি libcurl এর যে সংস্করণটির সাথে সংকলিত হয়েছে। আপনি যদি কেবল অন্য সিস্টেম থেকে কিছু ফাইল অনুলিপি করেন তবে এই অভ্যাস সবসময় কাজ করবে না। যদি সন্দেহ হয় তবে আপনার মডিউলগুলি যে সিস্টেমে চালনা করার তা আপনি তৈরি করতে চান।


আপনাকে ধন্যবাদ - এটি কাজ করেছে। আমি অবাক হয়েছি কেন আগে আমার LD_LIBRARY_PATH ভেরিয়েবলটি পরিবর্তন করার "দ্রুত সমাধান" চেষ্টা করেছিল।

2
অনেক কারণের উপর নির্ভর করে। এখানে একটি সম্ভাবনা রয়েছে: আপনার কোডটি অ্যাপাচি বা ক্রোন থেকে চালানো হয়েছিল। এই প্রোগ্রামগুলি সাধারণত পরিবেশকে "ক্লিন আউট" করে দেয়, সুতরাং পরিবেশের ভেরিয়েবলগুলি পেতে আপনাকে অতিরিক্ত স্টাফ করতে হবে For উদাহরণস্বরূপ, অ্যাপাচিতে "সেটইএনভি", বা ক্রোনবের জন্য ফাইলটি ভেরিয়েবলের ডানদিকে সেট করা। ভুলের সম্ভাবনা অবিরাম!
Ch'marr

24

আপনি প্রথম স্থানে পাইকারল সংকলন করার সময় আপনি আপনার ব্যবহারকারী পরিবেশে LD_RUN_PATH / usr / স্থানীয় / lib সেট করতে পারেন। এটি সি এক্সটেনশান মডিউলের আরপিএটিএইচ বৈশিষ্ট্যে এম্বেড / ইউএসআর / স্থানীয় / লিব এম্বেড করবে so সুতরাং এটি স্বয়ংক্রিয়ভাবে জানতে পারে রান চলাকালীন সময়ে LD_LIBRARY_PATH সেট না করে রান গ্রন্থাগারটি কোথায় পাওয়া যায়।


4
বিকল্পভাবে, আরপথেpython setup.py build_ext --rpath=/usr/local/lib বেক করার জন্য এক্সটেনশন মডিউলটি তৈরি করার সময় ব্যবহার করুন
kynan

10

ঠিক একই সমস্যা ছিল। আমি আমাদের উত্পাদন সার্ভারগুলিতে বর্তমান কার্লকে প্রভাবিত করব না তা নিশ্চিত করতে আমি 7.19 থেকে / opt / curl / curl ইনস্টল করেছি। একবার আমি libcurl.so.4 এর সাথে / usr / lib যুক্ত করেছি:

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

আমি এখনও একই ত্রুটি পেয়েছি! Durf।

তবে ldconfig চালানো আমার জন্য সংযোগ তৈরি করে এবং এটি কাজ করে। একেবারেই এলডি_আরুন_প্যাট বা এলডি_লিবিআরএআইপিএটিএল সেট করার দরকার নেই। Ldconfig চালানোর দরকার ছিল মাত্র।


আমার কি সুডো সুবিধা না থাকলে? আমি ldconfig চালাতে পারি না? উপরের ত্রুটিটি পরিষ্কার করার কোনও উপায় আছে কি?
প্রশান্না

2
@ এসএসরাজাগোপাল: যদি আপনার LD_LIBRARY_PATHউপরে বর্ণিত পরিবেশ পরিবর্তনশীল পদ্ধতিটি ব্যবহার করতে হয় তবে সিস্টেম বৈশিষ্ট্যগুলিকে সংশোধন করার অধিকার না থাকলে । আপনি যদি এটিতে সেট করতে না চান ~/.bashrc(সেটিংটি কোনও ভাল আইএমও নয় এটি যোগ করে) আপনি একটি শেল স্ক্রিপ্ট লিখতে পারেন যা এই ভেরিয়েবলটি সেট করে তারপরে অজগর চালায়, তারপরে সেই স্ক্রিপ্টটি কল করুন।
ম্যাড সায়েন্টিস্ট

8

উপরের উত্তরের পরিপূরক হিসাবে - আমি কেবল একই ধরণের সমস্যায় পড়ছি এবং ডিফল্ট ইনস্টলড পাইথনের সম্পূর্ণ কাজ করছি working

আমি যখন ভাগ করা অবজেক্ট লাইব্রেরির সাথে সন্ধান করছি তার উদাহরণটি কল করি, তখন আমি 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-আর এবং -আই এর ব্যাখ্যা দেখতে টাইপ করতে পারেন


1

আমার জন্য এখানে যা কাজ করে তা হল পায়েনভের মতো একটি সংস্করণ পরিচালক ব্যবহার করা যা আমি আপনার প্রকল্পের পরিবেশ এবং প্যাকেজ সংস্করণগুলি ভালভাবে পরিচালিত এবং অপারেটিভ সিস্টেমের থেকে পৃথক করার জন্য দৃ strongly়ভাবে সুপারিশ করি।

কোনও ওএস আপডেটের পরে আমার একই ত্রুটি ছিল, তবে সহজেই pyenv install 3.7-dev(আমার ব্যবহার করা সংস্করণ) দিয়ে ঠিক করা হয়েছিল ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.