Sto cercando di ottenere un codice accademico open source funzionante (il progetto home è here). È una grande base di codice C++ con un wrapper python (molto) sottile che utilizza CDLL
per caricare il C++ e chiamare alcune funzioni C disponibili per consentire lo scripting Python primitivo del codice.python che carica c lib con CDLL, non vede le librerie nel percorso python
Tuttavia, il codice iniziale di importazione si blocca perché non riesce a trovare i file .so seduti accanto ad essa in site-packages:
nel file installato:
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"
e in uno script o l'interprete:
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
altre risposte might seem to have this covered, ma questo funziona solo se CDLL()
è chiamato all'interno dello script in realtà invocato (o la directory di lavoro del prompt che ha eseguito l'interprete), cioè se il 'percorso relativo' è nello spazio utente, piuttosto che in python-library-space.
Come installiamo in modo affidabile per importare una libreria C/C++ che abbiamo creato da soli? A corto di inquinare le posizioni delle librerie di sistema come /usr/lib
, che non è molto pitone, non riesco a vedere una soluzione facile.
(EDIT: corretto nomi delle funzioni, refactoring chiaro inutile dispiace!!)
ulteriore: la libreria in questione aveva un simbolo mancante, quindi questo codice avrebbe potuto mascherare un errore diverso; non si dovrebbe presumere di sapere qual è l'eccezione di sistema e lanciare la tua! In realtà, la domanda è ancora valida dopo ulteriori indagini; il sistema * stava * lanciando l'errore corretto la prima volta (ho provato questo copiando il file .so in '/ usr/lib' ed eseguendo' CDLL() 'dal prompt interattivo.) – tehwalrus