subprocessPopen
osstartfile
import os
ossystem(r’”D:\Program Files\Foxit Software\Foxit readerexe” abcpdf’)
偶想”"是不可缺少的,因为路径中有空格,否则极容易出错;对-参数不了解,不发表意见
使用ossystem会有几个问题:
1、ossystem会阻塞程序继续运行(如果是图形界面,还会把图形界面搞的没反应),当然如果需要阻塞,自然不是问题。
2、ossystem会打开一个命令行窗口,这是比较讨厌的;除非你确实需要显示这个命令行窗口或者本来就是命令行里运行的。
所以还是建议使用 ospopen,基本语法是一样的
import os ospopen(r’”D:\Program Files\Foxit Software\Foxit readerexe” abcpdf’)
这样不会出现命令行窗口,不会阻塞程序运行
如果需要阻塞程序运行,可以这样写:
ospopen(r’”D:\Program Files\Foxit Software\Foxit readerexe” abcpdf’)read()
简单说就是,使用subprocess模块的Popen调用外部程序,如果stdout或stderr参数是pipe,并且程序输出超过 *** 作系统的pipesize时,如果使用Popenwait()方式等待程序结束获取返回值,会导致死锁,程序卡在wait()调用上。ulimit-a看到的pipesize是4KB,那只是每页的大小,查询得知linux默认的pipesize是64KB。看例子:#!/usr/bin/envpython#coding:utf-8#yc@2013/04/28importsubprocessdeftest(size):print'start'cmd='ddif=/dev/urandombs=1count=%d2>/dev/null'%sizep=subprocessPopen(args=cmd,shell=True,stdout=subprocessPIPE,stderr=subprocessSTDOUT,close_fds=True)#pcommunicate()pwait()print'end'#64KBtest(641024)#64KB+1Btest(641024+1)首先测试输出为64KB大小的情况。使用dd产生了正好64KB的标准输出,由subprocessPopen调用,然后使用wait()等待dd调用结束。可以看到正确的start和end输出;然后测试比64KB多的情况,这种情况下只输出了start,也就是说程序执行卡在了pwait()上,程序死锁。具体输出如下:startendstart那死锁问题如何避免呢?官方文档里推荐使用Popencommunicate()。这个方法会把输出放在内存,而不是管道里,所以这时候上限就和内存大小有关了,一般不会有问题。而且如果要获得程序返回值,可以在调用Popencommunicate()之后取Popenreturncode的值。结论:如果使用subprocessPopen,就不使用Popenwait(),而使用Popencommunicate()来等待外部程序执行结束。Popenwait()¶WaitforchildprocesstoterminateSetandreturnreturncodeattributeWarningThiswilldeadlockwhenusingstdout=PIPEand/orstderr=PIPEandthechildprocessgeneratesenoughoutputtoapipesuchthatitblockswaitingfortheOSpipebuffertoacceptmoredataUsecommunicate()toavoidthatPopencommunicate(input=None)¶Interactwithprocess:SenddatatostdinReaddatafromstdoutandstderr,untilend-of-fileisreachedWaitforprocesstoterminateTheoptionalinputargumentshouldbeastringtobesenttothechildprocess,orNone,ifnodatashouldbesenttothechildcommunicate()returnsatuple(stdoutdata,stderrdata)Notethatifyouwanttosenddatatotheprocess’sstdin,youneedtocreatethePopenobjectwithstdin=PIPESimilarly,togetanythingotherthanNoneintheresulttuple,youneedtogivestdout=PIPEand/orstderr=PIPEtooNoteThedatareadisbufferedinmemory,sodonotusethismethodifthedatasizeislargeorunlimitedsubprocess的两种方法:1)如果想调用之后直接阻塞到子程序调用结束:DependingonhowyouwanttoworkyourscriptyouhavetwooptionsIfyouwantthecommandstoblockandnotdoanythingwhileitisexecuting,youcanjustusesubprocesscall#startandblockuntildonesubprocesscall([data["om_points"],">",diz['d']+"/pointsxml"])2)非阻塞的时候方式:Ifyouwanttodothingswhileitisexecutingorfeedthingsintostdin,youcanusecommunicateafterthepopencall#startandprocessthings,thenwaitp=subprocessPopen(([data["om_points"],">",diz['d']+"/pointsxml"])print"Happenswhilerunning"pcommunicate()#nowwaitAsstatedinthedocumentation,waitcandeadlock,socommunicateisadvisable
Windows 10
Python 352
PyQt5
pyinstaller
使用pyinstaller打包exe,最近在打包包含subprocessPopen时发现,加上参数—noconsole时产生的exe文件在运行的时候,进程并没有运行。经过一番google,问题得以解决,现将解决方法记录一下,形成此文。
我这里需要利用subprocessPopen创建一个进程去执行一个命令行 *** 作,
mProcess = subprocessPopen(cmd,stdin=subprocessPIPE, stdout=subprocessPIPE, stderr=subprocessPIPE)
pyinstaller打包 *** 作命令如下
pyinstaller -F -w xxxpy
打包后生成的exe,可以运行,不过查看进程并没有如预期正确地工作。
在创建进程时,加上startupinfo参数,如下
si = subprocessSTARTUPINFO()
sidwFlags|= subprocessSTARTF_USESHOWWINDOW
mProcess=subprocessPopen(cmd,stdin=subprocessPIPE,stdout=subprocessPIPE,stderr=subprocessPIPE,startupinfo=si)
问题完美解决,具体可以参考下 >
方法一、ossystem() 会保存可执行程序中的打印值和主函数的返回值,且会将执行过程中要打印的内容打印出来。
import os
main = "project1exe"
r_v = ossystem(main)
print (r_v )
方法二、commandsgetstatusoutput() 会保存可执行程序中的打印值和主函数的返回值,但不会将执行过程中要打印的内容打印出来。
import subprocess
import os
main = "project1exe"
if ospathexists(main):
rc,out= subprocessgetstatusoutput(main)
print (rc)
print (''10)
print (out)
方法三、popen() 会保存可执行程序中的打印值,但不会保存主函数的返回值,也但不会将执行过程中要打印的内容打印出来。
import os
main = "project1exe"
f = ospopen(main)
data = freadlines()
fclose()
print (data)
另外,上面提到的三种方式,实际上都是在python中执行命令,因此他们不只是用来执行可执行文件,也可以用来执行linux系统中别的指令。
关于python中3种调用可执行文件exe的方法,环球青藤小编就和大家分享到这里了,学习是永无止境的,学习一项技能更是受益终身,所以,只要肯努力学,什么时候开始都不晚。如果您还想继续了解关于python编程的学习方法及素材等内容,可以点击本站其他文章学习。
以上就是关于python 怎么启动一个外部命令程序,并且不阻塞当前进程全部的内容,包括:python 怎么启动一个外部命令程序,并且不阻塞当前进程、Python Popen communicate 和wait使用上的区别、pyinstaller打包exe时subprocess无效的解决方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)