2012-03-18 2 views
0

У меня вопрос.Пользовательская библиотека Python бросает ImportError только в ArchLinux

У меня есть Makefile, который компилирует некоторый код C с Python.h в файл .so. Я добавил сообщение @install -m, чтобы поместить файл .so в /usr/local/lib/python2.7/dist-packages, и когда я импортировал эту библиотеку изнутри своих сценариев Python, она отлично работала в Ubuntu 11.10.

В конце концов мне пришлось запустить все это в Arch Linux, и я заметил, что существует только один файл с именем dist-packages и никакой каталог, а также нет ничего внутри /usr/local/lib, а python2.7 - в /usr/lib. Поэтому я изменил путь установки на /usr/lib/python2.7/site-packages. Теперь он выдает эту ошибку:

ImportError: <objectname>.so: Cannot open shared object file: No such file or directory

Когда я сделать с помощью Makefile, то .so файла также получает созданный в локальном каталоге, который должен уже работать, не подвергая этот .so файл в этом указанном пути. Путь, где я помещаю этот файл .so, находится в sys.path в Python2.7. Я не знаю, как решить эту проблему.

Я добавляю полный Makefile здесь для лучшего понимания:

PYTHON_VERSION = 2.7 

PYINC = /usr/include/python$(PYTHON_VERSION) 
PYLIB = python$(PYTHON_VERSION) 
NUMPYINC = /usr/lib/python2.7/site-packages/numpy/core/include/ 

BASIC_NAME = vision 
LIB_NAME = lib$(BASIC_NAME).so 
MODULE_NAME = $(BASIC_NAME).so 

all:: $(MODULE_NAME) 

#link compiled python wrapper code with c code and generate python module 
$(MODULE_NAME): $(LIB_NAME) vision.o 
     gcc -shared -Wall vision.o -o $(MODULE_NAME) -l$(PYLIB) -L. -l$(BASIC_NAME)  

#generate c library, consisting of compiled c files (object files) 
$(LIB_NAME): fireflymv.o image.o 
     gcc -shared -Wall fireflymv.o image.o -o $(LIB_NAME) -ldc1394 

#compile single c code file (basic c code) 
fireflymv.o: fireflymv.c fireflymv.h 
     gcc -Wall -fPIC -o fireflymv.o -c fireflymv.c 

#compile single c code file (basic c code) 
image.o: image.c image.h 
     gcc -Wall -fPIC -o image.o -c image.c 

#compile single c code file (python wrapper code) 
vision.o: vision.c 
     gcc -Wall -fPIC -I$(PYINC) -I$(NUMPYINC) -o vision.o -c vision.c 

#install basic c code library into linux system (root permissions required) 
install: 
     @echo Installing $(LIB_NAME) and $(MODULE_NAME) to /usr/local/lib 
     @install -m 0777 $(LIB_NAME) /usr/local/lib 
     @install -m 0777 $(MODULE_NAME) /usr/local/lib 
     @ldconfig 

#remove basic c code library from linux system (root permissions required) 
uninstall: 
     @echo Removing $(LIB_NAME) and $(MODULE_NAME) from /usr/local/lib 
     @-$(RM) /usr/local/lib/$(LIB_NAME) 
     @-$(RM) /usr/local/lib/$(MODULE_NAME) 
     @ldconfig 

clean: 
     rm -f *.o *.so *.pyc 

Это создает два файла, vision.so и libvision.so. Vision.so - это тот, который должен быть импортирован в сценарии Python. Libvision.so - это тот, который он говорит, что он не может найти. Если я делаю ldd libvision.so, все соединения в порядке. Если я делаю ldd vision.so, я получаю libvision.so ===> not found, хотя он находится прямо в том же каталоге. Я также проверил размер файла. Кажется, что это правильно, и это не файл 0 kb.

+0

Как вы импортируете файл? – Blender

+0

Как только объект '.so' находится в месте, где находится sys.path Python, я просто использую оператор import внутри скрипта Python. –

+0

Является ли ваша строка shebang 'python2' или' python' '' python3'? Если это 'python', вы получите py3k, и модуль будет недоступен. – Daenyth

ответ

1

dist-packages - это проект Debian/Ubuntu, созданный для предотвращения конфликтов между дистрибутивными пакетами, установленными из файлов .deb, и пакетов Python, установленных с использованием sudo python setup.py install. Upstream Python знает только о site-packages.

Теперь об ошибке импорта - похоже, что ваш .so связан с другими библиотеками, которых нет в рассматриваемой системе ArchLinux. Можете ли вы запустить ldd /usr/lib/python2.7/site-packages/yourlibrary.so и посмотреть, указывают ли все внешние ссылки на существующие файлы библиотек?

+0

[Здесь] (http://tinypaste.com/01fb1dd9) - это Makefile. Мне жаль, что я не опубликовал это раньше. Как вы можете видеть, это создает также файлы '.so': vision.so и libvision.so. Когда я делаю ldd на libvision.so, все проверяется. Когда я делаю ldd на vision.so, который я фактически импортирую в своих сценариях Python, он говорит, что libvision.so не найден. . В оригинальном посте также есть libvision.so. Итак, vision.so нуждается в libvision.so для работы, но он не находит его. Я не понимаю, почему! –

+0

Я вообще не использовал 'dist-packages' и' site-packages', и на этот раз я использовал 'usr/local/lib' и добавил' .pth' файл в 'site-packages' с помощью пути'/USR/местные/lib'. Повторите ту же ошибку. Извините, если я забыл изменить часть 'make uninstall'. Я никогда его не использую. –

+1

Похоже, вам нужно переместить libvision.so в/usr/lib или перенести его в/usr/local/lib и убедиться, что /etc/ld.so.conf упоминает/usr/local/lib (а затем запустите ' ldconfig'), или добавьте содержащуюся директорию в LD_LIBRARY_PATH, прежде чем вы начнете процесс Python. –