程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了RPi python脚本无法从以下位置运行:/etc/rc.local、crontab、systemd大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决RPi python脚本无法从以下位置运行:/etc/rc.local、crontab、systemd?

开发过程中遇到RPi python脚本无法从以下位置运行:/etc/rc.local、crontab、systemd的问题如何解决?下面主要结合日常开发的经验,给出你关于RPi python脚本无法从以下位置运行:/etc/rc.local、crontab、systemd的解决方法建议,希望对你解决RPi python脚本无法从以下位置运行:/etc/rc.local、crontab、systemd有所启发或帮助;

通过/etc/rc.local以下命令运行python脚本:

1)使用编辑文件sudo /etc/rc.local

2)在文件之前添加以下内容exit 0

(sleep 10;python /home/pi/Cigar-Box/CigarBox.py)&

括号允许您在后台运行多个命令。这sleep 10将使脚本的运行延迟10秒,因为启动rc.local时脚本所依赖的某些服务可能尚不可用。

另外,您可以使用crontab @reboot来自动执行脚本。

使用crontab:

1)运行命令行sudo crontab -e

2)将命令添加到文件末尾:

@reboot /usr/bin/python /home/pi/Cigar-Box/CigarBox.py

解决方法

我试图使该python脚本从/etc/rc.local,crontab @reboot和通过systemctl的systemd运行,但没有成功。

python脚本以pi用户身份登录时从命令行运行,并正常退出后台没有问题。用pi用户在提示符下运行它的方法与此相同:sh /etc/rc.local

任何指导将不胜感激,如下所示:

#!/usr/bin/python

#required libraries
    import sys
    import ssl
    import paho.mqtt.client as mqtt
    import json
    from pprint import pprint
    import Adafruit_CharLCD as LCD
    from textwrap import fill

#Configuration
    rootCAPath = "/home/pi/Cigar-Box/certs/rootCA.pem"
    certFilePath = "/home/pi/Cigar-Box/certs/xxxxxxxxxx-certificate.pem.crt"
    keyFilePath = "/home/pi/Cigar-Box/certs/xxxxxxxxxx-private.pem.key"
    iotThing = "Zorua"
    clientID = "Zorua"

#Device JSON initialization
    device = {'state': {'reported': {'HP':100} } }
    device['state']['reported']['color'] = {'r':0,'g':0,'b':0}

#Create LCD
    lcd = LCD.Adafruit_CharLCDPlate()

#LCD wrapper
    def set_lcd_color(R,G,B):
    global lcd
    device['state']['reported']['color']['r'] = R
    device['state']['reported']['color']['g'] = G
    device['state']['reported']['color']['b'] = B
    lcd.set_color(R,B)
    def set_lcd_message(messagE):
    global lcd
    device['state']['reported']['msg'] = message
    lcd.clear()

#Word wrap to fit 16-char wide display and add capitalization
    lcd_message = fill(message.capitalize(),16)
    lcd.message(lcd_messagE)

# Initialize the LCD using the pins
    set_lcd_message('Initializing...')
    set_lcd_color(0,1)

#called while client tries to establish connection with the server
    def on_connect(mqttc,obj,flags,rC):
    print "ConnecTing..."
    if rc==0:
    print ("Subscriber Connection status code: "+str(rC)+" | Connectionstatus: successful")

#We only want to be notified about things we need to change to stay in sync with AWS
    mqttc.subscribe("$aws/things/" + iotThing + "/shadow/update/delta",qos=1)
    elif rc==1:
    print ("Subscriber Connection status code: "+str(rC)+" | Connection status: Connection refused")
    print ("Subscriber Connection status code: "+str(rC))

#called when a topic is successfully subscribed to
    def on_subscribe(mqttc,mid,granted_qos):
    print("Subscribed: "+str(mid)+" "+str(granted_qos)+"data"+str(obj))
    set_lcd_color(0,1,0)
    set_lcd_message('Connected!\nReady for input')

#Let AWS know about the current state of the plate so we can tell us what's     out of sync
    mqttc.publish("$aws/things/" + iotThing + "/shadow/update",json.dumps(devicE))

#called when a message is received by a topic
#messages are formatted in JSON
#When working with /update,we might not find all keys all the time,so we need to handle that
    def on_message(mqttc,msg):
    try:
    data = json.loads(msg.payload)
    update = data['state']
    except:
    return

