python3 subprogess.Popen ,call,run 调用程序用法之区别(自悟)
有点c#基础,但还是觉得多学点好,于是初学py,入门的就是python3.7.3,然后实践写了一个攫取图片的小爬虫。起始用的下载方法是urllib.request.urlretrieve,千辛万苦跨过了反爬机制,又对它的下载速度不满意起来,于是转行调用外部程序IDM神器下载,虫子负责解析出图片地址,于是这就踩入了一个大坑(嗯,不熟悉啊。。。别喷,我不是专职程序员,也从来没有专门上过课,纯是业余自学的c#。。。)
回题,如标题所述,在调用IDM并向它传递图片地址时,我发现了popen call run 三种用法的不同之处。
我是开启了另外的线程进行的下载操作,初始使用subprogess.Popen(idm。。。)【例图1】,但在传递地址过程中,进度倒是飞快,可等到IDM真正下载完成之后,发现总是出现丢数据的现象,例如明明解析出10张图片,到最后下载到的只有七张,八张……打折比例也太高了些,真坑!(刚开始用urllib.request.urlretrieve下载图片也会出现这种现象)
网络上关于这三个参数的讲解五花八门,发现个问题,大部分讲解只是摘抄,举例甚少,更是很少讲解细节,看得的我头晕,挠头琢磨了多半天也没搞明白我的问题出在哪里,后来无意中将popen换作了call,突然发现数据就正常了。但有一点,传递地址的速度降了下来,不过这样一来,数据完整了,该10张就10张,不给打折了。
后来改用run,发现其实与call没有什么不同,但run 、call与popen不同之处太大了,popen丢数据,另两个不会。不知道是我姿势不对还是它姿势不对的原因。不过这才明白call run基准是有返回状态的,意思是父进程会等待call run的子进程完成,而我理解,popen可能是个主意很正的独行侠吧,我干我的,爱咋咋地……
我不熟悉它们的用法,还处于懵懂状态,但这到底是我的自悟,写下以促已。当然也欢迎指正喽……
这是我第一次在CSDN写点小品,好吧,也算是留念了。