自定义Python库仅在ArchLinux中引发ImportError

时间:2012-03-18 16:45:50

标签: python ubuntu makefile python-2.7 archlinux

我有一个问题。

我有一个Makefile,它将一些带有Python.h的C代码编译成.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文件放在Python2.7的sys.path中的路径。我无法解决这个问题。

我在这里添加完整的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的文件。

1 个答案:

答案 0 :(得分:1)

dist-packages是一个Debian / Ubuntu发明,旨在避免从.deb文件安装的分发包与使用sudo python setup.py install安装的Python包之间发生冲突。上游Python只知道site-packages

现在关于导入错误 - 听起来你的.so链接到了ArchLinux系统中没有的其他库。您可以运行ldd /usr/lib/python2.7/site-packages/yourlibrary.so并查看是否所有外部引用都指向现有库文件?