所以,我知道每个人都会告诉我使用子进程模块,但我不能将它用于我正在处理的项目,因为Piping根本不想在我的系统上使用wxpython和py2exe。
所以,我一直在使用os.system调用。我需要知道如何等待该过程结束。 目前,我有
os.system(cmd)
并且我的命令实际上可能需要很长时间才能执行,所以它通常会提前超时。 如何让我的程序等待os.system?我已经尝试过waitpid,我猜这对os.system不起作用。
我正在为windows开发,所以不幸的是我不能使用fork和execvp。我有很多双手:(
答案 0 :(得分:2)
您可以更正您的代码:
os.system('cmd')
关于子流程的额外解释:
import subprocess
ls_output = subprocess.check_output(['ls'])
运行外部命令
要运行外部命令而不与其进行交互,例如使用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
控制stderr和stdout:
#! /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())
答案 1 :(得分:0)
在another post中回答了类似的问题。
关键点是:
使用subprocess.check_output
代替os.system
,以获得subprocess.check_output支持timeout
:
subprocess.check_output(args,*,stdin = None,stderr = None,shell = False,cwd = None,encoding = None,errors = None,Universal_newlines = None, timeout = None, text = None,** other_popen_kwargs)