我使用此命令启动openoffice:
soffice --accept="socket,host=localhost,port=8100;urp;StarOffice.Service" --headless --nofirststartwizard
以下命令将确保openoffice正在接受端口8100上的连接:
netstat -nap | grep office
输出:
tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN 2467/soffice.bin
启动openoffice流程的Python脚本:
command = [
'soffice',
'--accept=socket,host=localhost,port=8100;urp;StarOffice.Service',
'--headless',
'--nofirststartwizard'
]
subprocess.Popen(command, shell=True)
出于某种原因,当我尝试使用此python脚本启动openoffice时,netstat命令不输出任何内容。过程就在那里,但它不接受连接。 我做错了什么?
答案 0 :(得分:1)
在Unix上,shell = True,shell默认为/ bin / sh。如果args是一个字符串,则该字符串指定要通过shell执行的命令。
如果args是一个序列,则第一个项指定命令字符串,任何其他项将被视为shell本身的附加参数。
在这里,您应该删除shell=True
以将参数传递给soffice
,而不是将参数传递给shell:
subprocess.Popen(command)
要使用shell=True
,您需要将所有参数构建到单个命令中(当然,参数需要进行转义):
subprocess.Popen(command.join(' '), shell=True)
答案 1 :(得分:0)
soffice = subprocess.Popen([
'/usr/bin/soffice',
'--accept="pipe,name=hello;urp;"',
'--norestore',
'--nologo',
'--nodefault',
'--headless',
])
如果我从终端管道连接执行此操作就好了:
/usr/bin/soffice --accept="pipe,name=hello;urp;" --norestore --nologo --nodefault --headless
我可以从调试器中看到subprocess.Popen已成功创建,并且args看起来正确并且它有一个pid。我不确定为什么会这样。有人可以解释一下吗?
soffice = subprocess.Popen(' '.join([
'/usr/bin/soffice',
'--accept="pipe,name=hello;urp;"',
'--norestore',
'--nologo',
'--nodefault',
'--headless',
]), shell=True)
请注意,使用soffice.kill()
关闭pid会留下一些进程。
请参阅此处有关此问题的问题: OpenOffice Forum Question 29873
答案 2 :(得分:0)
我遇到了一个几乎完全相同的问题,它让我疯狂,直到我弄清楚了。幸运的是,修复很简单。
在原始问题中,有两种方法可以解决对Popen
的调用问题:
, shell=True
或在command
中的第二项添加引号,如下所示:
'--accept="socket,host=localhost,port=8100;urp;StarOffice.Service"'
问题是shell在没有引号的情况下没有正确解析args,所以要么不使用shell(更好的方法),要么引用上面的一个参数。我说不使用shell是更好的方法,因为使用.terminate()
返回的对象的Popen
方法关闭soffice很简单。否则,您需要使用像psutil这样的库来查找所有子进程并自行终止它们,因为正如Scott P.指出的那样,终止shell并不能阻止它们。
Scott P:您第一次致电Popen
的原因不起作用的原因是因为您在第二项中有引号,但不是' t 使用shell。 shell在解析命令行时会删除引号,但由于你没有使用它们,它们会保留,然后soffice不会按照你期望的方式解释参数。同样,这就是您第二次致电Popen
工作的原因。
此问题的另一个例子是:Error calling LibreOffice from Python