python脚本监控程序问题&解决

一、如下两段代码区别?python

child = subprocess.Popen(command)
child = subprocess.Popen(command,
                                     stderr=subprocess.STDOUT,  # 表示子进程的标准错误
                                     stdout=subprocess.PIPE  # 表示须要程序标准输出
                                     )

加上stdout参数,能够获取command命令执行的子进程的标准输出,这有利于监控子进程执行状况。shell

二、read为何会出现deadlock?windows

stdout.read出现死锁并阻塞的缘由:函数

解决办法:用communicate()代替.net

三、communicate的返回结果(out, err)都表明什么?3d

out, err = child.communicate()

communicate()函数有两个返回值,因此须要用两个变量来接收。out和err分别是标准输出内容和标准错误内容。code

四、subprocess.call和subprocess.Popen区别联系(参考Python Popen communicate() 和wait()使用上的区别blog

当你对shell命令的输出不感兴趣,只但愿程序被运行,你能够典型的使用subprocess.call。若是你须要捕获命令的输出结果,那么你就须要使用subprocess.Popen。
在subprocess.call与Popen之间,存在一个很是大的区别。subprocess.call会封锁对响应的等待,而subprocess.Popen则不会。(能够理解为若是程或者子进程没有响应,.call不理它,继续执行python语句,而Popen会等待,直到子进程输出结果才执行下一步语句)进程

五、python和pythonw区别联系get

若是不想看到控制台,就用pythonw.exe来运行py,或者将.py改成.pyw。

这里咱们遇到了一个问题就是:不能正常的运行pythonw

解决办法:在pyw文件中添加如下代码

import sys, os
if sys.executable.endswith("pythonw.exe"):
  sys.stdout = open(os.devnull, "w");
  sys.stderr = open(os.path.join(os.getenv("TEMP"), "stderr-"+os.path.basename(sys.argv[0])), "w")

六、child.poll()一直输出none?

开启的child子程序的问题,检查子程序是否正常便可。

七、popen(command,stderr,stdout)几个参数都表明了什么?

见问题一

 

参考资料:.pyw and pythonw does not run under Windows 7

pythonw.exe or python.exe?

扩展名改成pyw后没法运行的问题记录

相关文章
相关标签/搜索