2024-09-29 00:13:29 发布
网友
当我在Ubuntu中使用os.system("./mydemo")调用python中的可执行文件时,它找不到.so文件(libmsc.so)我的演示需要。我用了os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH;"),但它还是找不到libmsc.so. 在
os.system("./mydemo")
os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH;")
在libmsc.so在当前目录中。不应该是全球性的。在
如果我没记错的话,通过os.system执行export ...只会在作用域内设置该shell变量,因此它在以下os.system范围内不可用。在执行Python脚本之前,应该在shell中设置LD_LIBRARY_PATH。在
os.system
export ...
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()))
或者使用子流程模块更好?在
问题是export只将其变量导出到当前shell的子级。在您通过调用os.system创建的shell中,该shell随后立即退出。在
export
{1{如果你想让一个最简单的程序都在里面,你可以做一个简单的程序:
os.system("export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH; ./mydemo")
还有一些其他的问题。例如,export在同一个命令中分配一个变量是一个bash-ism,它可能不是所有shell都可用的。使用^{}您可以指定一个特定的shell,但是使用system您只需要得到操作系统认为Linux上默认的shell,manpage表示这意味着/bin/sh -c。在
bash
system
/bin/sh -c
实际上,解决这个问题的最好方法就是不要在一开始就使用shell,而是按照您想要的方式设置环境变量。这正是^{}文档所说的原因:“subprocess模块为生成新进程和检索其结果提供了更强大的工具;使用该模块比使用此函数更可取。”例如:
subprocess
或者,如果您想真正安全(与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,以防有人对当前工作目录做了一些棘手的事情。在
:
shlex.quote
如果我没记错的话,通过
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上下文中没有任何意义。在尝试如下设置环境变量:
或者使用子流程模块更好?在
^{pr2}$问题是
export
只将其变量导出到当前shell的子级。在您通过调用os.system
创建的shell中,该shell随后立即退出。在{1{如果你想让一个最简单的程序都在里面,你可以做一个简单的程序:
还有一些其他的问题。例如,} 您可以指定一个特定的shell,但是使用
export
在同一个命令中分配一个变量是一个bash
-ism,它可能不是所有shell都可用的。使用^{system
您只需要得到操作系统认为Linux上默认的shell,manpage表示这意味着/bin/sh -c
。在实际上,解决这个问题的最好方法就是不要在一开始就使用shell,而是按照您想要的方式设置环境变量。这正是^{} 文档所说的原因:“
^{pr2}$subprocess
模块为生成新进程和检索其结果提供了更强大的工具;使用该模块比使用此函数更可取。”例如:或者,如果您想真正安全(与shell代码不同):
我已经把它写得比你通常写的更明确、更详细,以使步骤更明显:不要在空路径之前包含一个尾随
:
,并使用shlex.quote
,以防有人对当前工作目录做了一些棘手的事情。在相关问题 更多 >
编程相关推荐