背景
最近在玩一些自动化的东西,用到了java开发的SikuliX IDE工具,由于要和网站交互那么我自然想到了用大名鼎鼎的Python Requests库了,可是不管我怎么样在电脑上反反复复的用pip2或pip3卸载然后重装requests都会报下面的错误,
错误原文我也贴一下:
[error] script [ sikulix ] stopped with error in line 1
[error] ImportError ( No module named requests )
[error] --- Traceback --- error source first
line: module ( function ) statement
1: main ( <module> ) import requests
[error] --- Traceback --- end --------------
后来历经千辛万苦终于搞定了这个问题,现在sikulix IDE终于不报ImportError了,但是又开始时不时的报下面的错误了,五次里面可能会有四次报,
报错原文我也贴一下:
[error] script [ sikulix ] stopped with error in line 2
[error] java.util.concurrent.RejectedExecutionException ( java.util.concurrent.RejectedExecutionException: event executor terminated )
[error] --- Traceback --- error source first
line: module ( function ) statement
919: _socket ( _connect ) bind_future = bootstrap.bind(self.bind_addr).sync()
951: _socket ( connect ) self._connect(addr)
1457: _socket ( meth ) return getattr(self._sock,name)(*args)
86: connection ( create_connection ) sock.connect(sa)
86: connection ( create_connection ) sock.connect(sa)
169: connection ( _new_conn ) conn = connection.create_connection(
169: connection ( _new_conn ) conn = connection.create_connection(
353: connection ( connect ) conn = self._new_conn()
1010: connectionpool ( _validate_conn ) conn.connect()
382: connectionpool ( _make_request ) self._validate_conn(conn)
382: connectionpool ( _make_request ) self._validate_conn(conn)
699: connectionpool ( urlopen )
httplib_response = self._make_request(
699: connectionpool ( urlopen ) httplib_response = self._make_request(
439: adapters ( send ) resp = conn.urlopen(
439: adapters ( send ) resp = conn.urlopen(
655: sessions ( send ) r = adapter.send(request, **kwargs)
542: sessions ( request ) resp = self.send(prep, **send_kwargs)
61: api ( request ) return session.request(method=method, url=url, **kwargs)
76: api ( get ) return request('get', url, params=params, **kwargs)
2: main ( <module> ) resp=requests.get("https://www.yandex.com")
[error] --- Traceback --- end --------------
可是聪明如我,历经九九八十一难,我又搞定了这件事,如下:
注意看上图右侧,由于字符编码问题,我们换成了请求yandex网站,我们可以清晰的看到成功的拿到了yandex的首页html源码。
解决方案
[$]
做法其实很简单,我们分两个部分来解释:
第一个错误,那是因为SikuliX IDE自己内部集成了jython,你外部也就是本机的python无论再怎么安装python库都不会对SikuliX IDE产生作用,
正确的做法是去这里的jython官网下载并安装一个最新的jython,下载完了打开powershell用 java -jar jython-installer-2.7.2.jar命令一直下一步来安装,注意如果安装到c盘需要管理员权限,假设安装路径是C:\Program Files (x86)\jython\bin, 装完后把这个路径加到系统环境变量里面去,然后我们用jython带的pip命令来安装一下requests库,如下:
注意上面用的是jython带的pip2.7.exe,要和你系统原先的pip3做区分哦。
然后我们来到上面假定的jython的一个安装路径的子目录C:\Program Files (x86)\jython\Lib\site-packages中,全选所有的内容分拷贝一下,然后再来到C:\Users\sharp\AppData\Roaming\Sikulix\Lib\site-packages(这个路径在win10中是固定的,下同)中,注意这个路径中的sharp要换成你自己的用户名,然后粘贴,此时你关闭SikuliX IDE重新打开第一个错误就被解决了。
下面我们来说说第二个错误,第二个错误也很好办,原因是SikuliX自带的jython中的httplib实现的不好导致的,我们来到C:\Program Files (x86)\jython\Lib\中,找到htmllib.py和htmllib$py.class复制一下然后再覆盖到C:\Users\sharp\AppData\Roaming\Sikulix\Lib\中就可以了,此时重启一下IDE再运行代码这个问题也被解决了。
注意SikuliX IDE每次运行后还原httplib的库文件,导致要不停的覆盖,如果你们的脚本成型了准备到生产环境来跑了,可以考虑用SikuliX的命令行环境来运行,经测试命令行环境不会每次都覆盖掉httplib库文件,示例如下:
java -jar .\sikulixide-2.0.5.jar -r .\sikulix.py
我们看到命令行模式又成功的拿到yandex的首页html源码。
[/$]
碎碎念
本问题解决起来很简单,但是却耗费了我一个下午的工作时间去分析问题,所以定价略高,还望大家能够理解,有什么问题及时留言,我会收到邮件通知立刻回复你的哦~