2012-11-11 13 views
7

sonra localhost üzerinde html ve php sayfaları görüntülemek için gerekli tarayıcı yükler çağırır.os.system ve alt işlemi arasındaki fark bir yerel sunucuya bir web mimarisini oluşturan bir program oluşturduk

os.system çağrı piton sürecini öldürür ama diğer işlemleri öldürmek değil - örneğin, httpd.exe ve mysqld.exe

subprocess çağrı httpd.exe ve mysqld.exe programları öldürür ama piton kod çalıştırmasına devam eder ve hiçbir kod, subprocess aramasından sonra yürütülür.

i piton kodundan sonra gerekli tüm işlemleri öldürmek veya gizleme hakkında gitmek nasıl

yürütülür?

İşte kodum.

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() 'dan sonra httpd, mysqld'nin istenen çalışma durumu nedir? Httpd, mysqld komut dosyasının çıktıktan sonra çalışmaya devam etmesini istiyorsanız – jfs

+5

; [DETACHED_PROCESS | kullanabilirsiniz CREATE_NEW_PROCESS_GROUP] (http://stackoverflow.com/a/13256908/4279) bayrağı. btw, 'shell = True' gerekmez. – jfs

+0

httpd ve mysqld'in çalışma durumu gizlice çalıştırılmalıdır, bu çok kullanıcı dostu yapılmış, fazla pencerelere gerek yok. –

cevap

3

os.system ve subprocess.Popen arasındaki fark POPEN aslında pipe açar ve os.system çok subprocess.call gibi bir subshell başlar. Windows sadece * nix işletim sistemlerinin hangi boru/kabuk özelliklerinin yarısını destekliyorsa da, fark hala temelde aynı olmalıdır. Bir alt kabuk, bir boru gibi başka bir işlemin standart giriş ve çıkışı ile iletişim kurmanıza izin vermez.

Muhtemelen istediğiniz gibi, alt işlemi de kullanabilirsiniz, ancak uygulama sonlanmadan önce boru nesnesinde kill() yöntemini (from the docs) arayın. Bu işlemin sonlandırılmasını istediğinize karar vermenizi sağlayacaktır. İşlemin, pipe.communicate() numaralı telefonu arayarak ve borunun dosya tutamaçlarını kapatarak yapmak istediği her şeyi tatmin etmeniz gerekebilir.

İlgili konular