【问题标题】:The Difference between os.system and subprocess callsos.system 和子进程调用的区别
【发布时间】:2012-10-31 08:10:41
【问题描述】:

我创建了一个程序,它在本地服务器中创建 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()

【问题讨论】:

  • sys.exit()之后httpd、mysqld希望的运行状态是什么?
  • 如果你想让httpd,mysqld在你的脚本退出后继续运行;你可以使用DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP 标志。顺便说一句,你不需要shell=True。
  • httpd 和 mysqld 的运行状态应该是隐身运行的,我做了这个非常人性化,不需要任何多余的窗口。
  • @J.F.Sebastian 我将如何实现这个?我还处于早期阶段,但非常感谢!

标签: python subprocess


【解决方案1】:

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

您可能想要的是像您一样使用子进程,然后在应用程序终止之前调用管道对象上的 kill() 方法 (from the docs)。这将让您决定何时终止该进程。您可能需要通过调用 pipe.communicate() 并关闭管道的文件句柄来满足进程想要执行的任何 i/o。

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 2016-10-04
    • 2016-09-22
    • 1970-01-01
    • 2020-05-13
    • 2012-11-16
    • 2021-05-22
    • 2013-08-25
    • 2011-09-12
    相关资源
    最近更新 更多