背景

最近在玩一些自动化的东西,用到了java开发的SikuliX IDE工具,由于要和网站交互那么我自然想到了用大名鼎鼎的Python Requests库了,可是不管我怎么样在电脑上反反复复的用pip2或pip3卸载然后重装requests都会报下面的错误,

探索SikuliX IDE下的Python 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了,但是又开始时不时的报下面的错误了,五次里面可能会有四次报,

探索SikuliX IDE下的Python Requests库的安装及最佳实践

报错原文我也贴一下:

[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 --------------

可是聪明如我,历经九九八十一难,我又搞定了这件事,如下:

探索SikuliX IDE下的Python Requests库的安装及最佳实践

注意看上图右侧,由于字符编码问题,我们换成了请求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库,如下:

探索SikuliX IDE下的Python 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

探索SikuliX IDE下的Python Requests库的安装及最佳实践

我们看到命令行模式又成功的拿到yandex的首页html源码。

[/$]

碎碎念

本问题解决起来很简单,但是却耗费了我一个下午的工作时间去分析问题,所以定价略高,还望大家能够理解,有什么问题及时留言,我会收到邮件通知立刻回复你的哦~