关于调用外部命令时与外部命令的数据交互的注意点

前两天,我打算下载点图片。用fiddler分析了下,结果那个网页大量使用js来操做cookie,弄得我头大。python

go却是有V8引擎的封装包,但是必须还得编译这个引擎,挺麻烦的。浏览器

想起来还有selenium-python能够用。就决定这个了。由于selenium没有python3.4的版本,不得不重装了python2.7。cookie

多说一句,python3确实比python2的组织等各个方面改进不少,写起来感受更好。惋惜第三方库稀少是硬伤。网络

当时个人思路是这样的,用python和selenium来操做浏览器,提取网页图片地址和标题,传递给go,由go下载。python2.7

之因此由go下载,是由于python2的urllib等网络库有问题,常常会下载资源失败却不返回错误。相比之下,go的net库能够保证只要错误值是nil,下载必然完整。编码

我写了个python脚本,该python脚本会从标准输入接受一个网址,而后返回标题,以后,会依次访问每一个漫画页面并返回图片网址。最后会输出一个结束标志。下载完毕后,能够再次接受网址进行下一次下载。url

能够用go的exec.Command启动python脚本,而后用*Cmd类型返回值的StdinPipe()、StdoutPipe()方法的返回值来实现与子进程的交互,使用Start()方法启动命令就好了。code

实际上是个很简单的程序,算上go程,log,加锁,监视剪贴板等等部分也不到80行。进程

戏肉来了。我发现当标题中包含汉字时,程序就会出问题。主程序没有得到标题,子命令挂掉了。图片

检查了一下,我认为有两种可能的缘由:

1)汉字编码问题。python会将汉字编码为本地编码(gbk)输出到标准输出;可是go会把它们看成utf-8编码处理。

2)这种调用外部命令并进行交互的状况,就不支持非ASCII码。

最后个人解决方案是在python脚本里将unicode字符串编码为utf-8字节串而后用base64编码,go里采用base64解码。这样无论是哪一个缘由确定都没问题了。由于主要耗时在下载上,这点不便无所谓。

不过具体是哪一种缘由,我就不清楚了。

相关文章
相关标签/搜索