共计 2969 个字符,预计需要花费 8 分钟才能阅读完成。
背景
最近在玩一些自动化的东西,用到了 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 源码。
[/$]
碎碎念
本问题解决起来很简单,但是却耗费了我一个下午的工作时间去分析问题,所以定价略高,还望大家能够理解,有什么问题及时留言,我会收到邮件通知立刻回复你的哦~