2012-02-04 10 views
5

में पुस्तकालयों को नहीं देखता है मैं कुछ ओपन सोर्स अकादमिक कोड काम करने की कोशिश कर रहा हूं (प्रोजेक्ट होम here है)। यह एक (बहुत) पतला पायथन आवरण वाला एक बड़ा सी ++ कोडबेस है जो सी ++ को लोड करने के लिए CDLL का उपयोग करता है और कोड के आदिम पायथन स्क्रीप्टिंग को अनुमति देने के लिए उपलब्ध कुछ सी फ़ंक्शंस को कॉल करता है।सीडीएलएल के साथ पायथन लोडिंग सी lib, पाइथन पथ

हालांकि, शुरुआती आयात कोड दुर्घटनाओं क्योंकि यह साइट-संकुल में यह के बगल में बैठे .so फ़ाइलें नहीं मिल सकता है:

from ctypes import * 

try: 
    self.lib = CDLL("_lammps.so") 
except: 
    try: 
    self.lib = CDLL("_lammps_serial.so") 
    except: 
    raise OSError,"Could not load LAMMPS dynamic library" 

और एक स्क्रिप्ट में:

स्थापित फ़ाइल में

या दुभाषिया:

from lammps import lammps 
l = lammps() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "lammps.py", line 42, in __init__ 
    raise OSError,"Could not load LAMMPS dynamic library" 
OSError: Could not load LAMMPS dynamic library 

अन्य उत्तर might seem to have this covered, लेकिन यह केवल काम करता है अगर CDLL() स्क्रिप्ट वास्तव में लागू भीतर कहा जाता है (या कार्यशील निर्देशिका दुभाषिया चलाने वाले संकेत का) - यानी अगर 'सापेक्ष पथ' पाइथन-लाइब्रेरी-स्पेस के बजाय उपयोगकर्ता-स्थान में है।

हम एक सी/सी ++ लाइब्रेरी आयात करने के लिए विश्वसनीय रूप से कैसे स्थापित करते हैं जिसे हमने स्वयं बनाया है? /usr/lib जैसे सिस्टम लाइब्रेरी स्थानों को प्रदूषित करने का छोटा, जो बहुत पाइथनिक नहीं है, मुझे एक आसान समाधान नहीं दिखाई दे रहा है।

(संपादित करें: ठीक किया समारोह के नाम, स्पष्ट नहीं रिफैक्टरिंग बेकार खेद है!!) Strace -eopen तहत

+0

आगे: प्रश्न में पुस्तकालय में एक प्रतीक गायब था, इसलिए इस कोड में एक अलग त्रुटि मास्क हो सकती थी; आपको यह नहीं समझना चाहिए कि सिस्टम अपवाद क्या है और अपना खुद का फेंक दो! वास्तव में, प्रश्न आगे की जांच के बाद भी वैध है; सिस्टम * पहली बार सही त्रुटि फेंक रहा था (मैंने एसएसओ को '/ usr/lib' पर कॉपी करके और इंटरैक्टिव प्रॉम्प्ट से' सीडीएलएल() 'चलाकर इसका परीक्षण किया।) – tehwalrus

उत्तर

1

भागो, तो आप कुछ इस तरह देखेंगे:

open("tls/x86_64/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("tls/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("x86_64/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 6 
open("/lib/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/usr/lib/_lammps.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 

कौन सा आप सभी स्थान जहां अजगर से पता चलता ctypes आपकी पुस्तकालय के लिए देखता है। अब तक मैं अपने सिस्टम पर खोज स्थानों को जोड़ने के लिए रनटाइम पर्यावरण परिवर्तनीय ट्विक खोजने में असमर्थ था, शायद आपको पूर्ण पथ का उपयोग करना होगा।

+0

धन्यवाद, मैं इसे देख लूंगा मुझे एक पल मिलता है। मै मैक ओएस एक्स पर हूं, इसलिए मुझे अपने स्ट्रेस सुझाव को ड्रेट्रेस करना होगा (जो उम्मीद है कि बहुत बुरा नहीं होना चाहिए)। – tehwalrus

1

आप आयात कर रहे पैकेज में __file__ चर का उपयोग कर सकते हैं। __file__ से पूर्ण, पूर्ण निर्देशिका पथ निकालने के लिए बस os.path के विभिन्न कार्यों का उपयोग करें, और फिर इसे अपने पुस्तकालय फ़ाइल नाम में शामिल करें। कुछ की तरह:

temp = os.path.abspath(__file__) 
temp = os.path.realpath(temp) 
temp = os.path.dirname(temp) 
temp = os.path.join(temp, "_lammps.so") 
lib = CDLL(path) 

तुम भी यदि अपने मूल फ़ाइल नाम के विभिन्न रूपों की कोशिश करना चाहते हो सकता है (.dll या .dylib बजाय .so, साथ और के साथ और एक lib उपसर्ग के बिना, यानी, और संस्करण संख्या शायद यह भी साथ जोड़ा जाता है) आप मंच-स्वतंत्र होना चाहते हैं, और आपकी बिल्ड प्रणाली संभवतः ऐसी चीजें उत्पन्न कर सकती है। आप या तो स्वीकार्य एक खोजने में मदद के लिए कई संस्करणों का प्रयास कर सकते हैं, या केवल glob.glob का उपयोग कर सकते हैं।

मुझे कहना है कि मुझे लगता है कि यह अजीब बात है कि मानक पुस्तकालय में ऐसा कोई कार्य मौजूद नहीं है। ctypes.util.find_library इस तरह के उपयोग के लिए काफी लचीला (या पूरी तरह से पर्याप्त नहीं है) जो मुझे लगता है कि व्यापक था)। फ़ाइल के लिए PYTHONPATH के माध्यम से खोजे गए एक फ़ंक्शन भी काफी उपयोगी थे (हालांकि लिखना मुश्किल नहीं था)।

फिर, ऐसा लगता है कि यदि आप LD_LIBRARY_PATH पर सही निर्देशिका जोड़ते हैं, तो आप should be able to load it पर सही निर्देशिका जोड़ते हैं।

2
लिनक्स पर

इम, सब मैं इस मुद्दे ओएस मॉड्यूल से निरपेक्ष पथ में डाल दिया गया था ठीक करने के लिए किया था, और यह काम करता है

from ctypes import * 
import os 

xss = cdll.LoadLibrary(os.path.abspath("libxss.so.1")) 
print xss.xss_test_1() 

यह अजगर 2.7 के साथ-साथ है।

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