1

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

4

3 回答 3

1

文档中:

在 shell=True 的 Unix 上,shell 默认为 /bin/sh。如果 args 是字符串,则该字符串指定要通过 shell 执行的命令。

如果 args 是一个序列,则第一项指定命令字符串,任何附加项都将被视为 shell 本身的附加参数。

在这里,您应该只删除shell=True以将参数传递给soffice而不是将参数传递给 shell:

subprocess.Popen(command)

要使用shell=True,您需要将所有参数构建到一个命令中(当然需要对参数进行转义):

subprocess.Popen(command.join(' '), shell=True)
于 2013-12-26T16:32:08.147 回答
1

执行以下命令,但 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)

但是请注意,关闭 pidsoffice.kill()会留下一些进程。

请参阅此处有关此问题的问题: OpenOffice 论坛问题 29873

于 2016-10-27T17:47:57.273 回答
0

我遇到了一个几乎相同的问题,它让我发疯,直到我弄清楚了。幸运的是,修复很简单。

有两种方法可以修复Popen原始问题中的调用:

  1. 要么拿出, shell=True
  2. 或将引号添加到第二项,command如下所示:

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

问题是没有这些引号,shell 不能正确解析 args,所以要么不要使用 shell(更好的方法),要么像上面那样引用一个参数。我说不使用 shell 是更好的方法,因为这样可以很简单地.terminate()使用Popen. 否则,您需要使用 psutil 之类的库来查找所有子进程并自己杀死它们,因为正如 Scott P. 指出的那样,终止 shell 并不会停止 soffice。

Scott P:您第一次调用Popen不起作用的原因是因为您在第二项中有引号,但没有使用 shell。shell 在解析命令行时会删除引号,但是因为您没有使用它,所以它们仍然存在,然后 soffice 不会按照您期望的方式解释参数。同样,这就是为什么您的第二次调用Popen 确实有效。

这个问题的另一个例子是:Error call LibreOffice from Python

于 2017-06-02T16:38:30.310 回答