在我的工作中,有一段用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中“ <”和“>”运算符提供的文件名?
答案 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.in
和fileToWrite.out
。
编辑:实际上是@BenjaminW。他的评论很好。您可以跳过多余的Shell脚本文件,而只是将myscript.py
重命名为codeName
并为其提供正确的权限。您只需要在顶部添加以下行:
#!/usr/bin/env python
应该使用python可执行文件运行文件。您可能需要更改路径以引用python在计算机上所在的实际文件夹。