
この回答ターミナルのコマンドラインで複数行のPythonコードを実行する方法について説明します。私は入れ子になったインデントを使用してもシェルスクリプトで答えがうまく機能することがわかりました。
#!/bin/bash
some_text="Hello world"
echo $some_text
cat <<EOF | python -
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
印刷:
0
hello
hello
1
hello
hello
2
hello
hello
しかし、シェルスクリプトとPythonコードスニペット間で変数を共有するのに問題があります。
BashスクリプトからPython添字の出力を収集する方法は? (例:のような変数から
$output
)。bash変数(例
$some_text
:)をPythonスクリプトにどのように渡しますか?
答え1
Python変数の取得
EOF
(トークンが引用されていない場合)python
テキストが区切り文字から標準入力に渡される前に変数置換が発生するため、変数をスクリプトに直接投げることができます。
python - <<EOF
some_text = "$some_text"
EOF
もしsome_text
そうならtest
、Pythonはそれを見るでしょうsome_text = "test"
。ただし、これはコード注入の脆弱性と見なされる可能性があることに注意してください。たとえば、some_text
wasの場合、Pythonは次のことを確認します。"; import os; os.system("evil-command"); x = "
some_text = ""; import os; os.system("evil-command"); x = ""
そしてその邪悪なコマンドを実行してください。
変更せずにPythonコードをスクリプトに直接インポートするには、変数をエクスポートできます。
export some_text
os.environ
それを検索するために使用されました。
some_text = os.environ['some_text']
これはよりスマートで安全なアプローチです。
Pythonから出力を取得する
コマンド置換を使用してスクリプトの出力を収集できます。
output=$(
python - <<EOF
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)
(末尾の改行は削除されます。)
答え2
あなたのアプローチの問題は、組み込みのPythonスクリプトがもはや元の標準入力にアクセスできないことです(標準入力が...それ自体であるため)。
これが問題であれば、次のように書くことができます。
python -c '
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
'
または、Pythonスクリプトに一重引用符を含めることができる場合:
python -c "$(cat << 'EOF'
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)"
または:
python <(cat << 'EOF'
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)
答え3
ファイル名としてダッシュを使用します。
ruby - a b <<'END'
puts ARGV.join(",")
END
python - a b <<'END'
import sys
print ",".join(sys.argv[1:])
END
sys.argv[1:]
これがPythonでやるのが正しいことなのかわかりません。 -e/-c の場合 -- を使用して引数の終わりを指定できます。
set -- -a -b -c
ruby -e 'puts ARGV.join(",")' -- "$@"
python -c 'import sys; print ",".join(sys.argv[2:])' -- "$@"
出力キャプチャとSTDERRリダイレクト:
x=$(ruby <<'END' 2> /dev/null
puts "a"
abort "b"
END
)
答え4
1)Pythonでファイルに変数の割り当てを作成し、bashスクリプトからファイルをインポートできます。
2)あなたの言葉(EOF)が引用されていないので、ここの文書のすべての行はパラメータ拡張の対象です。これを使用してコンテンツをPythonスクリプトに渡すことができます。