首页 > 解决方案 > 使用 bash 脚本从标准输入读取文件并将读取的行传递给 python 脚本的最佳方法是什么

问题描述

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

./codeName < fileToRead.in > fileToWrite.out

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

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

可能的解决方案:由于要调用 python 脚本,您需要包含“.py”扩展名,我的第一个想法是编写一些 bash 代码,通过标准输入读取文件,将值传递给 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 中“<”和“>”运算符提供的文件名?

标签: pythonbashstdoutstdin

解决方案


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

首先,您想在 python 中使用命令行上的<and运算符读入和写出文件。>这应该很简单;外壳将处理管道,因此您只需担心输入/输出。让我们称之为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

标准输入和标准输出的管道仍然适用于脚本本身。它将执行脚本codeName,该脚本又将运行python my_script.py将运行 python 代码的命令,该代码将从标准输入读取并写入标准输出,这些标准输出已分别从 和 到fileToRead.infileToWrite.out管道传输。


编辑:实际上,@BenjaminW。在他的评论中提出了一个很好的观点。您可以跳过额外的 shell 脚本文件,只需重命名myscript.pycodeName赋予它正确的权限。您只需要在顶部添加以下行:

#!/usr/bin/env python

它应该使用 python 可执行文件运行文件。您可能必须更改路径以引用 python 位于您计算机上的实际文件夹。


推荐阅读