问题描述
我正在将各种 python 脚本从 windows 迁移到 linux(windows 8、debian 10.8、python 3.7);其中一个结果显示在 excel 文件中:
xlsx_app = r'C:\Program Files\LibreOffice\program\scalc.exe'
Popen ([xlsx_app,fname])
(fname是excel文件的路径) 现在在 linux 上我试过了:
p = Popen(['libreoffice','--calc',fname])
但它只是打开 calc 然后它关闭......我已经尝试过使用 "call"、"PIPE"、"shell = False",而且它总是一样的 - 也试过没有 '--calc'参数。
有没有什么特别的方法可以在linux下用python打开calc文件?
提前致谢,
解决方法
感谢 Rahul Bharadwaj,我意识到问题依赖于其他地方......不知道在哪里,但是,从 this post 开始,有人建议使用“xdg-open”,它可以打开任何文件或网址:
Popen(['xdg-open',fname])
xdg-open
使用分配给文件类型或 url 的应用程序,我知道能够对应用程序进行 pic 会更好,但在我的情况下,如果文件在预期的应用程序中打开(在此案例,libreoffice calc) 就足够了。
谢谢!
,我依稀记得有这个问题,但不再记得我为什么选择这个解决方案。
>>> from subprocess import Popen
>>> pid = Popen(['/usr/bin/loffice','data.csv'],close_fds=True).pid
>>> print (pid)
21948
我的直觉是,close_fds=True
参数是造成差异的原因。
如果close_fds为true,在子进程执行之前,除了0、1、2之外的所有文件描述符都会被关闭。否则,当 close_fds 为 false 时,文件描述符遵循其继承标志,如文件描述符的继承中所述。
文件描述符的继承
文件描述符有一个“可继承”标志,表明文件描述符是否可以被子进程继承。从 Python 3.4 开始,Python 创建的文件描述符默认是不可继承的。
在 UNIX 上,不可继承的文件描述符在执行新程序时在子进程中关闭,其他文件描述符被继承。
我想这并不重要,因为你有一个解决方案,但我想我会加入我在 Linux 上成功使用的东西,在一个单独的过程中启动 LibreOffice Calc。