2017-04-06 27 views
1

我正在使用的文件夹结构是这样的:Python的 - 导入C++模块接口 - 无法打开共享对象文件

program 
program/app/app.py 
program/app/lib.so 
program/app/py_interfaces.so 
program/launcher.py 

我编蟒蛇接口py_interaces.so并带有Boost.Python链接到./lib.so,所以它会加载库来自与接口相同的文件夹。 我输入接口在app.py

import py_interfaces 

,如果我跑app.py它工作正常。但是,我需要从launcher/py运行,当我这样做,我得到错误:

Import Error: ./lib.so: cannot open shared object file: no such file or directory. 

我猜它加载py_interfaces.so罚款,但它搜索lib.so在错误的文件夹:program。是否有可能强制它正确地做到这一点?我应该链接不同吗?我不”要改变工作目录(我需要从根目录program其他文件)

+0

我给出了一般答案,但没有更多的代码,因为在你的'PYTHONPATH'和''py_interfaces'引用'lib'的代码中我没有更多的代码。 – kabanus

+1

https://www.google.com/search?q=rpath+origin –

回答

1

你确定.是你期望的目录?注意.表示当前工作工作目录。 launcher.pylib.so不在同一个目录中,所以这就是您所看到的。您链接的方式,你必须在应用程序目录中工作。

尝试在链接时使用实际路径或相对于库的路径py_interfaces.so。这是您需要在py_interfaces本身中修复的内容。

编辑:

Here是SO张贴关于相对于可执行/库路径中的文件引用。

正如N.M.所述,链接相对路径的正确方法是在链接时提供-rpath$ORIGIN,使整个依赖关系更加健壮。

+0

我想要的是'py_interfaces.so'总是在同一个目录下查找'lib.so'。它工作正常,不包括我的情况。 – Pawel

+0

工作正常,你的意思是只有当从同一目录运行? – kabanus

+0

是的。但在我的情况下,我希望'Launcher.py'在另一个进程中启动'app/app.py'。但是我认为app.py从'app'目录中正确导入'py_interfaces.so'“,然后在根文件夹中搜索'lib.so'。 – Pawel

相关问题