我使用 os.system 到 运行 可执行文件,但它需要一个 .so 文件,它找不到库
I use os.system to run executable file, but it need a .so file, it can't find library
当我在 python 中使用 os.system("./mydemo")
在 Ubuntu 中调用可执行文件时,它找不到 mydemo 所需的 .so 文件 (libmsc.so)。我用了os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH;")
,还是找不到libmsc.so.
libmsc.so 在当前目录中。而且不应该是全球性的。
如果我没记错的话,通过 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
而不是立即退出。此外,密码在 Python.
的上下文中没有任何意义
尝试像这样设置环境变量:
os.system("LD_LIBRARY_PATH={} ./mydemo".format(os.getcwd()))
或者使用 subprocess 模块更好?
import subprocess
env = os.environ.copy()
env['LD_LIBRARY_PATH'] = os.getcwd()
proc = subprocess.Popen("./mydemo", shell=True, env=env)
proc.wait()
问题是 export
仅将其变量导出到当前 shell 的子项。与您通过调用 os.system
创建的 shell 一样,它会立即退出。
如果您想要最简单的修复来完成这项工作,您可以在单个 shell:
中同时执行 export
和目标程序
os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH; ./mydemo")
这还有一些其他问题。例如,export
在同一命令中对变量进行赋值是一种 bash
主义,可能并非在所有 shell 中都可用。用 subprocess
you can specify a specific shell, but with system
you just get whatever the OS considers the default shell—on Linux, the manpage 表示这意味着 /bin/sh -c
.
真的,解决这个问题的最好方法就是一开始就不要使用 shell,然后按照你想要的方式设置环境变量。这正是 os.system
文档说的原因:"The subprocess
module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function." 例如:
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
以防有人对当前工作目录做了一些棘手的事情。
当我在 python 中使用 os.system("./mydemo")
在 Ubuntu 中调用可执行文件时,它找不到 mydemo 所需的 .so 文件 (libmsc.so)。我用了os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH;")
,还是找不到libmsc.so.
libmsc.so 在当前目录中。而且不应该是全球性的。
如果我没记错的话,通过 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
而不是立即退出。此外,密码在 Python.
尝试像这样设置环境变量:
os.system("LD_LIBRARY_PATH={} ./mydemo".format(os.getcwd()))
或者使用 subprocess 模块更好?
import subprocess
env = os.environ.copy()
env['LD_LIBRARY_PATH'] = os.getcwd()
proc = subprocess.Popen("./mydemo", shell=True, env=env)
proc.wait()
问题是 export
仅将其变量导出到当前 shell 的子项。与您通过调用 os.system
创建的 shell 一样,它会立即退出。
如果您想要最简单的修复来完成这项工作,您可以在单个 shell:
中同时执行export
和目标程序
os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH; ./mydemo")
这还有一些其他问题。例如,export
在同一命令中对变量进行赋值是一种 bash
主义,可能并非在所有 shell 中都可用。用 subprocess
you can specify a specific shell, but with system
you just get whatever the OS considers the default shell—on Linux, the manpage 表示这意味着 /bin/sh -c
.
真的,解决这个问题的最好方法就是一开始就不要使用 shell,然后按照你想要的方式设置环境变量。这正是 os.system
文档说的原因:"The subprocess
module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function." 例如:
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
以防有人对当前工作目录做了一些棘手的事情。