5

インポートするスクリプトで定数を定義するのに役立つ引数を渡す nohup を使用して、bash で Python スクリプトを開始する必要があります。引数の受け渡しについては多くの質問がありますが、nohup を使用して成功する方法は見つかりませんでした。

私のbashスクリプトの簡略版:

#!/bin/bash

BUCKET=$1
echo $BUCKET
script='/home/path/to/script/script.py'
echo "starting $script with nohup"
nohup /usr/bin/python $script $BUCKET &

インポートしている構成スクリプトの関連部分:

FLAG = sys.argv[0]
if FLAG == "b1": 
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket1" 
    AWS_SECRET_ACCESS_KEY = "secret"
elif FLAG == "b2": 
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket2"
    AWS_SECRET_ACCESS_KEY = "secret"
else:
    AWS_ACCESS_KEY_ID = "key"
    BUCKET = "bucket3"
    AWS_SECRET_ACCESS_KEY = "secret"

それを使用しているスクリプト:

from config import BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

#do stuff with the values.  

率直に言って、私は引数を script.py に渡しているので、それらがインポート スクリプトの範囲内にあるかどうか確信が持てません。とはいえ、nohup を使用せずに同様のアプローチを取ると、うまくいきます。

4

2 に答える 2

6

一般に、任意のプログラムの引数ベクトルは、プログラム自体から始まり、次にその引数とオプションのすべてです。言語によって、プログラムはsys.argv[0]argv[0]$0、またはその他の場合がありますが、基本的には常に引数 #0 です。

や Python インタープリター自体など、別のプログラムを実行することを仕事とする各プログラムは、nohup通常、それ自体とそれ自体のすべてのオプションを削除し、ターゲット プログラムに残りのコマンド ラインを提供します。

したがって、 aと 0 以上nohupを取ります。その中には、それ自体 (この場合は) があり、その後は追加の引数 (および解決されるもの) になります。COMMANDARGSCOMMANDargv[0]COMMAND'/usr/bin/python'argv[1]'/home/path/to/script/script.py'$BUCKET

次に、Python は 0 個以上のオプション、スクリプト、およびそのスクリプトへの 0 個以上の引数を受け取り、スクリプトとその引数を として公開しますsys.argv。したがって、スクリプトでsys.argv[0]は、 になり'/home/path/to/script/script.py'、解決sys.argv[1]されるものは何でもなります。$BUCKET

またbash、Python と同様に機能します。$1は bash ラッパー スクリプトの最初の引数になります ($0はスクリプト自体になります)。したがって、sys.argv[1]内側の Python スクリプトでは、bash ラッパー スクリプトに渡される最初の引数を取得することになります。

インポートはまったく影響sys.argvしません。したがって、configモジュールとトップレベル スクリプトの両方で、bash ラッパー スクリプトに渡されたimport syssys.argv[1]保持します。$1

(一部のプラットフォームでは、状況argv[0]によっては完全なパスがない場合や、空の場合もあります。しかし、それはここでは関係ありません。気にするのは、最終的なsys.argv[1]、およびbashnohup、およびpythonはすべて、そのまま通過することが保証されています。 )

于 2013-08-01T22:01:52.277 に答える