我可以在后台运行我的Python脚本,通过使用sudo crontab -e在启动时自动启动脚本来控制两个 Servo 器 . 我修改了脚本,所以我现在不断地将servos当前位置写入horz.txt和vert.txt文件并使用这些文件将步进器初始化到它们的原始位置,这样我就可以在断电后再次找到原位 . 使用sudo python mystepper6.py从黑色屏幕上的命令行手动启动脚本时,我添加的horz.txt和vert.txt代码可以正常运行该脚本,但它在启动时不会自动启动也不会当我在命令行输入ps ax时显示为运行 . 我添加了一些额外的代码,只是为了在主程序启动之前摆动 Servo 器,并且 Servo 器在sudo crontab -e中按照编程自动摆动但是它只是停止并且不会继续找到原始位置 . 它似乎是新代码的东西,但我不知道它可能是什么 . 我的sudo crontab -e行是@reboot(sleep2; python /home/pi/mystepper6.py)& . 下面是mystepper6.py的脚本 .
由于此帖中可用空间有限,下面的脚本缩短了以显示相关行 . sudo重新启动挂起,底部附近没有错误消息,它被评论为“移动到原位”(它不移动) . 我能够在该点之前打印adjustv和adjusth整数,以便在该点为.txt文件中的变量分配一个值 . 当我从命令行手动运行mystepper6.py时,它运行得很好 .
我花了太多时间来解决这个问题并购买了两本电子书无济于事 . 请帮忙 .
import RPi.GPIO as gpio # import library RPi.GPIO gpio=use general purpose input output pin names
import time # import time library
PINSh = [27,10,18,23] # variable 'PINS' holds a list of gpio pin numbers
SEQAh = [(27,),(10,),(18,),(23,)]
PINSv = [4,17,22,24] # variable 'PINS' holds a list of gpio pin numbers
SEQAv = [(4,),(17,),(22,),(24,)]
DELAY = 0.01 # time between motor steps (too small of a number then the motor stalls)
alpha = 140 # horizontal full scale viewing angle in motor counts 128 counts = 360 degrees
beta = 30 # was 15 vertical full scale viewing angle in motor counts 128 counts = 360 degrees
gpio.setmode(gpio.BCM) # tells RPi.GPIO we want to use pin names (BCM is the mfg)
for pin in PINSh: # pin is a variable name assigned a new value each loop; PINS is a list
gpio.setup(pin, gpio.OUT) # this says we want to use 'pin' as an output
for pin in PINSv: # pin is a variable name assigned a new value each loop; PINS is a list
gpio.setup(pin, gpio.OUT)
def stepper(sequence, pins): # def says 'stepper' is the function name (like a variable), then parameters are inside ()
for step in sequence:
for pin in pins:
if pin in step:
gpio.output(pin, gpio.HIGH)
else:
gpio.output(pin, gpio.LOW)
webcam_horz_home = open("horz.txt", "a")
webcam_horz_home.close()
webcam_vert_home = open("vert.txt", "a")
webcam_vert_home.close()
# load last position prior to power down
webcam_horz_home = open("horz.txt", "r")
rows = webcam_horz_home.readlines();
for row in rows:
adjusth = int(row)
webcam_horz_home.close()
webcam_vert_home = open("vert.txt", "r")
rows = webcam_vert_home.readlines();
for row in rows:
adjustv = int(row)
webcam_vert_home.close()
counter = 0 # move to home position
while counter < adjustv:
stepper(SEQAv, PINSv)
counter = counter + 1
# CONTINUAL PAN AND TILT OPERATION (box pattern):
1 回答
我刚刚在运行Raspbian的Pi上进行了测试,但它确实有效 .
首先,我在主用户的主目录中创建了一个名为some_script.py的python脚本 . 脚本内容:
然后,在终端中,我在文件上设置允许执行的可执行位:
然后,在终端中,我输入了
sudo crontab -e
并在root
用户的crontab底部添加了以下行:然后我重新启动,
cd
编辑为/home/username/
并确认python已在重启时运行并写入文件:UPDATE / SOLUTION
在确认OP能够成功复制上述步骤之后,我相当确信这不是由于在不同的* nix系统或其他一些边缘情况下cron的不同实现而产生的问题 . 正如预期的那样,他可以通过cron运行python,他可以使用
@reboot
功能,他可以写入磁盘而不会出现任何类型的权限问题 .但是,它仍然无效 . 解决问题的方法只是使用绝对路径而不是相对路径 .
更改
至
和
至
让OP的踏步机再次发出咕噜声:)
EXPLANATION / BACKGROUND
通过其他用户的crontab执行脚本或命令时(在本例中为
root
),相对于常规用户的主目录(例如~/.bashrc
)的路径将不再有效,或者如果存在,则指向具有相同文件名的不同文件 . 当人们运行调用脚本语言(如PHP)(通常由www-data
用户执行)的服务器时,有时会看到相同的"issue" .在Raspberry Pi上,这些东西在使用GPIO时可能会引起一些问题-22因为GPIO设备被锁定,没有权限和组的更改,非特权用户无法访问它 .
如果OP通过
sudo crontab -e
添加cron条目将其脚本作为root
运行,则可以访问GPIO设备(因为root
几乎可以访问所有内容) . 但是,他的python脚本中隐含引用非特权用户pi
的主文件夹的相对路径将不再有效(因为home
现在表示文件夹/root
,它是root
用户的主文件夹) .如果OP通过非特权
pi
用户的crontab通过crontab -e
(没有sudo
)添加cron条目来运行他的脚本,那么路径将是有效的(home
或~/
现在意味着/home/pi/
)但是他将无法访问GPIO设备自pi
以来非常没有特权 . 注意:@reboot
功能并非在所有cron实现中都可用(某些嵌入式和剥离式* nix发行版不适用于root
以外的用户 .这意味着OP有两种选择(可能还有更多;我不是Linux大师):
将文件
vert.txt
和horz.txt
放在root
用户的主文件夹中 .只需更改python脚本中指定的路径,并在
root
的crontab中继续运行脚本@reboot .2号可能更好,因为它保持
root
的主文件夹为空并将OP的文件保存在pi
的主文件夹中 . 除非没有其他选项,例如使用sudo
,否则通常不会混淆root
.