我使用os.system来运行可执行文件,但它需要一个.so文件,它找不到库

时间:2015-04-27 06:32:06

标签: python ubuntu-12.04 dynamic-library

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

libmsc.so位于当前目录中。并且不应该是全球性的。

3 个答案:

答案 0 :(得分:1)

执行os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH;")时,运行shell的新实例,在那里更改LD_LIBRARY_PATH,然后立即退出。此外,pwd在Python的上下文中没有任何意义。

尝试设置这样的env变量:

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

或者最好使用子进程模块?

import subprocess
env = os.environ.copy()
env['LD_LIBRARY_PATH'] = os.getcwd()
proc = subprocess.Popen("./mydemo", shell=True, env=env)
proc.wait()

答案 1 :(得分:0)

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

顺便说一下。也避免设置相对路径......

答案 2 :(得分:0)

问题是export只将其变量导出到当前shell的子节点。与通过调用os.system创建的shell一样,然后立即退出。

如果您希望使用最简单的修复方法,则可以在单个shell中同时执行export和目标程序:

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

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

实际上,解决此问题的最佳方法是首先不使用shell,并按照您想要的方式设置环境变量。这正是os.system文档说的原因:“subprocess模块提供了更强大的工具来生成新进程并检索其结果;使用该模块比使用此函数更可取。”例如:

env = dict(os.environ)
env['LD_LIBRARY_PATH'] = '"{}":{}'.format(
    os.getcwd(), env.get('LD_LIBRARY_PATH', ''))
subprocess.check_call(['./mydemo'], env=env)

或者,如果你想要非常安全(不像你的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以防某人使用当前工作目录做一些棘手的事情。