2

我是 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
4

3 回答 3

12

这样做,您需要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)

这避免了一起生成 shell 并且可以安全地免受 shell 注入类型的攻击。在这里,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']
于 2013-01-17T19:41:29.437 回答
2

不要在 python 中执行上述命令:

import subprocess
import sys
proc = subprocess.Popen(['sort','-k1','1', '-k4','4n', '-k5','5n',    '+outpath+fnametempout+', '>', '+outpath+fnameout'],stdin=subprocess.PIPE)
proc.communicate()
于 2015-10-03T15:06:23.187 回答
0

例子:

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()
于 2015-02-25T04:15:12.240 回答