Пользовательская библиотека Python генерирует ImportError только в ArchLinux - PullRequest
0 голосов
/ 18 марта 2012

У меня есть вопрос.

У меня есть 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 кбайт.

1 Ответ

1 голос
/ 18 марта 2012

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

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

...