引数を使用してbashからPythonスクリプトを呼び出す


91

以下を使用して、bashスクリプトからpythonスクリプトを実行できることを知っています。

python python_script.py

しかし、bashスクリプトからPythonスクリプトに変数/引数を渡したい場合はどうでしょうか。どうやってやるの?

基本的に、bashはファイル名を処理し、次にpythonがそれをアップロードしますが、呼び出すときにファイル名をbashからpythonに送信する必要があります。


実行時にpython python_script.pyDebianではデフォルトのシェルですでにbashのを使用している...ので、ちょうどあなたのbashスクリプトで実行しますpython python_script.py arg1 arg2 ...
Oz123

@Jimmy Unprepared Question非常に簡単なリンク:tutorialspoint.com/python/python_command_line_arguments.htm
Grijesh Chauhan 2013

回答:


131

bashスクリプトでPythonスクリプトを実行するには、ターミナル内で実行するのと同じコマンドを呼び出す必要があります。例えば

> python python_script.py var1 var2

Python内でこれらの変数にアクセスするには、次のものが必要です。

import sys
print sys.argv[0] # prints python_script.py
print sys.argv[1] # prints var1
print sys.argv[2] # prints var2

ありがとう。ただし、この方法では、Pythonファイルが1つのユースケースにのみ制限されます。bashスクリプト内で動的パラメーターを使用してPythonファイルのメソッドを呼び出す方法はありますか?このようにして、同じpythonファイルを使用できるようになります。bashスクリプト内で$ varを使用してpythonファイルメソッドを呼び出してこれを実行しようとしました。しかし、それはどういうわけか失敗しました。
burcak

@burcak動的パラメーターに基づいてPythonファイルを並行して実行する場合は、最初に完全なパス<< pythonスクリプトの場所のパス>> / << pythonスクリプト名>> param1 param2 | << pythonスクリプトの場所のパス>> /を作成します。 << pythonスクリプト名>> bashスクリプトのparam3param4、次に出力を引数として以下のpythonスクリプトに渡し、import sys import subprocess arg_str = "" .join(sys.argv [1:])cmds = arg_str。 cmdsのcmdのsplit( '|'):print( 'call-' + cmd)subprocess.Popen(cmd、shell = True)print( 'call cmds finish')
Thiru

21

使用する

python python_script.py filename

そしてあなたのPythonスクリプトで

import sys
print sys.argv[1]

21

のほかにsys.argv、スクリプトのオプションと引数を定義するのに役立つargparseモジュールも見てください。

argparseモジュールを使用すると、ユーザーフレンドリーなコマンドラインインターフェイスを簡単に作成できます。


私には、argparseはsys.argvよりもはるかに優れたオプションであることに同意します
Mo Ali

8

埋め込みオプション:

Pythonコードをbash関数でラップします。

#!/bin/bash

function current_datetime {
python - <<END
import datetime
print datetime.datetime.now()
END
}

# Call it
current_datetime

# Call it and capture the output
DT=$(current_datetime)
echo Current date and time: $DT

環境変数を使用して、埋め込まれたPythonスクリプトにデータを渡します。

#!/bin/bash

function line {
PYTHON_ARG="$1" python - <<END
import os
line_len = int(os.environ['PYTHON_ARG'])
print '-' * line_len
END
}

# Do it one way
line 80

# Do it another way
echo $(line 80)

http://bhfsteve.blogspot.se/2014/07/embedding-python-in-bash-scripts.html


1

スクリプトでの使用:

echo $(python python_script.py arg1 arg2) > /dev/null

または

python python_script.py "string arg"  > /dev/null

スクリプトは出力なしで実行されます。


「stringarg」をbashからの変数に置き換えることは可能ですか?
codeGuru 2016年

1

小さなPythonルーチンを呼び出してメッセージウィンドウを表示するbashスクリプトがあります。pythonスクリプトを停止するためにkillallを使用する必要があるため、上記のメソッドを使用できません。これは、他のpythonプログラムを削除する可能性のあるkillallpythonを実行することを意味するためです。

pythonprog.py "$argument" #&は制御をbashスクリプトに直接返すため、バックティックの外側にある必要があります。このメッセージのプレビューでは、何らかの理由でコマンドの両側に「 `」が表示されていません。

pythonスクリプトがpythonpythonprog.pyではなく名前でCLIから実行される限り、これはスクリプト内で機能します。複数の引数が必要な場合は、引用符内で各引数の間にスペースを使用してください。


-1

getoptモジュールを見てください。それは私にとって非常にうまくいきます!


getopt docs start:注: getoptモジュールは、C getopt()関数のユーザーに馴染みのあるAPIが設計されたコマンドラインオプションのパーサーです。C getopt()関数に慣れていないユーザー、または記述するコードを減らしてヘルプとエラーメッセージを改善したいユーザーは、代わりにargparseモジュールの使用を検討する必要があります。
ケイト・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.