使用python启动openoffice进程以使用子进程与pyuno一起使用

时间:2013-12-26 16:11:19

标签: python pyuno

我使用此命令启动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命令不输出任何内容。过程就在那里,但它不接受连接。 我做错了什么?

3 个答案:

答案 0 :(得分:1)

来自documentation

  

在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)

以下执行但与管道的UNO连接不起作用:

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的调用问题:

  1. 取出, shell=True
  2. 或在command中的第二项添加引号,如下所示:

    '--accept="socket,host=localhost,port=8100;urp;StarOffice.Service"'

  3. 问题是shell在没有引号的情况下没有正确解析args,所以要么不使用shell(更好的方法),要么引用上面的一个参数。我说不使用shell是更好的方法,因为使用.terminate()返回的对象的Popen方法关闭soffice很简单。否则,您需要使用像psutil这样的库来查找所有子进程并自行终止它们,因为正如Scott P.指出的那样,终止shell并不能阻止它们。

    Scott P:您第一次致电Popen的原因不起作用的原因是因为您在第二项中有引号,但不是' t 使用shell。 shell在解析命令行时会删除引号,但由于你没有使用它们,它们会保留,然后soffice不会按照你期望的方式解释参数。同样,这就是您第二次致电Popen 工作的原因。

    此问题的另一个例子是:Error calling LibreOffice from Python