bash用python脚本包装一个管道命令

时间:2014-11-24 14:59:45

标签: python bash shell strace

有没有办法创建一个包装整个bash命令的python脚本,包括管道。

例如,如果我有以下简单脚本

import sys
print sys.argv

并像这样调用它(来自bash或ipython),我得到了预期的结果:

[pkerp@pendari trell]$ python test.py ls
['test.py', 'ls']

但是,如果我添加了一个管道,脚本的输出会被重定向到管道接收器:

[pkerp@pendari trell]$ python test.py ls > out.txt

> out.txt部分不在sys.argv中。我知道shell会自动处理这个输出,但我很好奇是否有办法强制shell忽略它并将其传递给被调用的进程。

这样做的目的是创建类似shell的包装器。我想定期运行命令,但要跟踪每个命令(包括管道)的strace输出。理想情况下,我希望保留所有bash功能,例如制表符完成和向上和向下箭头以及历史搜索,然后只需通过调用子进程来处理它的python脚本传递完成的命令。

这是可能的,还是我必须编写自己的shell来执行此操作?

修改

我似乎问this question完全相同的事情。

3 个答案:

答案 0 :(得分:0)

好吧,我不太清楚你要做什么。一般方法是使用命令行选项为脚本提供所需的输出目标:python test.py ls --output=out.txt。顺便说一下,strace写给stderr。如果你想保存所有内容,你可以使用strace python test.py > out 2> err捕获所有内容......

编辑:如果您的脚本也写入stderr,您可以使用strace -o strace_out python test.py > script_out 2> script_err

Edit2:好的,我更清楚你想要什么。我的建议如下:写一个 bash 帮助器:

function process_and_evaluate()
{

  strace -o /tmp/output/strace_output "$@"

  /path/to/script.py /tmp/output/strace_output
}

将其放在~/helper.sh这样的文件中。然后打开一个bash,使用. ~/helper.sh来源它。 现在您可以像这样运行它:process_and_evaluate ls -lA

EDIT3: 要捕获输出/错误,您可以像这样扩展宏:

function process_and_evaluate()
{
  out=$1
  err=$2

  shift 2

  strace -o /tmp/output/strace_output "$@" > "$out" 2> "$err"

  /path/to/script.py /tmp/output/strace_output
}

您必须使用(不太明显)process_and_evaluate out.txt err.txt ls -lA。 这是我能想到的最好的......

答案 1 :(得分:0)

您唯一能做的就是将整个shell命令作为字符串传递,然后让Python将其传递回shell进行执行。

$ python test.py "ls > out.txt"

test.py内,类似

subprocess.call("strace " + sys.argv[1], shell=True, executable="/bin/bash")

确保将整个字符串传递给shell(特别是bash)。

答案 2 :(得分:0)

至少在你的简单例子中,你可以将python脚本作为echo的参数运行,例如。

$ echo $(python test.py ls) > test.txt
$ more test.txt
['test.py','ls']

在括号中用美元符号括起命令首先执行内容,然后将输出作为参数传递给echo。