web-dev-qa-db-ja.com

ターミナルからスクリプトに入力を渡す方法は?

次のようなユーザー入力を期待するpythonスクリプトがあります:

script image

プログラムを実行して「John」と入力する代わりに、$ python script.py < "John"のようにコマンドラインからプログラムに入力を渡したいのですが、機能しません。私が望むことを達成する方法はありますか?

1
n00b

スクリプトがそのstdinを使用してデータを読み取る場合、使用したこの行

python script.py < "John"

Johnという名前のfileのコンテンツをスクリプトのstdinに送信しようとすることを除いて、動作するはずです(次の場合は失敗します)そのようなファイルはありません;これはあなたに起こったと思います)。 Bashには文字列を送信する方法がありますが、 ここでは文字列

python script.py <<< "John"

改行は自動的に追加されます。別の方法は パイプライン を使用することです:

printf '%s\n' "John" | python script.py

これはプレーンなshでも機能するはずです。だからこれが必要です:

echo "John" | python script.py

printfは一般にecho よりも優れていますが、このfixed文字列の両方を使用しますコマンドは正しく機能するはずです。


スクリプトがその制御端末を直接使用する場合、上記のいずれも機能しません(/dev/tty)ユーザーの応答を読み取るためのstdinの代わりに。もしそうなら、expectこの他の答え のように)が役に立ちます。スクリプト自体を見せてくれなかったので、確実に言うことは不可能です。あなたが知っておくべき。

2

これを実現するための本当に簡単な方法は、sysモジュールからsys.argvを使用することです。これにより、コマンドライン引数にアクセスできます。 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

1
csknk

簡単な方法は、情報を入力するスクリプトを作成することです。

#!/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/ から引用)

0