は:
sh.sh('-c', 'source test.sh')
言っ
、はるかに少ない魔法含まれ、代わりにsubprocess.Popen()
の使用を検討し、より予想通りに動作します。
# ...if hardcoding the script to source in your Python code
subprocess.Popen('source ./test.sh', shell=True)
# ...otherwise:
subprocess.Popen(['source "[email protected]"', './test.sh'], shell=True)
配列が最初のargに渡されるときsubprocess.Popen
が呼び出され、最初の引数は実行するソースとして扱われ、その後の引数は、shell=True
で呼び出された/bin/sh
の文字列リテラルの配列の組み合わせを可能にして、$1
,$2
などになりました。
しかし:シェルへのソーシングコンテンツの背後にある意図と目的は、そのシェルの状態を変更することが一般的です。sh.sh
またはsubprocess.Popen()
のいずれかを指定すると、そのシェルはその単一のPython関数呼び出しの呼び出しの間だけ持続するため、状態は今後も持続しません。sh
またはsubprocess
呼び出しは実際にあなたの目標を達成することはありません。あなたのdo-something-else-here
がsource ./test.sh
によって作られたシェルとその環境の変化に依存する...
sh.sh('-c', 'source ./test.sh; do-something-else-here')
:あなた本当にが欲しい
は、より多くのこのよう考えられます。
'subprocess.Popen( 'source test.sh'、shell = True)'とは対照的に、ここでジョブの適切なツールとして 'sh'を好む特別な理由はありますか? –
... btw、私は(実際にシェルを起動しないので) 'sh'は誤解を招きやすい名前であると主張しています。その名前が与えられれば、 '/ bin/sh'で利用可能な組み込みコマンドにアクセスすることが期待されることは驚くことではありません。 –