管道输入到Python程序,然后从用户获取输入

Kev*_*rke 14 python bash stdin

假设我想将输入传递给Python程序,然后在命令行上从用户那里获得输入.

echo http://example.com/image.jpg | python solve_captcha.py
Run Code Online (Sandbox Code Playgroud)

以及的内容solve_captcha.py是:

import sys 
image_url = sys.stdin.readline()

# Download and open the captcha...

captcha = raw_input("Solve this captcha:")
# do some processing...
Run Code Online (Sandbox Code Playgroud)

以上将触发EOFError: EOF when reading a line错误.

我也尝试添加sys.stdin.close()一行,这提示了一个ValueError: I/O operation on closed file.

您可以管道信息stdin,然后从用户那里获得输入吗?

注意:这是一个简化的简化示例 - 请不要回答说"你为什么要在第一种情况下这样做",这真的令人沮丧.我只是想知道你是否可以管道信息stdin,然后提示用户输入.

agf*_*agf 14

这个问题没有一般解决方案.最好的资源似乎是这个邮件列表线程.

基本上,流入程序的流程将程序连接stdin到该管道,而不是连接到终端.

邮件列表线程有一些相对简单的*nix 解决方案:

打开/ dev/tty来替换sys.stdin:

sys.stdin = open('/dev/tty')
a = raw_input('Prompt: ')
Run Code Online (Sandbox Code Playgroud)

运行脚本时将stdin重定向到另一个文件句柄,并从中读取:

sys.stdin = os.fdopen(3)
a = raw_input('Prompt: ')
$ (echo -n test | ./x.py) 3<&0
Run Code Online (Sandbox Code Playgroud)

以及使用curses建议.请注意,邮件列表线程很古老,因此您可能需要修改所选的解决方案.


Bar*_*den 5

bash有进程替换,它创建了一个FIFO,您可以将其视为文件,而不是

echo http://example.com/image.jpg | python solve_captcha.py
Run Code Online (Sandbox Code Playgroud)

您可以使用

python solve_capcha.py <(echo http://example.com/image.jpg)
Run Code Online (Sandbox Code Playgroud)

您将打开solve_capcha.py的第一个参数作为文件,我认为sys.stdin仍然可用于从键盘读取输入.