Pyinstaller和xdg-open

时间:2018-11-17 18:27:58

标签: linux bash pyinstaller mint

我想问问,是否有人为我的问题提供解决方案或线索。

我正在使用PyCharm编辑器进行Python开发。每当我运行包含PyCharm中的os.system("xdg-open file.pdf")的代码时,一切都会按预期进行。但是,每当我使用PyInstaller打包代码时,该命令都会失败,而不会出现任何错误消息或线索,发生了什么,做什么或从哪里开始搜索以解决此问题(我知道os.system()命令没有捕获任何消息来自已启动的命令,但没有任何线索根本没有)。

我已经尽力确保一切都可以做。我尝试了其他启动器,例如exo-openmimeopen;我试图从Python代码运行一个外部bash脚本,该脚本包含上述各种组合的命令,我试图创建一个外部Python二进制文件(使用PyInstaller),该二进制文件仅执行os.system("xdg-open" + sys.argv[1])命令(因为我在程序的其他位置调用了外部二进制文件,并且运行良好),无处可寻,这为什么不起作用。

当我尝试从bash使用纯命令xdg-open file.pdf时,一切正常。 *)

因为我也为Linux和Windows编写程序,所以在Windows上不存在此故障。我在那里查看PDF文件命令os.system("start './file.pdf'"),它发生了。

我不确定,此问题的根源是什么,可能是PyInstaller问题,也可能是系统问题。

有人有类似的经历,可能还有一些线索或解决方案吗?非常欢迎您的回复,非常感谢!

配置:

  • Linux Mint 18.2 64bit(内核4.8.0-53-通用)
  • Xfce4图形环境
  • Python 2.7
  • PyCharm 2018(最新发布)
  • 重击4.3
  • PyInstaller 3.4(使用pip安装)

计算机是Lenovo ThinkPad T410。

*)也许会有所帮助,或造成更多混乱,但无论如何:在测试过程中,我还尝试从程序中运行纯终端,以手动传递xdg-open命令。但是当我这样做时,没有错误消息,但是什么也没有发生。我还尝试过直接运行PDF查看器,从通用终端一切正常,但是从我的程序打开的终端运行PDF查看器,但是由于缺少图标而出现了很多与GTK相关的错误(并且file.pdf并没有也可以打开),因此通常会失败(不存在图标,也没有打开文件(顺便说一句错误消息,如“打开mimetype application / octet-stream 失败”))。这种行为会导致一些用户/路径/环境问题,但是,我仍然完全不知道这是什么情况以及如何解决它。

P.S。我当然首先尝试了Google叔叔,但没有成功。是的,有可能我没有找到合适的问题,在这种情况下,请给我一些建议;)

2 个答案:

答案 0 :(得分:0)

由于两个月前没有任何回应,所以似乎没有人对此问题感兴趣。

我仍然不确定是什么原因导致了这个问题,但现在看来,它是可行的,因此,仅出于我所写的证据,我认为这可能是造成这种不愉快行为的原因。

我最近将内核4.8更新为内核4.19.21,并且我已经尝试作为PDF查看器/编辑器Foxit Reader 2.4.4.0911(几天前下载)(https://www.foxitsoftware.com/downloads/),因为我具有此配置,因此请打开即使我仍在使用PyInstaller 3.4,程序中的PDF仍然有效。

我不确定,问题的根源是什么,因为我没有将Foxit Reader设置为默认的PDF查看器,并且它在其中打开,并且可能是某些内核/英特尔视频驱动程序问题的来源。这是因为我将Xreader删除为默认的PDF查看器。也许是mimetypes的问题(请注意,例如DoubleCommander或Mutt不尊重系统mimetypes设置,并尝试根据自己的意愿打开程序中的文件,而我仍然不知道为什么,如何更改它),谁知道,当我一个人待在这个问题上时。

在所有情况下,在具有上述配置的Linux Mint 18.2机器上,它现在都能按预期工作。

答案 1 :(得分:0)

这与此处提到的 PyInstaller 问题有关: https://github.com/pyinstaller/pyinstaller/issues/3668

这现在应该有效:

myEnv = dict(os.environ)
lp_key = 'LD_LIBRARY_PATH'
lp_orig = myEnv.get(lp_key + '_ORIG')
if lp_orig is not None:
    myEnv[lp_key] = lp_orig
else:
    lp = myEnv.get(lp_key)
    if lp is not None:
        myEnv.pop(lp_key)

subprocess.Popen(["xdg-open", "file.pdf"], env=myEnv)