从 cronjob 运行时,Python 找不到自定义安装的模块

标签 python linux python-3.x cron pip

我正在尝试使用 cronjob 将 python 脚本设置为每两分钟运行一次,crontab 行在下方。 python 脚本由下面发布的 shell 脚本 script.sh 调用。这个 python 脚本启动一个 selenium webdriver,收集一些数据并将其保存到一个 csv 文件。下面还有一个片段。

定时任务

    */2 * * * * export DISPLAY=:0 && /home/me/workspace/project/script.sh > /home/me/workspace/project/cron.log 2>&1

需要 export DISPLAY=:0 才能在 cronjob 中运行 selenium,如 here 所示. 此位 (>/home/me/workspace/project/cron.log 2>&1) 将输出和错误记录到 cron.log 文件。

脚本.sh

    #!/bin/bash
    python3 /home/me/workspace/project/foo.py

foo.py

    from datetime import datetime
    from selenium import webdriver
    from pyvirtualdisplay import Display

    display = Display(visible=0, size=(800, 600))
    display.start()
    with webdriver.Chrome() as driver:
        #do some scraping and save to csv
        pass

当我手动运行 script.sh 时,一切运行顺利,没有错误。但是当我设置 crontab 时,脚本失败了。 cron.log 文件显示:

    Traceback (most recent call last):
    File "/home/me/workspace/project/foo.py", line 7, in <module>
        from selenium import webdriver
    ImportError: No module named 'selenium'

这表示没有安装 selenium,但是 pip3 freeze | grep Selenium 产量:

    $ pip3 freeze | grep selenium
    selenium==3.13.0

这表明 selenium 已安装(正如预期的那样,因为脚本在手动启动时运行良好)。如果我注释掉 selenium 行,另一个库 pyvirtualdisplay 也会发生同样的事情。 所以问题是,出于某种原因,python 在通过 cronjob 运行时找不到自定义安装的模块。我已经尝试用“/usr/bin/env python3”或“替换”python3/usr/bin/python3' 和它的其他变体,无济于事。

如果有人可以发布解决方案提示,我将不胜感激,谢谢。

最佳答案

#!/bin/bash
python3 /home/me/workspace/project/foo.py

我认为这是你的问题。当@Martijn Pieters 说这是一个路径问题时,他是正确的。您需要确保您调用的“python3”是安装了 selenium 的 python3。无论您从哪里进行 pip3 卡住,您都需要确保 cron 看到的是什么。

当我使用 cronjobs 时,我让我的 anaconda virtualenv 显式运行该作业,如下所示:

/home/username/anaconda/envs/python3/bin/python /home/me/workspace/project/foo.py

关于从 cronjob 运行时,Python 找不到自定义安装的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51124858/

相关文章:

python - 使用 linux 命令从宽格式转换为长格式

linux - MySQL Workbench 不会让 root 连接基于 Linux 的 debian

python-3.x - 无效类型参数类 str,有效类型类 dict

python - 获取数据框中匹配和不匹配列数据的计数

python - backend_qt5.py "' figure' 是一个未知的关键字参数,在 matplotlib

c - epoll - 轮询多个文件描述符(即套接字)

python - 使用parse_date的infer_datetime_format需要更多时间

python - 从字符串序列创建 Python lambda 函数

python - 在 Mac OSX El Capitan 下如何让 PyC​​harm 识别 Python 2.7 中的 sys 模块?

python - 寻找一个python函数来查找字符串中最长的连续重复子串