2013-07-25 80 views
3

所以,我知道每個人都會告訴我使用子過程模塊,但我不能用於我正在工作的項目,因爲管道系統根本不想使用wxpython和我的系統上的py2exe。python超時使用os.system

所以,我一直在使用os.system調用。我需要知道如何等待這個過程結束。 目前,我有

os.system(cmd) 

和我的命令實際上可能需要很長的時間來執行,因此通常時間早。 如何讓我的程序等待os.system?我試過waitpid,我想這對os.system不起作用。

我正在開發Windows,所以不能使用fork和execvp。我有很多的雙手綁:(

+2

os.system不應該超時,並且在進程完成之前不應該返回。也許你的命令超時? –

+0

相關:[有超時的子過程](http://stackoverflow.com/q/1191374/4279) – jfs

回答

2

你可以糾正你的代碼:

import subprocess 
ls_output = subprocess.check_output(['ls']) 

運行外部命令

要:

os.system('cmd') 

額外關於子解釋運行一個外部命令而不與其交互,比如os.system(),使用call()函數。

import subprocess 

# Simple command 
subprocess.call('ls -l', shell=True) 

$ python replace_os_system.py 
total 16 
-rw-r--r-- 1 root8085 root8085  0 Jul 1 13:27 __init__.py 
-rw-r--r-- 1 root8085 root8085 1316 Jul 1 13:27 replace_os_system.py 
-rw-r--r-- 1 root8085 root8085 1167 Jul 1 13:27 replace_os_system.py~ 

# run cmd 

import subprocess 
l = subprocess.call(['cmd']) 

額外例如: 進行系統調用三種不同的方法:

#! /usr/bin/env python 
import subprocess 
# Use a sequence of args 
return_code = subprocess.call(["echo", "hello sequence"]) 

# Set shell=true so we can use a simple string for the command 
return_code = subprocess.call("echo hello string", shell=True) 

# subprocess.call() is equivalent to using subprocess.Popen() and wait() 
proc = subprocess.Popen("echo hello popen", shell=True) 
return_code = proc.wait() # wait for process to finish so we can get the return code 

控制標準錯誤和ST dout:

#! /usr/bin/env python 
import subprocess 
# Put stderr and stdout into pipes 
proc = subprocess.Popen("echo hello stdout; echo hello stderr >&2", \ 
     shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 
return_code = proc.wait() 
# Read from pipes 
for line in proc.stdout: 
    print("stdout: " + line.rstrip()) 
for line in proc.stderr: 
    print("stderr: " + line.rstrip())