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

标签 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 的文件。

最佳答案

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看看是否所有的外部引用都指向现有的库文件?

关于python - 自定义 Python 库仅在 ArchLinux 中引发 ImportError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9760157/

相关文章:

python - Django 模板不迭代列表

apache - 无法使用网站 url 访问网站 ( localhost : port works )

ubuntu - 无法通过 SSH 连接到 Amazon EC2 帐户。 (公钥错误)

linux - 生成文件错误 : syntax error: unexpected word (expecting "fi")

c - 如何在 UNIX 中的 makefile 中链接 C 程序的库文件?

python - 如何在 Python 中用空格将字符串填充到固定长度?

python - 当分母中的元素可能为零时,高效的逐元素矩阵除法

python - 如何提高在数据框中使用模糊匹配的速度?

ubuntu - 重启时出现 Syslog-ng 服务错误 - syslog 转发到 Qradar

compilation - 错误 127 编译 'Makefile'