python - cron 没有启动工作的 python 脚本
问题描述
在我的树莓派 3b 上让 cron 工作时,我遇到了很多麻烦。我写了一个 python 脚本,从 thonny 或终端启动它没有问题,它运行顺利。
但是,当以以下方式启动 cron 作业时(根据测试时间更改分钟和小时):
25 21 * * * /usr/bin/python3 /home/pi/main.py >> /home/log/myscript.log 2>&1
我收到以下错误消息:
Traceback (more recent call last):
File "/home/pi/main.py", line 9, in <module>
import tweepy
ImportError: No module named 'tweepy'
不管我打电话sudo crontab -e
,nano crontab -e
还是cron -e
。我开始调查,我猜想调用 python 版本的问题在哪里。
因此,我将python3
调用替换为python3.5
,后来替换为python3.5m
,甚至python3.8
没有结果。在任何尝试中,我都尝试通过终端启动相同的命令,并且效果很好。尝试卸载并重新安装 tweepy 并检查了 Thonny 使用的 python 是 3.5 版本。
有什么麻烦?它快把我逼疯了。
编辑: 我备份了我的脚本并将树莓派重新安装到最新版本(5.10.17 linux 内核)。同样,我尝试将脚本与 Thonny 和终端一起使用并运行。
同样,我在使用 crontab 时遇到了同样的问题。
不过,我有个主意。我将 tweepy 版本更新为可用的最新版本,这就像一次绝望的尝试,并且发生了一些变化。
cron 没有与 tweepy 相关的错误,而是给了我这个:
Traceback (most recent call last):
File "/home/pi/Documents/TwitterBot/main.py", line 17, in <module>
a = soup.select('table > tr:has(> td > a:-soup-contains("San Pellegrino Terme")) td')
File "/usr/lib/python3/dist-packages/bs4/element.py", line 1376, in select
return soupsieve.select(selector, self, namespaces, limit, **kwargs)
File "/usr/lib/python3/dist-packages/soupsieve/__init__.py", line 112, in select
return compile(select, namespaces, flags, **kwargs).select(tag, limit)
File "/usr/lib/python3/dist-packages/soupsieve/__init__.py", line 63, in compile
return cp._cached_css_compile(pattern, namespaces, custom, flags)
File "/usr/lib/python3/dist-packages/soupsieve/css_parser.py", line 205, in _cached_css_compile
CSSParser(pattern, custom=custom_selectors, flags=flags).process_selectors(),
File "/usr/lib/python3/dist-packages/soupsieve/css_parser.py", line 1010, in process_selectors
return self.parse_selectors(self.selector_iter(self.pattern), index, flags)
File "/usr/lib/python3/dist-packages/soupsieve/css_parser.py", line 852, in parse_selectors
has_selector, is_html = self.parse_pseudo_class(sel, m, has_selector, iselector, is_html)
File "/usr/lib/python3/dist-packages/soupsieve/css_parser.py", line 510, in parse_pseudo_class
has_selector = self.parse_pseudo_open(sel, pseudo, has_selector, iselector, m.end(0))
File "/usr/lib/python3/dist-packages/soupsieve/css_parser.py", line 654, in parse_pseudo_open
sel.selectors.append(self.parse_selectors(iselector, index, flags))
File "/usr/lib/python3/dist-packages/soupsieve/css_parser.py", line 852, in parse_selectors
has_selector, is_html = self.parse_pseudo_class(sel, m, has_selector, iselector, is_html)
File "/usr/lib/python3/dist-packages/soupsieve/css_parser.py", line 585, in parse_pseudo_class
"'{}' pseudo-class is not implemented at this time".format(pseudo)
NotImplementedError: ':-soup-contains' pseudo-class is not implemented at this time
这是与 beautifulsup Cron 正在运行的版本有关的问题。
我尝试将 beautifulsup 更新到可用的最新版本,但没有结果。
我开始没有想法了,任何帮助将不胜感激。
解决方案
如果您正在运行虚拟环境,则 shell 脚本中的路径需要用于该虚拟环境。这是我在 AWS linux 实例上运行 shell 的方法。你可以玩这个,但我花了一段时间才弄清楚。也许只是在 cron 中添加长环境路径并跳过 shell 脚本。
这是在 my_shell.sh 里面
/usr/local/bin/pipenv run ~/.local/share/virtualenvs/ec2-user-zzkNbF-x/bin/python /home/ec2-user/my_path_to_file/my_file.py
这是我的 crontab 设置
0 21 * * mon-fri /home/ec2-user/my_path_to_file/my_shell.sh
推荐阅读
- php - PHP.是否可以在 file_put_contents 中使用变量?
- java - 如何在 kotlin 中实现相同的功能?
- java - 启动 Waves 节点 com 扩展 com.wavesplatform.dex.Matcher
- sql - SQL 从表部门明智地获取至少 2 个薪水
- python - pandas 将 int 或 string 转换为 float
- node.js - fetch : o 'Access-Control-Allow-Origin' 标头出现在请求的资源上:react 和 node
- sql-server - 为什么 SQL Server 数据源的下拉列表中缺少 .accdb?
- c# - 为什么接受引用类型的泛型方法不接受可空类型作为参数?
- postgresql - Postgres 行级策略问题
- amazon-redshift - Redshift:无法删除用户所有者默认权限