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
到该管道,而不是连接到终端.
打开/ 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的建议.请注意,邮件列表线程很古老,因此您可能需要修改所选的解决方案.
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仍然可用于从键盘读取输入.
归档时间: |
|
查看次数: |
9188 次 |
最近记录: |