如何通过脚本传入初始值后仍与交互式Python程序终端交互
问题:通过脚本传入初始值并保持程序交互能力
我需要给一个交互式Python程序传入初始输入值,之后仍能继续与程序进行交互。
我的交互式Python程序代码如下:
import sys print("what's your name?") sys.stdout.write("> ") sys.stdout.flush() for line in sys.stdin: line = line.rstrip() if line == "q": break print("hello", line) sys.stdout.write("> ") sys.stdout.flush()
正常运行该程序时,会循环等待输入:
$ python3 name.py what's your name? > tom hello tom > john hello john
我尝试用以下bash脚本传入初始值:
#! /bin/bash echo "mr. big" | python3 name.py
但运行后程序会立即退出,输出如下:
$ ./script what's your name? > hello mr. big > $
解决方案
问题出在echo "mr. big"只输出一行就结束了,导致Python程序的sys.stdin读取到EOF后直接退出循环。要实现先传入初始值,再保持终端交互,需要让脚本先输出初始值,再持续读取终端的输入并传给Python程序。
修改后的bash脚本如下:
#! /bin/bash { echo "mr. big"; cat; } | python3 name.py
原理说明
echo "mr. big":先输出初始输入值,传给Python程序cat:持续从标准输入(终端)读取内容,直到用户按下Ctrl+D触发EOF,或者在Python程序中输入q退出- 用
{ ...; }将两个命令组合,把它们的输出一起通过管道传给Python程序
运行修改后的脚本,就能先自动输入mr. big,之后继续和程序交互:
$ ./script what's your name? > hello mr. big > alice hello alice > q $
内容的提问来源于stack exchange,提问作者d9ngle
相关产品推荐
相关产品推荐

