2016-03-25 5 views
1

Pythonのshモジュールを使用している場合、 'source'組み込みコマンドを実行したいとします。Pythonのshモジュール - Running 'source'コマンド

shにはパラメータとしてバイナリがあるので、実行できません。

shモジュールで組み込みコマンドを実行するにはどうすればよいですか? Pythonのshモジュールを介してsh -c "source hello"を呼び出すために

# source ./test.sh 

sh.source('./test.sh') # wrong usage 
sh.Command('source') # wrong usage 
+1

'subprocess.Popen( 'source test.sh'、shell = True)'とは対照的に、ここでジョブの適切なツールとして 'sh'を好む特別な理由はありますか? –

+1

... btw、私は(実際にシェルを起動しないので) 'sh'は誤解を招きやすい名前であると主張しています。その名前が与えられれば、 '/ bin/sh'で利用可能な組み込みコマンドにアクセスすることが期待されることは驚くことではありません。 –

答えて

4

は:

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-heresource ./test.shによって作られたシェルとその環境の変化に依存する...

sh.sh('-c', 'source ./test.sh; do-something-else-here') 

:あなた本当にが欲しい

は、より多くのこのよう考えられます。

+0

sh.sh - > sh.bash以外はうまくいきます。どうもありがとうございました。 – user3381542

+0

subprocess.Popenの場合は、executable = "/ bin/bash"を追加する必要があります。 – user3381542

+1

@ user3381542あなたのスクリプトがbashのソースであるように書かれている場合は、 '.sh'ではなく' .bash'拡張子を使うべきです(これはPOSIX sh準拠のシェルとの互換性を意味します)。 –

関連する問題