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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、以下两段代码区别?

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

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

2、read为什么会出现deadlock?

stdout.read出现死锁并阻塞的原因:

python脚本监控程序问题&解决_第1张图片

python脚本监控程序问题&解决_第2张图片

解决办法:用communicate()代替

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

out, err = child.communicate()

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

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

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

5、python和pythonw区别联系

如果不想看到控制台,就用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")

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

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

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

见问题一

 

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

pythonw.exe or python.exe?

扩展名改为pyw后无法运行的问题记录

转载于:https://my.oschina.net/u/3636678/blog/2239950

你可能感兴趣的:(python脚本监控程序问题&解决)