python - 使用 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 中“<”和“>”运算符提供的文件名?
解决方案
我可以在您的问题中看到两个子问题,因此我将尝试按逻辑顺序回答它们。
首先,您想在 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.in
和fileToWrite.out
管道传输。
编辑:实际上,@BenjaminW。在他的评论中提出了一个很好的观点。您可以跳过额外的 shell 脚本文件,只需重命名myscript.py
并codeName
赋予它正确的权限。您只需要在顶部添加以下行:
#!/usr/bin/env python
它应该使用 python 可执行文件运行文件。您可能必须更改路径以引用 python 位于您计算机上的实际文件夹。
推荐阅读
- android - 错误:无法解析':react-native-maps@debug/compileClasspath'的依赖关系:无法解析androidx.appcompat:appcompat:1.0.0
- c - 如何在 pthread_attr_t 上获得分离状态?
- linux - 无法使用 iconv 将 � 转换为可读字符串
- reactjs - 如何创建发出另一个史诗的史诗,同时只听一次它的结束,直到它失败?
- r - 如何在 R 中的两个数据帧之间循环进行行检查?
- python - Python OOP - 无法使用 self 更改类变量的值
- mysql-workbench - 如何将 MySql 数据库连接到 Microsoft Flow
- vector - 有条件地替换 rstudio 中的列表元素
- java - Kodein vs Dagger - 无法让 Dagger 与多个模块一起工作
- javascript - HTML/Angular 中的 JavaScript 不切换选项卡