从stdin到bash脚本中的python代码的管道

时间:2014-03-25 08:42:50

标签: python bash

我有一个包含python代码的bash脚本f。该python代码从标准输入读取。我希望能够按如下方式调用我的bash脚本:

f input.txt > output.txt

在上面的例子中,python代码将从input.txt读取并将写入output.txt。

我不知道该怎么做。我知道如果我想写一个文件,那么我的bash脚本就像这样

#!/bin/bash
python << EOPYTHON > output.txt
#python code goes here
EOPYTHON

我尝试将上面代码中的第二行更改为以下内容,但没有运气

python << EOPYTHON $*

我不知道怎么回事。有什么建议吗?

修改 我将举一个更具体的例子。请考虑以下bash脚本f

#!/bin/bash
python << EOPYTHON 
import sys
import fileinput
for i in fileinput.input():
    sys.stdout.write(i + '\n')
EOPYTHON

我想用以下命令运行我的代码

f input.txt > output.txt

如何更改我的bash脚本以便它使用&#34; input.txt&#34;作为输入流?

4 个答案:

答案 0 :(得分:5)

更新了答案

如果你绝对必须以你提出的方式运行,你可以这样做:

#!/bin/bash
python -c 'import os
for i in range(3):
   for j in range(3):
     print(i + j)
'  < "$1"

原始答案

将您的python代码保存在名为script.py的文件中,并将脚本f更改为:

#!/bin/bash
python script.py < "$1"

答案 1 :(得分:3)

由于没有人提到这一点,这是作者要求的。神奇的是将“ - ”作为参数传递给cpython(从stdin读取源代码的指令):

输出到文件:

python - << EOF > out.txt
print("hello")
EOF

执行样本:

# python - << EOF
> print("hello")
> EOF
hello

由于数据不能再通过stdin传递,这是另一个技巧:

data=`cat input.txt`

python - <<EOF

data="""${data}"""
print(data)

EOF

答案 2 :(得分:0)

您可以根据进程的文件描述符列表进行检查,即在proc文件系统上,您可以使用

打印stdout的重定向位置
readlink /proc/$$/fd/1

例如

> cat test.sh
#!/bin/bash
readlink /proc/$$/fd/1
> ./test.sh
/dev/pts/3
> ./test.sh > out.txt
> cat out.txt 
/home/out.txt

答案 3 :(得分:0)

<{3}}中的

-c选项应该有效。

这是您在Python脚本中嵌入bash的替代方法:

#!/usr/bin/env python
import sys
import fileinput
from subprocess import call

# shell command before the python code
rc = call(r"""
some bash-specific commands here
...
""", shell=True, executable='/bin/bash')

for line in fileinput.input():
    sys.stdout.write(line) #NOTE: `line` already has a newline

# shell command after the python code
rc = call(r"""
some /bin/sh commands here
...
""", shell=True)