У меня вопрос.Пользовательская библиотека 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.
Как вы импортируете файл? – Blender
Как только объект '.so' находится в месте, где находится sys.path Python, я просто использую оператор import внутри скрипта Python. –
Является ли ваша строка shebang 'python2' или' python' '' python3'? Если это 'python', вы получите py3k, и модуль будет недоступен. – Daenyth