【问题标题】:How to redirect input to python script如何将输入重定向到python脚本
【发布时间】:2021-12-12 23:38:32
【问题描述】:

这个命令python test.py <(cat file1.txt)怎么没有相应的工作。我可以发誓我以前有这个工作。基本上,我想将 cat 命令的输出作为 python 脚本的输入。

这个命令

cat file1.txt | python test.py

工作正常,输出:

reading:  file11
reading:  file12

基于以下脚本/文件。

我想让它工作的原因是因为我真的想输入 2 个输入文件,比如

python test.py <(cat file1.txt) <(cat file2.txt)

并且想要一些 python 输出,例如:

reading:  file11 file21
reading:  file12 file22

我知道这是一个非常简单的示例,我可以在 python 脚本中读入或open() 两个文件并相应地进行迭代。这是我当前脚本的简化版本,cat 命令在技术上是另一个执行其他操作的可执行文件,因此它不像读取/打开要读取的文件那么容易。

示例脚本/文件:

test.py:

import sys

for line in sys.stdin:
   print("reading: ", line.strip())

sys.stdin.close()

file1.txt:

file11
file12

file2.txt:

file21
file22

【问题讨论】:

  • 你可以做cat file1.txt file2.txt | python test.py
  • 仅供参考的猫函数可以带更多参数
  • 对,cat 可以获取更多文件,但就像我说的那样。 cat 实际上只是一个示例,它确实是另一个脚本/可执行文件,所以我希望 &lt;() &lt;() 格式可以工作
  • 一个进程只有一个标准输入,所以&lt;() &lt;()格式不能工作。
  • 也许你应该展示一个实际的例子来说明为什么cat file1.txt file2.txt | python test.py 是不够的。

标签: python stdin


【解决方案1】:

将test.py 更改为:

import sys

input1 = open(sys.argv[1], "r")
input2 = open(sys.argv[2], "r")

for line1, line2 in zip(input1, input2):
   print("reading: ", line1.strip(), line2.strip())

input1.close()
input2.close()

将使python test.py &lt;(cat file1.txt) &lt;(cat file2.txt) 工作

【讨论】:

    【解决方案2】:

    实际上这取决于您使用的外壳。 我猜你使用 bash 不幸的是它不能让它工作,因为只有来自特定描述符的最后一个重定向被采用。您可以创建临时文件,将脚本的输出重定向到它,然后使用 tmp 文件提供主脚本。

    或者如果你不介意你可以切换到 zsh,它默认启用such feature。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2022-01-26
      • 2017-08-31
      相关资源
      最近更新 更多