有没有办法创建一个包装整个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完全相同的事情。
答案 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。