我有一个 python 脚本,需要用户输入如下内容:
我不想执行程序并输入“John”,而是想从命令行将输入传递给它,$ python script.py < "John"
但这样做行不通。有什么方法可以实现我想要的吗?
答案1
如果脚本使用其 stdin 读取数据,则您使用的这一行
python script.py < "John"
应该可以工作,但它会尝试发送文件以文件名命名John
的脚本的标准输入(如果没有这样的文件,它将失败;我猜你也遇到过这种情况)。在 Bash 中,有一种方法可以发送字符串,这里是字符串:
python script.py <<< "John"
系统会自动添加换行符。另一种方法是使用管道:
printf '%s\n' "John" | python script.py
并且这应该可以在纯文本中工作sh
。所以应该这样:
echo "John" | python script.py
笔记printf
总体来说比echo
,但有了这个固定的字符串两个命令都应该正常工作。
如果脚本直接使用控制终端 ( /dev/tty
) 而不是 stdin 来读取用户的响应,则上述两种方法均无效。如果是这样,expect
(例如另一个答案) 会很有用。你没有向我们展示脚本本身,所以无法确定;你应该知道。
答案2
实现此目的的一个非常简单的方法是使用sys.argv
模块sys
,它允许您访问命令行参数。sys.argv
是命令行参数的列表,其中sys.argv[0]
是脚本名称。
如果有命令行参数,您可以接受它,否则提示用户输入:
#!/usr/bin/python3
import sys
if len(sys.argv) > 1:
name = sys.argv[1]
else:
name = input("Enter name:")
print(name)
然后,如果需要,您可以使用命令行参数调用脚本:./script.py John
。
答案3
一个简单的方法是创建一个脚本来输入信息:
#!/usr/bin/expect
set cmd [lrange $argv 1 end]
set val [lindex $argv 0]
eval spawn $cmd
expect ":"
send "$val\r";
interact
将此文件保存到某处(例如~/sendInput.sh
)并运行sudo chmod +x ~/sendInput.sh
以使文件可执行
现在运行!/sendInput.sh "Jhon" python script.py
一旦发送字符“:”,这应该将输入“Jhon”发送到script.py。
(改编自https://srvfail.com/how-to-provide-ssh-password-inside-a-script-or-oneliner/)