首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Crontab在raspberry pi上启动python脚本会导致导入错误

Crontab在raspberry pi上启动python脚本会导致导入错误
EN

Stack Overflow用户
提问于 2017-03-18 01:40:32
回答 2查看 1.1K关注 0票数 0

我在我的Raspberry PI上运行Ubuntu Mate。我用Python编写了一个web 刮板,我想每天运行一次。我认为使用sudo crontab -e是一种很好的方法。我遇到的问题是,当cronjob启动我的python脚本时,python脚本抛出一个导入错误而不运行。但是,当我从命令行直接执行python脚本时,它将运行而不会出现问题。

我读到一些人使用shell脚本来启动python脚本,所以我也尝试了。同样,当我直接从命令行执行shell脚本时,它可以正常工作,但在由cronjob执行时不起作用。

为了测试目的,现在我有一个cronjob来执行每一分钟,直到我弄清楚到底发生了什么。一旦它按预期工作,我将把它执行的时间更改为更接近我想要的东西。

想让你知道我的文件是什么样子,请看下面。如您所见,所有需要运行的文件都具有执行效率。

web_scraper.py

代码语言:javascript
运行
复制
#!/usr/bin/env python

import click
import logging
import os
from datetime import datetime
from bs4 import BeautifulSoup as bs
import re
import urlparse
...

start.sh

代码语言:javascript
运行
复制
#!/bin/bash

cd /home/elmer/

python web_scraper.py

-e

代码语言:javascript
运行
复制
* * * * * sh /home/elmer/start.sh >> /home/elmer/cron.log 2>&1

cron.log

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "web_scraper.py", line 6, in <module>
    import click

ls -lh

代码语言:javascript
运行
复制
(py27)elmer@elmer-rpi:$ ls -lh
total 56K
-rw-rw-r-- 1 elmer elmer 2.9K Mar 17 20:38 cron.log
-rwxrwxrwx 1 elmer elmer 8.2K Mar 16 09:54 web_scraper.py
-rwxrwxrwx 1 elmer elmer   64 Mar 17 20:02 start.sh
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-18 01:47:41

问题是,您正在以自己的身份运行脚本,但随后将其作为root放在cron中。这两个不同的用户有非常不同的环境。

您应该使用crontab -e而不是sudo crontab -e将其放入您自己帐户的cron中。您还可以从cron命令行的开头删除sh,因为这是默认的。

如果它仍然不起作用,解决方案可能会在您的常规shell中echo $PYTHONPATH,然后将该设置添加到cron中:

代码语言:javascript
运行
复制
PYTHONPATH=/your/path/here
* * * * * python /home/elmer/web_scraper.py >> /home/elmer/cron.log 2>&1

另一个不使用sudo crontab的好理由是,如果您以根用户身份运行脚本,那么它所包含的任何bug都可能破坏您的系统。

票数 3
EN

Stack Overflow用户

发布于 2022-08-09 16:44:02

我不知道是什么导致了这一错误,但约翰·兹温克指出的似乎是正确的答案。

我的问题是什么

与@CurtLH类似,我让crontab启动python脚本,但引发了一条错误消息:找不到包X。进一步注意,我是在基于Debian的Raspbian操作系统上运行这个程序的。

解决方案

首先,您希望在您工作的环境中找到Python库/模块的路径。在我的例子中,脚本位于用户目录下。

为此,在控制台中键入python,这样您就可以执行以下操作:

代码语言:javascript
运行
复制
>>> import sys
>>> sys.path

它返回一个东西列表,得到第四个应该指向您的站点包。在我的例子中,字符串看起来像那个'/home/pi/.local/lib/python3.9/site-packages'

然后我们将一些东西附加到crontab文件中。通过在终端中键入以下内容,您可以打开crontab:

代码语言:javascript
运行
复制
$ sudo crontab -e

请注意,有两个独立的crontab文件(在我看来)。您可以通过键入crontab的sudo infront来访问其中的一个,而另一个则不能访问它(对于每个用户,我猜是加上根用户)。进一步注意,您可以通过$ (sudo) crontab -l读取crontab文件。因此,当您打开sudo时,正如我所说的sudo crontab -e,使用箭头键向下滚动,并在底部创建一个新行,在其中添加以下内容。

代码语言:javascript
运行
复制
*/1 * * * * PYTHONPATH=/home/pi/.local/lib/python3.9/site-packages python /home/pi/script.py

*/1 * * * *说它应该每分钟运行脚本(只是为了测试)(对此有帮助的指南 )。接下来,我们定义了它应该搜索模块的位置。下一个是不言自明的:使用python打开py-脚本,它位于.

如果要记录脚本中的打印内容,请添加以下最后一点:

代码语言:javascript
运行
复制
*/1 * * * * PYTHONPATH=/home/pi/.local/lib/python3.9/site-packages python /home/pi/script.py >> /var/log/script_output.log 2>&1

实际上,您可以通过交替最后一个目录来添加它应该保存到的任何日志文件。请注意,在运行脚本数月时,此文件可能会大量增长。此外,只在给出的参数之间插入空格(不包括;),以执行脚本的所有自动执行的crontab文件中的一行。

以保存和关闭crontab文件Ctrl + X,然后Y并点击Enter,您将返回终端。

摘要

我在根crontab文件中添加了以下内容,可以通过$ sudo crontab -e访问,以便每分钟执行脚本:

代码语言:javascript
运行
复制
*/1 * * * * PYTHONPATH=/path/to/python/site-packages python /path/to/py-script.py >> /var/log/save_log_here.log 2>&1

使用Python确定指向站点包的路径:

代码语言:javascript
运行
复制
>>> import sys
>>> sys.path
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42869518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档