BashスクリプトでPythonを使用する

BashスクリプトでPythonを使用する

Bashスクリプト内でPythonを起動しようとすると、スクリプトの実行が停止し、「Python」を呼び出した後にコマンドは実行されません。この簡単な例では、「TESTPRINT」は印刷されません。台本はそこで止まったようでした。

#!/bin/bash

python

print("TESTPRINT")

Echo

Pythonを入力した後でもスクリプトを実行し続けるにはどうすればよいですか?私は数年前に初めてAndroid携帯にシェリングを必要とするスクリプトを書いた後、同じ問題に直面したと思います。どのように解決されたのか覚えていませんね。

答え1

スクリプトで一連のPythonコマンドを実行するには、bash実行するコマンドをPythonインタプリタに提供する必要があります。このコマンドは、次のようにスクリプトによって生成されたファイル(Pythonスクリプト)で実行できます。

#!/bin/bash -e

# Create script as "script.py"
cat >script.py <<'END_SCRIPT'
print("TESTPRINT")
END_SCRIPT

# Run script.py
python script.py

rm script.py

(これを行うと、という名前の新しいファイルが作成され、script.pyすでに存在する場合は上書きされ、Pythonにそのファイルを実行するように指示してから削除します。)

...またはここで説明されているように、特定の形式のリダイレクトを介して直接:

#!/bin/bash

python - <<'END_SCRIPT'
print("TESTPRINT")
END_SCRIPT

その目的は、を実行してpython -Pythonインタプリタに標準入力からスクリプトを読み取るように指示することです。その後、シェルはEND_SCRIPTPythonスクリプトのテキスト(シェルスクリプトで区切られています)をPythonプロセスの標準入力ストリームに送信します。

上記の2つのコードは、2番目のスクリプトのPythonプロセスの標準入力が読み取っているスクリプトにリンクされているのに対して、最初のスクリプトのPythonプロセスはスクリプトの外部の標準入力から自由にデータを読み取ることができる点で若干異なります。 。 Pythonコードが標準入力から読み取られる場合、これは重要です。

Pythonはオプションを使用してコマンドラインから直接コマンドセットをインポートすることもできます-c

#!/bin/bash

python -c 'print("TESTPRINT")'

あなたは何ですかできないスクリプトの途中で「Pythonに切り替える」だけですbash

スクリプトに含まれるコマンドはbash順番に実行され、コマンドの実行中にスクリプト自体はそのコマンドが終了するのを待ちます(バックグラウンドジョブではない場合)。

これは、元のスクリプトがインタラクティブモードでPythonを起動し、bashPythonプロセスが終了するまでスクリプトの実行を一時的に中断することを意味します。その後、スクリプトはprint("TESTPRINT")シェルコマンドで実行しようとします。

sshスクリプトに似た質問を使用してください。

ssh user@server
cd /tmp
ls

(これは数年前に試したと言ったのと似ています。)

これはいいえリモートシステムに接続し、そこから実行してcdコマンドを発行しますls。リモートシステムで対話型シェルを起動し、シェルがシャットダウンするとローカルでcd実行されます(スクリプトに再度制御を提供します)。ls

代わりに、リモート・システムでコマンドを実行するには、次のようにします。

ssh user@server "cd /tmp; ls"

(これは都合の良い例ですが、おそらく理解できます。)


次の例は、提案を実際に実装する方法を示しています。しかし、いくつかの警告ラベルと警告が付属しています。このようなコードは絶対に書かないでください。(なぜなら汚れてメンテナンスできず、あえて言うとかなり悪いからです。)

python -
print("TESTPRINT")

実行してください:

$ sh -s <script.sh
TESTPRINT

ここで何が起こるのかはスクリプトですsh -s。 (およびto)オプションは、-s標準入力ストリームを介して到着するシェルスクリプトを実行するようにシェルに指示します。shbash

その後、スクリプトが起動し、python -次のように通知します。Python標準入力ストリームを介して入ってくるすべてを実行します。ストリームの次のエントリsh -sはPythonコマンドです。これはPythonから継承されたためです(したがってスクリプトテキストファイルにリンクされています)print("TESTPRINT")

その後、Pythonインタプリタは時間が足りなくなるか、Pythonコマンドを実行するまでスクリプトファイルからコマンドを読み続けて実行しますexit()

答え2

Kusalanandaの答えに加えて、スクリプト全体をPythonとして実行するには、最初の行を次に変更して通常の#!/usr/bin/env python3シェルスクリプトのように実行できます。これにより、どのスクリプトを実行するためにどのインタプリタを使用する必要があるかを覚える必要はありません。

答え3

<<<(Here Strings)演算子を使用して行を保存することもできます。

$ python <<< 'print("MyTest")'
MyTest

答え4

BashスクリプトからPythonファイルを呼び出すときにPythonパスを設定することもできます。

export PYTHONPATH=/tmp/python_dep.zip && python test_my.py

関連情報