2012-11-11 33 views
7

Tôi đã tạo một chương trình tạo kiến ​​trúc web trên máy chủ cục bộ, sau đó tải trình duyệt cần thiết để hiển thị các trang html và php trên localhost.Sự khác biệt giữa os.system và subprocess gọi

Cuộc gọi os.system giết chết quá trình python nhưng không giết chết các quá trình khác - ví dụ, httpd.exemysqld.exe

Cuộc gọi subprocess diệt các chương trình httpd.exemysqld.exe nhưng vẫn tiếp tục chạy mã python, và không có mã thực hiện sau cuộc gọi subprocess.

Tôi sẽ làm cách nào để giết hoặc ẩn tất cả các quy trình cần thiết sau khi mã python được thực thi?

Đây là mã của tôi.

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

trạng thái chạy mong muốn của httpd, mysqld sau 'sys.exit()' là gì? – jfs

+5

nếu bạn muốn httpd, mysqld tiếp tục chạy sau khi tập lệnh của bạn đã thoát; bạn có thể sử dụng [DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP] (http://stackoverflow.com/a/13256908/4279) gắn cờ. btw, bạn không cần 'shell = True'. – jfs

+0

trạng thái chạy của httpd và mysqld nên chạy ẩn, ive làm cho người dùng này rất thân thiện, không cần bất kỳ cửa sổ dư thừa nào. –

Trả lời

3

Sự khác biệt giữa os.systemsubprocess.Popen là Popen thực sự mở ra một pipeos.system bắt đầu một subshell, giống như subprocess.call. Windows chỉ hỗ trợ một nửa một số tính năng đường ống/vỏ của hệ điều hành * nix nào, nhưng sự khác biệt về cơ bản vẫn giống nhau. Một subshell không cho phép bạn giao tiếp với đầu vào tiêu chuẩn và đầu ra của một quá trình khác như một đường ống.

Điều bạn có thể muốn là sử dụng tiến trình con như bạn, nhưng sau đó gọi phương thức kill() (from the docs) trên đối tượng đường ống trước khi ứng dụng của bạn chấm dứt. Điều đó sẽ cho phép bạn quyết định khi nào bạn muốn quá trình chấm dứt. Bạn có thể cần phải đáp ứng bất cứ điều gì tôi/quá trình muốn làm bằng cách gọi pipe.communicate() và đóng xử lý tệp của đường ống.

Các vấn đề liên quan