如何仅引导到自己的python脚本(GUI)?


12

我有以下问题:使用运行Raspbian Jessie(版本4.4.26-v7 +)的RaspPi 3B,我希望在启动时执行自写python脚本的GUI。

我知道这个问题已经在这个网站以及其他网站上被问到过,但是由于Raspbian不断变化并且在为我工作之前,没有提出任何建议的解决方案(请参阅下文),我想再次提出它。

据我了解,我需要加载XServer并随后执行脚本。这应该发生,而不是加载整个桌面。

实现此目的的一种方法应该是通过LXDE自动启动文件(如本答案所述)。我编辑了文件/etc/xdg/lxsession/LXDE-pi/autostart以及文件/etc/xdg/lxsession/LXDE/autostart(前者最初包含四行,而不是所引用的文章中的建议)—添加了行@sudo python /full/path/to/file.py@openbox,但是我的Pi仍然引导到桌面,并且根本不会自动执行脚本。注释:对于其中一个文件和两个文件,我只尝试了脚本行和脚本行以及openbox行。

另一种策略涉及rc.local文件(如官方文档中所建议)。但是,仅添加python /full/path/to/file.py &不起作用(因为仍然缺少我的GUI),并且进一步添加startx没有帮助,因为我显然无法将startx与python脚本链接,因此前者在启动后立即关闭。

有人建议,(另外)应使用.xinitrc。但是,这也不起作用:

su -c python /full/path/to/file.py pi

最后,但并非最不重要的一点是,它应该可以通过init.d使用-但我还没有找到详细的信息。

我真的很感谢向正确方向的任何提示。我的错误在哪里?我的rc.local或.xinitrc中的行应如何显示?还是与切换到像素有关的重大更改,我应该尝试其他方法吗?


一些其他信息:脚本需要sudo权限。它是用Python 2.7编写的,GUI使用的是Tkinter。GUI完全填满了屏幕,因此背景是无关紧要的。该脚本应该永远运行(或者直到它被用户通过GUI输入停止为止),并使用wifi和以太网等系统服务。


更多信息:一切都在本地进行。


澄清:到目前为止,我已经花了8个多小时在网上搜索,从不同的起点尝试教程或将它们混合在一起。我得出的结论是,如果我的脚本(以像素启动时效果很好)在非桌面环境中运行(我怀疑)不起作用,或者需要新的教程,因为2016年10月更改为Raspbian使所有较旧的教程都过时了。此外,挑战不在于彼此独立地启动脚本或启动Xserver(或类似的东西),而在于两者都链接在一起,以便脚本将使用Xserver创建的显示。


我承认这没有多大帮助,但是也许值得一看,例如XBMC(或其他HTPC分配)如何启动?或者,也许这会回答你的问题raspberrypi.stackexchange.com/questions/11866/...
切赫Gladkikh

Answers:


12

在过去的一个月左右的时间里,我一直在研究完全相同的事情,因此,我研究了很多方法,并且知道如何使用最新版本的Raspbian(PIXEL)进行操作。

nodm是一个最小的显示管理器,它绕过了加载LXDE的工作,openbox(它已经安装在Pi上)提供了一个最小的会话管理器,并且可以与X服务器一起使用。

要设置在Raspbian这种环境下,安装nodmapt-get和编辑文件/etc/default/nodm。您需要将选项设置NODM_ENABLEDtrueNODM_USERpi(或任何你的用户名)。

然后在主文件夹(/home/pi/.xsession)中创建一个包含以下内容的自定义Xsession文件(while不需要循环,如果崩溃,它只会自动重启Python脚本):

#!/usr/bin/env bash
exec openbox-session &
while true; do
  python3 /home/pi/Documents/script.py
done

我认为这应该是所有必要的。我写了一个Bash脚本来自动设置它:

sudo apt-get -y install nodm

# Edit nodm config file
sudo sed -i -e "s/NODM_ENABLED=false/NODM_ENABLED=true/" -e "s/NODM_USER=root/NODM_USER=pi/" \
  /etc/default/nodm

