从 Bash 运行带 STDIN 的 Python

2 投票
2 回答
3957 浏览
提问于 2025-04-15 19:51

我有一个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

撰写回答