次のようなユーザー入力を期待するpythonスクリプトがあります:
プログラムを実行して「John」と入力する代わりに、$ python script.py < "John"
のようにコマンドラインからプログラムに入力を渡したいのですが、機能しません。私が望むことを達成する方法はありますか?
スクリプトがその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
( この他の答え のように)が役に立ちます。スクリプト自体を見せてくれなかったので、確実に言うことは不可能です。あなたが知っておくべき。
これを実現するための本当に簡単な方法は、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
。
簡単な方法は、情報を入力するスクリプトを作成することです。
#!/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/ から引用)