【发布时间】:2021-12-07 09:06:44
【问题描述】:
我需要在从模板处理 Calc 电子表格的 Web 服务器上启动无头 LibreOffice。我尝试使用以下命令直接在 Python 中执行此操作。
# Doesn't work as expected, no socket connection, "--accept ..." is ignored.
subprocess.Popen(['libreoffice', '--calc','--headless',
'--accept="socket,host=localhost,port=2002;urp;"','&'], shell=True)
但是,当我从 Python 启动 Shell 脚本时,一切正常。
subprocess.call('/var/www/scripts/service_report_ods_prepare.sh', shell=True)
Shell 脚本:
#!/bin/bash
app="soffice"
app_pid=`ps -ef | grep "$app" | awk '{print $2}'`
if `ps -p $app_pid > /dev/null`; then
echo "An instance of LibreOffice is running, pid = "$app_pid
echo "Not starting another instance."
else
libreoffice --headless --accept="socket,host=localhost,port=2002;urp;"& > /dev/null 2>&1
fi
我的 Python 代码有什么问题? 提前致谢。
【问题讨论】:
-
你为什么在这里使用
shell=True? (好吧,&是显而易见的原因,但是您不需要 使用&将某些内容与subprocess.Popen放在后台;它从不一个隐含的wait(),因此默认情况下所有内容都已隐含在后台,只有当您使用subprocess.call()或调用wait()、communicate()等时才会更改为前台) -
&不是参数;它是 shell 命令的 终止符。
标签: python shell subprocess