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

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

go倒是有V8引擎的封装包,可是必须还得编译这个引擎,挺麻烦的。

想起来还有selenium-python可以用。就决定这个了。因为selenium没有python3.4的版本,不得不重装了python2.7。

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

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

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

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

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

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

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

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

1)汉字编码问题。python会将汉字编码为本地编码(ansi,gbk)输出到标准输出;但是go会把它们当作utf-8编码的。

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

最后我的解决方案是在python脚本里将unicode字符串编码为utf-8字节串然后用base64编码,go里采用base64解码。这样不管是哪个原因肯定都没问题了。因为主要耗时在下载上,这点不便无所谓。

不过具体是哪种原因,我就不清楚了。

时间: 2024-11-03 21:34:46

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

Linux中 别名、内部命令、外部命令、hash缓存表 系统调用时的优先级比较

Linux系统中别名.内部命令.外部命令.hash缓存表 优先级优先级比较 在我们平时使用Linux系统执行各种命令时,会发现命令在执行过程中会区分哪个优先执行,哪个其次执行,这里我们来做个试验证明一下. 别名:用alias命令来设置命令的别名. 内部命令:内部命令在系统启动时就调入内存,是常驻内存的. 外部命令:外部命令是系统的软件功能表现为一个文件,用户需要时才从硬盘中读入内存. hash缓存表:linux系统下会有一个hash缓存表,当你刚开机时这个hash表为空,每当你执行过一条命令时,

<linux下内置命令和外部命令>

Linux下内置命令和外部命令 1.linux的命令可以分为内部命令和外部命令: 内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高. 而外部命令是系统的软件功能,用户需要时才从硬盘中读入内存. enable既可以查看内部命令,同时也可以判断是否为内部命令. [[email protected] ~]# enable ls  //判断ls是否为内置命令-bash: enable: ls: not a shell builtin //它不是内部命令[[email protected] ~

shell内部命令和外部命令

区别: 内部命令:内部命令被构建在shell之中.当执行shell命令时,内部命令的执行速度非常快.这是因为没有其他的进程因为执行这条命令而被创建.比如说,当我们执行"cd"命令时,没有进程被创建.在执行过程中只是简单的改变当前的目录. 外部命令:外部命令并没有被构建在shell中.这些可执行的外部命令保存在一个独立的文件当中.当一个外部命令被执行时,一个新的进程即被创建同时命令被执行.比如说,当我们执行"ls"(通常被保存在/bin 目录下)命令时,然后/usr/

shell的内部命令和外部命令

shell命令分成内置命令和外部命令. 内置命令(builtin command) 是shell解释程序内建的,有shell直接执行,不需要派生新的进程.有一些内部命令可以用来改变当前的shell环境. 常见的内部命令有:.(点命令).bg.cd.continue.echo.exec.exit.export.fg.jobs.pwd.read.return.set.shift.test.times.trap.umask.unset和wait. 外部命令(external command) 又分两种

linux中的内部命令和外部命令

linux中的命令大致可分为两类,内部命令和外部命令 内部命令:也称shell内嵌命令: 外部命令:存放在一个文件中,使用时需要去文件中查找,这些文件被定义在$PATH [[email protected] ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin type命令可以查看命令类型,以区别是内部命令还是外部命令 例 [[email protected] ~]# type cd cd is a

shell的内建命令和外部命令

shell的内建命令和外部命令 Shell执行的命令可以分为内建命令(built-in)和外部命令(external),前者是构建在shell内部:后者是一个独立的文件(可以是二进制文件,也可以是一个脚本). 内建命令的执行比较简单,由当前shell本身来执行,例如echo, eval, exec, export, readonly, read, shift, wait和点(.)等: 外部命令的执行比较复杂,shell进程会fork一个子进程,父进程随后挂起,然后在子进程中exec加载外部文件,

Linux内置命令和外部命令

1.Linux的命令可以分为内部命令和外部命令: 内置命令在系统启动时就调入内存,是常驻内存的,所以执行效率高. 而外部命令是系统的软件功能,用户需要时才从硬盘中读入内存. 2.type -  Display information about command type   #查看当前系统的命令是否为内置命令和外部命令. 3.BASH_BUILTINS  alias, bg, bind, break, builtin, caller, cd, command, compgen, complete

[笔记]内置命令与外部命令

内置命令(bulidin command):Bash程序本身提供,不需要到$PATH中查找,执行效率高外部命令:独立存在与文件系统中的可执行文件,文件需要存在于$PATH中        判断方法:type COMMAND 注意:Linux中严格区分大小写!!! 常见的内置命令:    help: 显示所有内置命令列表或单个内置命令的用法    type:判断命令的类型是内置还是外部命令    echo:显示,默认自动换行(加 -n 选项取消换行)    printf:依照格式显示参数内容,与C

Bash 中同名的内部命令和外部命令

昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息.有人回答他了,原因是 coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受任何选项.当你在 Bash 里执行 [ --help 时,当然优先执行的是内部命令 [,而不是外部命令 [,执行 /usr/bin/[ --help(在我的 Mac 上是在 /bin/[)才能获得他想要的帮助信息. 其实除了 [,还有一些其它外部命令也会和 Bash 提供的内部命令同名,下面列举一下