#Look for a message in the update. If it's there,we need to update the display
    if 'msg' in update.keys():
    try:
    set_lcd_message(update['msg'])
    except:
    print("Could not enact message from topic: "+msg.topic+" | QoS: "+str(msg.qos)+" | Data Received: "+str(msg.payload))

#Look to see if the status of R,or B has changed for the display
    if 'color' in update.keys():
    try: lcd_r = update['color']['r']
    except: lcd_r = device['state']['reported']['color']['r']
    try: lcd_g = update['color']['g']
    except: lcd_g = device['state']['reported']['color']['g']
    try: lcd_b = update['color']['b']
    except: lcd_b = device['state']['reported']['color']['b']
    set_lcd_color(lcd_r,lcd_g,lcd_b)
#Let AWS know we've updated the display
    mqttc.publish("$aws/things/Zorua/shadow/update",json.dumps(devicE))

#creaTing a client with client-id=Zorua
    mqttc = mqtt.Client(client_id=clientID)
    mqttc.on_connect = on_connect
    mqttc.on_reconnect = on_connect
    mqttc.on_subscribe = on_subscribe
    mqttc.on_message = on_message

#Configure network encryption and authentication options. Enables SSL/TLS support.
#adding client-side certificates and enabling tlsv1.2 support as required by aws-iot service
    mqttc.tls_set(rootCAPath,certfile=certFilePath,keyfile=keyFilePath,tls_version=ssl.PROTOCOL_TLSv1_2,ciphers=NonE)

#connecTing to aws-account-specific-iot-endpoint
    print ("About to connect")
    mqttc.connect("lettersandnumbers.iot.us-@R_618_9752@-2.amazonaws.com",port=8883) #AWS IoT service hostname and portno

#automatically handles reconnecTing
    mqttc.loop_forever()

位于/etc/rc.local中的代码,然后进行简单的重定向测试,以查看rc.local是否运行

# Default code located inside /etc/rc.local
# Print the IP address

    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
    printf "My IP address is %s\n" "$_IP" > /home/pi/cigarbox.log
    fi
    exit 0

######################################################################


# After rebooTing RPi = no output to log
    pi@cigarbox:~ $ cat cigarbox.log

# Running /etc/rc.local from the command line
    pi@cigarbox:~ $ sh /etc/rc.local

# After running /etc/rc.local locally = output to log
    pi@cigarbox:~ $ cat cigarbox.log
    My IP address is 192.168.0.21

这是pi和root的路径

# Running as pi        
    pi@cigarbox:~ $ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

# Running s root 
    pi@cigarbox:~ $ su - root
    password:
    root@cigarbox:~# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

真好 看起来rc.local表现良好

     # Cat and pipe of boot.log
     root@cigarbox:~# cat /var/log/boot.log | grep rc.local
     StarTing /etc/rc.local Compatibility...
     [  OK  ] Started /etc/rc.local Compatibility.

但是,我过去曾经尝试过。根据建议,请在python命令下方注释掉的行和括号中的路径。因此,脚本仍然不会用完/etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
#_IP=$(hostname -I) || true
#if [ "$_IP" ]; then
#  printf "My IP address is %s\n" "$_IP" > /home/pi/cigarbox.log
#fi

    (python /home/pi/Cigar-Box/CigarBox.py)&

#/usr/bin/python /home/pi/Cigar-Box/CigarBox.py > /home/pi/cigarbox.log 2>&1 &

    exit 0

嗯,看来我需要10个好男孩分数才能上传图片。我必须发布该小组最受赞赏的帮助的成功完成信息。谢谢大家。照片URL和遵循的解决方案。

好的,这是我的语音识别项目照片的链接,由于我的新朋友对stackoverflow的支持,该照片现在自动开始:

https://drive.google.com/file/d/19ribELmAnQFy4jfzi5D6I7fk91naS8J7/view?usp=drivesdk

大佬总结

以上是大佬教程为你收集整理的RPi python脚本无法从以下位置运行:/etc/rc.local、crontab、systemd全部内容,希望文章能够帮你解决RPi python脚本无法从以下位置运行:/etc/rc.local、crontab、systemd所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。