python 怎么启动一个外部命令程序,并且不阻塞当前进程

python 怎么启动一个外部命令程序,并且不阻塞当前进程,第1张

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无效的解决方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9736128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存