如何在 Python 中获取 Pipe 和 Here String?

How to get Pipe and Here String in Python?

提问人:gott18 提问时间:10/12/2023 最后编辑:wjandreagott18 更新时间:10/12/2023 访问量:80

问:

通过以下方式调用 Python 脚本时

echo foobar | python myscript.py <<< test123

如何在 Python 脚本中同时获取两个字符串(“foobar”和“test123”)?

尝试时

import sys
import select

r, w, e = select.select([sys.stdin], [], [], 0)
if r:
    line = sys.stdin.readline().strip()
    print("Line: " + line)

如果调用为 ,则脚本仅返回“test123”。echo foobar | python myscript.py <<< test123

如果通过“foobar”调用,则返回。echo foobar | python myscript.py

如果调用方式,也返回“test123”。python myscript.py <<< test123

但是我怎样才能得到两个字符串呢?

python bash 管道 stdin herestring

评论

3赞 Jason 10/12/2023
我不认为你能得到,但也许你想传递给你的剧本?您可以使用 .然后会显示foobarfoobarpython myscript.py -foobar 2print(sys.argv)['myscript.py', '-foobar', '2']
2赞 erik258 10/12/2023
这实际上不是一个 python 问题。这是一个贝壳问题。为您的 shell 添加一个标签(bash?zsh?other?)。我认为无论 shell 如何,您都必须自己连接值 - shell 无法真正设置 2 个不同的 stdin 源 - 但让我们看看其他人怎么说。
0赞 erik258 10/12/2023
恕我直言,您在此处选择的使用也有点愚蠢和荒谬。没有它,代码可以正常工作。
0赞 Philippe 10/12/2023
你试过这个吗:echo foobar | { cat ; echo "test123"; } | python myscript.py

答:

1赞 wjandrea 10/12/2023 #1

这是不可能的,因为 pipe 和 herestring 都使用 stdin,所以一个将始终优先(herestring)。

作为解决方法,您可以使用 过程替换 。然后,脚本需要将文件名作为参数,例如:<()

import sys

line = sys.stdin.readline().strip()
print("Line from stdin:", line)

fname = sys.argv[1]
with open(fname) as f:
    line = f.readline().strip()
    print(f"Line from file ({fname}):", line)
$ ./tmp.py <(echo foobar) <<< "test123"
Line from stdin: test123
Line from file (/dev/fd/63): foobar

如果要简化,可以使用 fileinput

import fileinput

for line in fileinput.input():
    line = line.strip()
    print(f"Line from fileinput ({fileinput.filename()}):", line)
$ ./tmp.py - <(echo foobar) <<< "test123"
Line from fileinput (<stdin>): test123
Line from fileinput (/dev/fd/63): foobar

(stdin 指定为 。-