我是新来的subprocess.call功能,我已经试过同一个呼叫的不同组合,但它无法正常工作。
我试图执行以下命令:
cmd = 'sort -k1,1 -k4,4n -k5,5n '+outpath+fnametempout+' > '+outpath+fnameout
print cmd
如果我尝试调用我得到一个错误:
cmd = cmd.split(" ")
print cmd
subprocess.call(cmd)
我得到的错误是:
sort: stat failed: >: No such file or directory
这样做,这样,你需要shell=True
让Shell重定向工作。
subprocess.call('sort -k1,1 -k4,4n -k5,5n '+outpath+fnametempout,shell=True)
更好的方法是:
with open(outpath+fnameout,'w') as fout: #context manager is OK since `call` blocks :)
subprocess.call(cmd,stdout=fout)
这避免了产卵壳全在一起,是从外壳注塑型攻击安全。 在这里, cmd
是一个列表,在你原来的,如
cmd = 'sort -k1,1 -k4,4n -k5,5n '+outpath+fnametempout
cmd = cmd.split()
还应当指出,Python有非常好的分拣设施,所以我怀疑它实际上是要通过工作关闭以sort
通过一个子进程。
最后,而不是使用str.split
分裂的论点,从一个字符串,它可能会更好使用shlex.split
因为这将妥善处理引号的字符串。
>>> import shlex
>>> cmd = "foo -b -c 'arg in quotes'"
>>> print cmd.split()
['foo', '-b', '-c', "'arg", 'in', "quotes'"]
>>> print shlex.split(cmd)
['foo', '-b', '-c', 'arg in quotes']
它不是compecated执行上述在python命令:
import subprocess
import sys
proc = subprocess.Popen(['sort','-k1','1', '-k4','4n', '-k5','5n', '+outpath+fnametempout+', '>', '+outpath+fnameout'],stdin=subprocess.PIPE)
proc.communicate()
例:
subprocess.call(['ps','aux'])
lines=subprocess.check_output(['ls','-al'])
line_list = lines.split('\n')
or
handle = subprocess.Popen('ls',stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,close_fds=True)
handle.stdout.read()