如何从终端将输入传递给脚本?

如何从终端将输入传递给脚本?

我有一个 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/

相关内容