当我在Ubuntu中使用os.system("./mydemo")
在python中调用可执行文件时,它无法找到mydemo所需的.so文件(libmsc.so)。我使用了os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH;")
,但它仍然找不到libmsc.so。
libmsc.so位于当前目录中。并且不应该是全球性的。
答案 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
以防某人使用当前工作目录做一些棘手的事情。