首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在cron中运行无头硒时,出现错误"Pyperclip无法为您的系统找到复制/粘贴机制“。

在cron中运行无头硒时,出现错误"Pyperclip无法为您的系统找到复制/粘贴机制“。
EN

Stack Overflow用户
提问于 2022-07-04 09:25:39
回答 2查看 236关注 0票数 2

我用Python实现了一个selenium脚本,将一些图片和内容上传到Facebook,我将其命名为FBUpload.py。

当我以这种方式启动它时,它完美地工作(在无头模式下):

代码语言:javascript
复制
Xvfb :10 -ac &
python3 /home/someuser/scripts/FBUpload.py

问题是,当我试图配置一个启动相同脚本的cronjob时,方法是:

代码语言:javascript
复制
00 * * * * Xvfb :10 -ac &
01 * * * * python3 /home/someuser/scripts/FBUpload.py
45 * * * * kill -9 $(ps -auxw |grep Xvf|head -1| awk '{print $2}')

如果出现以下错误,则会失败:

无法找到系统的复制/粘贴机制。

这是我的设置:Ubuntu20.04.4LTS\ Python3 _

下面是我已经安装的复制和粘贴机制:

代码语言:javascript
复制
PyQt5 5.15.6
PyQt5-Qt5 5.15.2
PyQt5-sip 12.10.1
QtPy 2.1.0
xclip 0.13-1 (in /usr/bin because it was installed via apt)
xsel 1.2.0+git9bfc13d.20180109-3 (in /usr/bin because it was installed via apt)

(我无法像本文中描述的那样下载PyQt4或qkt:pyperclip模块引发错误消息,所以我按照建议的解决方案下载了QtPy。但问题依然存在。

我尝试了类似问题的帖子中的修复,但没有一个对我有用。我想知道这个问题是否与用户有关(因为当我用"sudo“运行脚本时,根用户找不到非root用户安装的库)。

我还发现了另一个似乎类似的问题(但问题不是cron,而是systemd):Ubuntu 16.04 - Python 3-终端和systemd中的Pyperclip

EN

回答 2

Stack Overflow用户

发布于 2022-07-27 13:10:12

您需要提供DISPLAY env。

试试这个:

代码语言:javascript
复制
01 * * * * DISPLAY=":0" python3 /home/someuser/scripts/FBUpload.py

如果这不起作用,请检查当前env,尝试找到正确的值:

代码语言:javascript
复制
echo $DISPLAY
票数 1
EN

Stack Overflow用户

发布于 2022-07-27 22:35:03

剪贴板是GUI不可分割的一部分。由于您正在使用Xvfb,因此您的系统可能没有自己的GUI。所以没有剪贴板可以复制和粘贴。吡咯烷酮夹没有可访问的剪贴板,因此无论以何种方式访问它,都将面临以下错误:

代码语言:javascript
复制
Pyperclip could not find a copy/paste mechanism for your system

解决方案

在shell中检查此命令:

代码语言:javascript
复制
xclip

如果输出是Error: No display: <null>,事情可能会变得更加困难。

但是,为了有一个GUI,因为您可以通过ssh将隧道X11设置到桌面计算机上的X服务器。如果您仍然从xclip中看到一个错误,那么问题在于您的设置。最简单的方法是检查:

代码语言:javascript
复制
echo $DISPLAY

如果您得到一个空白输出,那么您的会话对您的X11隧道一无所知。你需要正确设置隧道。一旦你的设置是正确的固定,除草夹和你的程序应该是工作的。

替代方法

另一种方法是使用PyVirtualDisplay ( Xvfb、Xephyr和Xvnc的Python包装器)运行无头硒WebDriver测试。

在Ubuntu/Debian上安装PyVirtualDisplay:

代码语言:javascript
复制
$ sudo apt-get install xvfb python-pip
$ sudo pip install pyvirtualdisplay

在您的程序中,您可以:

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

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(800, 600))
display.start()

# now Browser will run in a virtual display but won't be visible
driver = webdriver.Firefox()
driver.get('http://www.google.com')
print driver.title
browser.quit()

display.stop()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72854490

复制
相关文章

相似问题

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