2017-03-24 1 views
1

私が達成しようとしているのは、いくつかの自動化スクリプトの出力を実行して戻すことですが、なぜスクリプトでENV varsを使用できないのか理解できません。python 3でサブプロセスを使ってコマンドを実行しているときにENV varsを使用していますか?

簡単な例私は私が間違っているのは何

import os 
import subprocess as sp 

cmd = [ 'echo', '$_TEST' ] 
myenv = {**{'_TEST':"is it working?"}, **os.environ } 
pipe = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE, env=myenv ); 
print(pipe.communicate()) 

を実装するのに苦労していますか?

更新:正解を得た後。

import os 
import subprocess as sp 

cmd = [ '/bin/echo', '$_TEST' ] 
myenv = {**{'_TEST':"is it working?"}, **os.environ } 
pipe = sp.Popen(" ".join(cmd), stdout=sp.PIPE, shell=True, stderr=sp.PIPE, env=myenv ); 
print(pipe.communicate() ) 
  1. 我々は変数を評価する必要があるシェル、シェルの引数shell=Trueを提供(またはその他のシェルへのパスを提供)する必要があります。コマンドの

  2. listをので、あなたのソリューションは、単に元のテキストを印刷し、string(例えば「/ binに/エコーの$ _TEST」)

答えて

0

環境変数の置換は、シェルによって実行されることにより、交換する必要があります。このタスクを解決する適切な方法:

import os 
import subprocess as sp 

cmd = 'echo $_TEST' 
myenv = {**{'_TEST':"is it working?"}, **os.environ } 
pipe = sp.Popen(cmd, shell=True, stdout=sp.PIPE, stderr=sp.PIPE, env=myenv ); 
print(pipe.communicate()) 
+0

ああ!ありがとうございました!私は 'shell = True'を設定するとちょっと混乱しました。出力がまったく得られませんでしたが、最初の引数として' list'を 'string'に変更するとすぐに動作します。私はサブプロセスの内部構造とそれがどのように機能するかについて詳しく知る必要があると思います。 – Butuzov

+0

@OlegButuzovええ、それはあなたがcmdの種類を変更する必要が少し紛らわしいです。 – CaptainTrunky

関連する問題