os.system和subprocess调用的区别

8
我已经创建了一个程序,它在本地服务器上创建了一个 Web 架构,然后加载必要的浏览器以在 localhost 上显示 HTML 和 PHP 页面。
os.system 调用会杀死 Python 进程,但不会杀死其他进程,例如 httpd.exe 和 mysqld.exe。
subprocess 调用会杀死 httpd.exe 和 mysqld.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()

1
sys.exit() 执行后,httpd 和 mysqld 的期望运行状态是什么? - jfs
5
如果你想在脚本退出后使httpd和mysqld继续运行,你可以使用[DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP](https://dev59.com/AWYr5IYBdhLWcg3w--4I#13256908)标志。顺便说一下,你不需要 shell=True - jfs
httpd和mysqld的运行状态应该是隐蔽的,我已经使其非常用户友好,不需要任何多余的窗口。 - user1416451
@J.F.Sebastian 我该如何实现这个?我还处于早期阶段,但非常感谢! - user1416451
请自行进行一点研究,请查看这里,还有这个问题 - jfs
可能是在Python中调用外部命令的重复问题。 - Nabin
1个回答

5
os.systemsubprocess.Popen之间的区别在于,Popen实际上打开了一个管道, 而os.system启动了一个子shell,就像subprocess.call一样。Windows只支持*nix操作系统的部分管道/ shell功能,但基本上差异应该是相同的。子Shell不允许您像管道那样与另一个进程的标准输入和输出进行通信。

您可能想要使用类似于subprocess的方法,但然后在应用程序终止之前调用管道对象的kill()方法(来自文档)。这将允许您决定何时终止进程。您可能需要通过调用pipe.communicate()并关闭管道的文件句柄来满足进程想要执行的任何I/O。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接