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

217次阅读
没有评论

共计 2969 个字符,预计需要花费 8 分钟才能阅读完成。

背景

最近在玩一些自动化的东西,用到了 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 源码。

[/$]

碎碎念

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

 

 

 

 

正文完
 
sharp097
版权声明:本站原创文章,由 sharp097 2021-04-07发表,共计2969字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)