使用bash脚本从stdin读取文件并将读取的行传递给python脚本的最佳方法是什么

时间:2018-09-26 03:36:48

标签: python bash stdout stdin

在我的工作中,有一段用C语言编写的古老代码,其他一些代码使用以下命令调用该代码:

./codeName < fileToRead.in > fileToWrite.out

C代码读取fileToRead.in文件,执行一些任务,然后将其结果打印到fileToWrite.out。

问题:问题是我试图用Python重写C代码,但是为了保持兼容性,必须完全以相同的方式调用脚本 < / b>。

可能的解决方案:由于要调用python脚本,您需要包括“ .py”扩展名,所以我的第一个想法是编写一些bash代码,该代码通过stdin读取文件,并将值传递给python脚本,然后将其写入相应的文件。请记住,我对bash脚本的经验为零,但是这段代码似乎对我的任务很有前途:

cat<&0 |
while read a; do    
  # at this point, the current line is associated with $a
  # maybe I can send each line to the python script?
done>&1 

最后,有没有办法读取bash中“ <”和“>”运算符提供的文件名?

1 个答案:

答案 0 :(得分:1)

我可以在您的问题中看到两个子问题,因此我将尝试按逻辑顺序回答它们。

首先,您要在命令行上使用<>运算符读取和写入python文件。这应该很简单;外壳将处理管道,因此您只需担心输入/输出。我们称之为my_script.py

if __name__ == "__main__":
    import sys;
    x = sys.stdin.read()  # read stdin
    print(x)              # write to stdout. You could also use sys.stdout.write()

第二,您要调用python脚本,但是出于兼容性原因,您需要使用./script来执行此操作。在这种情况下,您可以编写一个非常简单的 shell脚本来仅调用python脚本,将其调用为所需的名称,并预先使用chmod设置权限,以便可以由需要的任何进程执行。我们仅将此文件称为codeName。它只需要一行:

python my_script.py

,然后,如果要执行以下操作:

$ ./codeName < fileToRead.in > fileToWrite.out

用于stdin和stdout的管道仍然可以用于脚本本身。它将执行脚本codeName,该脚本依次运行命令python my_script.py,该命令将运行python代码,该命令将从stdin读取并写入stdout,,它们已通过管道传递到分别为fileToRead.infileToWrite.out


编辑:实际上是@BenjaminW。他的评论很好。您可以跳过多余的Shell脚本文件,而只是将myscript.py重命名为codeName并为其提供正确的权限。您只需要在顶部添加以下行:

#!/usr/bin/env python

应该使用python可执行文件运行文件。您可能需要更改路径以引用python在计算机上所在的实际文件夹。