os.system和子流程调用之间的区别

发布于 2021-01-29 15:57:39

我创建了一个程序,该程序在本地服务器上创建Web架构,然后加载必要的浏览器以在localhost上显示html和php页面。

os.system调用将杀死python进程,但不会终止其他进程-例如,httpd.exemysqld.exe

subprocess调用会杀死httpd.exemysqld.exe程序,但会继续运行python代码,并且在subprocess调用之后不会执行任何代码。

在执行python代码后,我将如何终止或隐藏所有必要的进程?

这是我的代码。

os.makedirs(dr + x + '/admin' + '/css')
dobj = open(dr + x + '/admin' + '/css' + '/style.css', 'w')
dobj.close()
del dobj
os.makedirs(dr + x + '/admin' + '/js')
os.makedirs(dr + x + '/admin' + '/img')
################################################################################
## THE OS SYSTEM CALLS CLOSE THE APP BUT OPEN THE PROCESSES
## AND THE SUBPROCESS CALLS CLOSE BOTH PROCESSES AND LEAVES THE APP OPEN
## CANT WIN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
os.makedirs(dr + x + '/admin' + '/conf')
#os.system(r'C:\\xampp\\apache\\bin\\httpd.exe')
#os.system(r'C:\\xampp\\mysql\\bin\\mysqld.exe')
subprocess.Popen(['C:\\xampp\\apache\\bin\\httpd.exe'], shell=True, creationflags=subprocess.SW_HIDE)
subprocess.Popen(['C:\\xampp\\mysql\\bin\\mysqld.exe'], shell=True, creationflags=subprocess.SW_HIDE)
webbrowser.open('localhost/' + x)
sys.exit()
################################################################################


else:
    backmaybe = raw_input('Already Exists... Try Again? (Y/N) ')
if backmaybe == 'y':
    start()
else:
    sys.exit()
关注者
0
被浏览
38
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    os.system和之间的区别subprocess.Popen是Popen实际上打开了一个管道,并os.system启动了一个子外壳,就像subprocess.call。Windows仅一半支持*
    nix操作系统将提供的某些管道/外壳功能,但区别基本上仍应相同。子shell不允许您像管道一样与另一个进程的标准输入和输出进行通信。

    您可能想要的是使用子流程,但要在应用程序终止之前在管道对象上调用kill()方法(来自docs)。这样,您就可以决定何时终止进程。您可能需要通过调用pipe.communicate()并关闭管道的文件句柄来满足进程要执行的所有I
    / O操作。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看