2019独角兽企业重金招聘Python工程师标准>>>
1、以下两段代码区别?
child = subprocess.Popen(command)
child = subprocess.Popen(command,
stderr=subprocess.STDOUT, # 表示子进程的标准错误
stdout=subprocess.PIPE # 表示需要程序标准输出
)
加上stdout参数,可以获取command命令执行的子进程的标准输出,这有利于监控子进程执行情况。
2、read为什么会出现deadlock?
stdout.read出现死锁并阻塞的原因:
解决办法:用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后无法运行的问题记录