从 Bash 运行带 STDIN 的 Python
我有一个bash代码文件(Mybash1.sh
),我需要把它的结果传递给另一个bash代码文件(Mybash2.sh
),这个文件里有Python代码。
这是我的代码。Mybash1.sh
的内容是:
#! /bin/bash
# Mybash1.sh
cut -f1,3 input_file.txt | sort | ./Mybash2.sh
而 Mybash2.sh
的内容是:
#! /bin/bash
#Mybash2.sh
python mycode.py foo.txt <("$@") > output.txt
# do something for output.txt
我遇到的问题是,在 Mybash2.sh
中的 "output.txt" 文件里没有任何结果。有没有正确的方法来执行 Mybash2.sh
中的Python代码呢?
需要注意的是,如果我在一个临时文件上运行 mycode.py
,它是可以工作的,这个临时文件是由 Mybash1.sh
生成的。但我想避免使用这个方法,因为我会在 Mybash1.sh
中多次调用 Mybash2.sh
。
下面是 mycode.py
的一部分内容:
if __name__ == "__main__":
import sys, os, fileinput
progName = os.path.basename(sys.argv[0])
if len(sys.argv) != 3:
sys.exit('Usage: ' + progName + ' file1 file2')
file1 = fileinput.input(sys.argv[1])
file2 = fileinput.input(sys.argv[2])
# do something for file1 and file2
file1.close()
file2.close()
2 个回答
0
在你的 myscript1.sh 文件里,你把一个数据流传给了 myscript2.sh,所以这就相当于给 myscript2.sh 提供了一些输入。你应该在 myscript2.sh 里读取这个输入,而不是通过输入参数来接收。比如说,my script2.sh 的内容可以是这样的:
#!/bin/bash
while read myinput
do
echo "myinput is $myinput"
# assuming you are passing each input line from the cut command into Python
python mycode.py foo.txt $myinput > output.txt
done
最后,为什么需要这么多依赖呢?难道你不能只用 Python 或者 shell 就能完成所有事情吗?
2
在Python中,你想要把 file2 = sys.stdin
这样写。
然后:
#! /bin/bash
#Mybash2.sh
python mycode.py foo.txt > output.txt
补充说明:我刚刚看了fileinput的文档,发现如果你在fileinput.input()里传入'-',它会读取标准输入(stdin),所以你不需要对你的Python代码做任何改动,这样就可以正常工作:
#! /bin/bash
#Mybash2.sh
python mycode.py foo.txt - > output.txt