# Create custom Xsession file
printf "%s\n" \
  "#!/usr/bin/env bash" \
  "exec openbox-session &" \
  "while true; do" \
  "  python3 $PWD/main.py" \
  "done" \
  > /home/pi/.xsession

笔记:

  • 我发现此链接很有用,但是某些信息现在已经过时了:https : //blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/他们使用了Matchbox窗口管理器,该管理器无法正常工作对我来说,因为我需要多个窗口支持,但是如果不需要的话,这可能是一个不错的选择。
  • 上面的解决方案有效,但是我想要一个尽可能轻的环境,因此我切换到了没有GUI的Raspbian Lite,从零开始只安装了绝对必要的软件包。这个过程是非常相似,但除了nodm需要安装xserver-xorgxinitopenbox,和任何其他依赖你的脚本了。然后,如果您使用的是Openbox,则无需在Xsession文件中运行Python脚本,而是将运行它的部分代码移到单独的脚本(/home/pi/.config/openbox/autostart)中。如果需要,我可以详细说明如何执行此操作。

嗨,tjohnson,我使用了您在Raspbian上描述的方法,并使它能正常工作,谢谢!我也想尝试在上一个注释中提到的Raspbian Lite。我安装了您列出的其他依赖项,但该应用程序未启动。我认为这与您关于将其移至另一个脚本的最后评论有关。我没有home / pi / .config / openbox文件夹,所以我创建了它和自动启动文件,但它似乎无法正常工作。您能详细说明一下吗?谢谢
AngeloQ

@AngeloQ您是否可以在Raspbian Lite上使用它?
保罗

1

自动启动文件存在于几个不同的位置。只需在正确的路径上编辑正确的自动启动文件即可。我尝试编辑/home/pi/.config/lxsession/LXDE-pi/autostart。终于对我成功了。

/etc/xdg/lxsession/LXDE-pi/autostart 似乎是错误的道路。


0

我过去在RPi上使用过的肮脏技巧是将命令放在/etc/rc.local文件的前exit 0一行。在您的情况下,我将尝试以下行并重新启动。

python /full/path/to/file.py &

如前所述,需要sudo级别权限,您可能不得不改为调整su以前尝试过的命令,因为现在看来您正在尝试在pi用户下运行。

关于我建议使用rc.local文件的一个警告,如果您的脚本以非零状态退出,则您将无法完成启动,因此为了更安全地进行测试,您可以尝试以下操作以确保退出仍然等于0

python /full/path/to/file.py & || exit 0

编辑和更新

查看一些搜索数据,发现一个可指导的示例,演示了如何使用cron选项卡中引用的启动器脚本来促进加载python脚本。为了加载python,可能似乎要加载cron来加载sh / bash脚本,但是...令人费解地盘绕了一下,产生了一些扭曲的含义。


评论不作进一步讨论;此对话已转移至聊天
加纳玛

0

因此,根据您的代码需要输入什么,此解决方案可能会起作用。

我做的第一件事是在/目录中创建一个脚本,如下所示:

#!/bin/bash
echo "Starting program..."
cd /home/pi/myFolder
sudo python3 myPython.py $@ #$@ takes all arguments and passes them to python.
exit 0

您必须使用使它可运行chmod -x scriptName.sh

然后crontab -e在终端中添加@reboot sudo bash /scriptName.sh

将启动选项设置为CLI,您应该一切顺利!这适用于我运行Raspbian的3B。

请注意,如果您在信息亭/屏幕上使用触摸屏,我还没有弄清楚。可以在鼠标输入上正常工作,但对于触摸输入,至少对于我要使用的屏幕,它将以某种方式关闭,使其无法使用。

注意:如果您的代码像我一样执行文件IO,则必须使用它cd来导航到启动器脚本中代码的位置,否则python将假定其位置是脚本的位置,并将相应地执行文件IO。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.