我有一个包含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;作为输入流?
答案 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)
-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)