我使用操作系统运行可执行文件,但它需要一个.so文件,它找不到库

2024-09-29 00:13:29 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在Ubuntu中使用os.system("./mydemo")调用python中的可执行文件时,它找不到.so文件(libmsc.so)我的演示需要。我用了os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH;"),但它还是找不到libmsc.so. 在

在libmsc.so在当前目录中。不应该是全球性的。在


Tags: 文件path可执行文件soosubuntupwdlibrary
3条回答

如果我没记错的话,通过os.system执行export ...只会在作用域内设置该shell变量,因此它在以下os.system范围内不可用。在执行Python脚本之前,应该在shell中设置LD_LIBRARY_PATH。在

顺便说一句,也要避免设置相对路径

当您执行os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH;")操作时,您将运行shell的新实例,然后在那里修改LD_LIBRARY_PATH,然后立即退出它。而且,pwd在Python上下文中没有任何意义。在

尝试如下设置环境变量:

os.system("LD_LIBRARY_PATH={} ./mydemo".format(os.getcwd())) 

或者使用子流程模块更好?在

^{pr2}$

问题是export只将其变量导出到当前shell的子级。在您通过调用os.system创建的shell中,该shell随后立即退出。在

{1{如果你想让一个最简单的程序都在里面,你可以做一个简单的程序:

os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH; ./mydemo")

还有一些其他的问题。例如,export在同一个命令中分配一个变量是一个bash-ism,它可能不是所有shell都可用的。使用^{}您可以指定一个特定的shell,但是使用system您只需要得到操作系统认为Linux上默认的shell,manpage表示这意味着/bin/sh -c。在

实际上,解决这个问题的最好方法就是不要在一开始就使用shell,而是按照您想要的方式设置环境变量。这正是^{}文档所说的原因:“subprocess模块为生成新进程和检索其结果提供了更强大的工具;使用该模块比使用此函数更可取。”例如:

^{pr2}$

或者,如果您想真正安全(与shell代码不同):

LD_LIBRARY_PATH = env.get('LD_LIBRARY_PATH', '')
if LD_LIBRARY_PATH:
    LD_LIBRARY_PATH = ':' + LD_LIBRARY_PATH
LD_LIBRARY_PATH = shlex.quote(os.getcwd()) + LD_LIBRARY_PATH
subprocess.check_call(['./mydemo'], env=env)

我已经把它写得比你通常写的更明确、更详细,以使步骤更明显:不要在空路径之前包含一个尾随:,并使用shlex.quote,以防有人对当前工作目录做了一些棘手的事情。在

相关问题 更多 >