我有一个python脚本,在下一行中通过selenium调用chrome。
ff = webdriver.Chrome('/home/user01/webScraping/CollectAndGo/chromedriver')
python脚本是从shell脚本调用的。
python /home/user01/webScraping/CollectAndGo/cgcom.py > /home/user01/webScraping/CollectAndGo/cgcom.log 2>&1
当我从终端运行脚本或只是执行时。sh文件它工作得很好,但当我计划crontab作业时,它会失败,并出现下一个错误。
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: u'unknown error: Chrome failed to start: exited abnormally\n (Driver info: chromedriver=2.9.248304,platform=Linux 3.5.0-36-generic x86_64)'
错误与此问题的第一行代码有关。有人知道为什么会这样吗?
使用pyVirtual alshow和Xvfb为您管理您的窗口会话(最初来自此答案)
背景:
就我而言,公认的答案是行不通的。
解决方案:
pip3 install pyvirtualdisplay
sudo apt-get install xvfb
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from pyvirtualdisplay import Display
import time
# Display creates a virtual frame buffer and manages it for you
with Display(visible=False, size=(1200, 1500)):
driver = webdriver.Firefox()
driver.get("https://website-target.com")
time.sleep(1)
print(driver.current_url) # check connection
time.sleep(1)
print(driver.current_url)
driver.close()
在MacOS Catalina上只有这个命令对我有效
* * * * * export DISPLAY=:0 && export PATH=$PATH:/usr/local/bin && /usr/bin/python3 ~/Documents/Scripts/my_script.py
尝试从cron启动浏览器最明显的问题是,即使计算机上运行了X,也没有为从crontab运行的进程设置DISPLAY环境变量,因此从那里启动浏览器将失败。
解决方案的范围从琐碎到超级复杂。一个简单的解决方案是接受如果没有X运行,您的脚本将无法运行,并手动将DISPLAY
设置为: 0
,这是Ubuntu启动的默认X服务器的默认显示号。
例如,如果我把这个命令放在crontab行的command列中,Chrome就会启动而不会出现问题:
DISPLAY=:0 google-chrome
特定于用户的crontab文件中的完整行如下所示:
0 * * * * DISPLAY=:0 google-chrome
如果要运行通过selenium启动chrome的python脚本,则该行应该如下所示:
0 * * * * DISPLAY=:0 python my_script.py
命令字符串按原样发送到shell,因此在最后一个示例中,字符串显示=:0 python my\u脚本。py将只传递给shell。常见的shell语法是将命令开头立即给出的变量赋值解释为设置环境变量。(dash和bash当然是这样,其中一个可能是大多数安装中的默认shell。)因此,shell解释的命令将环境变量DISPLAY设置为值0,然后运行python my\u脚本。py 。由于python从启动它的shell继承了它的环境,因此变量DISPLAY也为0。
设置DISPLAY=: 0
,就像我上面显示的那样,仅为后面的命令设置变量。也可以为crontab执行的所有命令将DISPLAY
设置为: 0
。例如在以下用户特定的crontab中:
DISPLAY=:0
30 * * * * google-chrome
0 * * * * python my_script.py
行DISPLAY=:0设置执行google chrome和python my\u脚本的环境变量DISPLAY。py
问题内容: 我有一个Python脚本,通过下一行通过selenium调用chrome。 python脚本是从shell脚本调用的。 当我从终端运行脚本或仅执行.sh文件时,它可以正常运行,但是当我计划crontab作业时,它将失败并显示下一个错误。 该错误与该问题的第一行代码有关。有人知道为什么会这样吗? 问题答案: 尝试从中启动浏览器最明显的问题是,即使您的计算机上运行了X,也未为从您的运行中的
问题内容: 我想让cron作业使用一个已经存在的名为my_env的anaconda python环境执行python脚本。我唯一想做的是让cron作业运行一个名为的脚本,该脚本又会激活env,然后运行python脚本。 尝试从命令行执行此脚本不起作用: 我需要做什么以确保激活正确的环境。可以像我5岁时向我解释一下。 问题答案: 不要打电话,但是。是bash命令。 要不就 因为您添加了bash sh
我试图让一个Python脚本使用crontab每小时运行一次,但我似乎无法让它工作。 如果我从终端手动运行Python程序,它运行良好并完成。 我的crontab设置如下: 让我澄清一下,我遵循了这篇类似文章的建议。我尝试了创建输出文件的简单测试脚本并成功了。但是在具有相同设置的相同crontab下,我的程序无法完成。 有趣的是,在脚本即将启动时使用TOP,Python窗口会在再次消失之前短暂弹出
问题内容: 我已经阅读了多篇文章和许多文章,详细介绍了cron作业中的脚本需要保留由于cron中shell的打开而在脚本本身内部运行所需的环境变量。我的情况是独特的,因为我的路径变量都是按照所讨论的那样设置的,这反过来将使用subprocess.call ()成功调用pysaunter python egg ,但是它似乎从那里分解了。这导致整个过程中断了cron作业。 为了清楚起见,以下是我引用的
问题内容: 上面的代码是我的bash文件。这里有两个命令 创建txt文件 执行Docker容器 如果我运行此命令 在终端然后它正在工作 但是当我在crontab中运行时 那么只有txt文件创建有效,而docker容器无效。 问题答案: 使用伪tty并以交互方式运行的请求,但是cron不会附加到任何TTY。尝试删除在
我试图在raspberry pi 4打开时自动运行python脚本,并使用crontab来实现。该脚本是一个GUI,可帮助填充和搜索数据库。raspberry pi没有给出任何错误或异常,它只是正常打开,没有给出运行脚本的信号。我在crontab中使用的命令是: 脚本使用的库是: tkinter 感谢您的时间,这是我第一次在raspberry pi或linux环境中工作,所以我不太了解它。