" sh:错误:无法打开显示"当我尝试从python启动程序时

时间:2017-07-07 11:01:28

标签: python linux raspbian systemd

我有这个非常奇怪的问题,基本上我想从我的xpdf脚本启动Python(或Libreoffice),这是由systemd-service启动的。当我从终端启动脚本时,一切正常,但当我插入启动服务的USB设备时,我的系统日志中会出现此错误:

sh[2321]: Error: Can't open Display

此错误与X11有关,这是我的Google搜索告诉我的内容。 所以,我的问题是:如何从Python正确运行像xpdf或libreoffice这样的程序?

 import subprocess
 subprocess.call("/usr/bin/xpdf")

基本上就是这样。我知道它与图形环境有关,但我不知道如何解决它。

3 个答案:

答案 0 :(得分:1)

X显示系统具有非常好的安全性,可以阻止随机本地进程只显示内容到本地屏幕(在过去昂贵的Sun和SGI系统中,计算机实验室通常会让用户telnet到其他系统,这是一个更大的问题可以带来很多乐趣!)。

如果运行xpdf的用户与登录X会话的用户相同,那么您只需告诉xpdf将其UI连接到的位置。这通常通过将DISPLAY=:0导出到环境来完成,这意味着“连接到第一个本地屏幕”。大多数X程序也支持-display :0参数。

所以:

/usr/bin/xpdf -display :0

或:

DISPLAY=:0 /usr/bin/xpdf

您不可能有多个X会话,因此:0将在99%的时间内正常工作。

答案 1 :(得分:0)

由于问题是xpdf没有找到要连接的显示器,我们有两个基本选项:使用现有显示器查找和验证,或者创建一个新显示器。后者通常更容易,例如:

xinit /usr/bin/xpdf -fullscreen $PDFFILE -- :2

这会启动一个新的X显示:2只运行xpdf,甚至不是窗口管理器。

答案 2 :(得分:-2)

在尝试疯狂约2周后,它终于奏效了。 有用的是

os.system("DISPLAY=:0 /usr/bin/xpdf)

我知道subprocess.call是调用程序的更好方法,但它现在似乎不起作用。 我将尝试Yann后来提出的方式,但是现在我只是感到高兴,它只是有效。

谢谢大家的帮助,我真的很感激!