2016-10-23 11 views
0

コードに見られるように、2つの命名体系の最新のファイルのファイル名とファイルスタンプを読み込もうとしています。私は大体、次のコードを持っている:PythonのサブプロセスでAwkが無効な表現 "'"エラーが発生する

ls: cannot access /path/to/file/*DAI*.txt: No such file or directory 
awk: '{ 
awk:^invalid char ''' in expression 

ls: cannot access /path/to/file/*CA*.txt: No such file or directory 
awk: '{ 
awk:^invalid char ''' in expression 

:しかし私は、次のエラー(複数可)を得

#!/usr/bin/env python 
import string, subprocess, sys, os 
mypath = "/path/to/file" 


my_cmd = (["ls -lt --full-time " + mypath + "*DAI*.txt", 
      "ls -lt --full-time " + mypath + "*CA*.txt"] 
     ) 
getmostrecent_cmd = "head -n 1" 
getcols_cmd = "awk '{ print $6, $7, $9 }'" 

for cmd in my_cmd: 
    p1 = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) 
    p2 = subprocess.Popen(getmostrecent_cmd.split(), stdin=p1.stdout, stdout=subprocess.PIPE) 
    p3 = subprocess.Popen(getcols_cmd.split(), stdin=p2.stdout, stdout=subprocess.PIPE) 
    output = p3.communicate()[0] 

    print output 

  1. 私は "LS -ltを使用することができますが - フルタイム/path/to/file/*DAI*.txt "と入力し、結果を端末に表示します。同じパスで問題が発生するのはなぜですか?
  2. awkコマンドは、サブプロセスを直接実行すると正常に動作します。例えば。 subprocess.Popen(["awk"、....]、stdin = ....、stdout = ....)は正常に機能しました。しかし、今では一重引用符で問題が発生しています。私は文字列を3重引用符で囲み、一重引用符をエスケープしようとしました。

答えて

1

私は "/LS -lt --full-時間/パス/に/ファイルDAI .TXT" を使用し、端末に 結果を得ることができます。同じパスで問題が発生するのはなぜですか?

グローブ拡張はシェルによって実行されます。デフォルトでは、シェルはPopen()経由で新しいサブプロセスの開始に関与しません。このためには、あなたがそれにshell=True引数を渡す必要があります。

p1 = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, shell=True) 
#               ^^^^^^^^^^ 

awkコマンドを、直接サブプロセスに入れたときに、正常に動作します。例えば。 subprocess.Popen(["awk"、....]、stdin = ....、stdout = ....)は正常に機能しました。しかし、今では一重引用符で問題が発生しています。私は 文字列を3重引用符で囲み、一重引用符をエスケープしようとしました。

シェルコマンドラインでawk '{ print $6, $7, $9 }'で単一引用符は文字列の単一の引数(だけでなく、変数の展開を防ぐため)として扱わ{ print $6, $7, $9 }を作るために必要とされています。単一引用符はシェルによって削除され、awkは文字列{ print $6, $7, $9 }のみを表示します。デフォルトでPopen()がサブプロセスのコマンドを実行したときにシェルを伴い、そのままコマンドに引数を渡していないので、あなたは、単一引用符は必要ありません。

subprocess.Popen(["awk", "{ print $6, $7, $9 }"], stdin=...., stdout=....) 
+0

おかげでチームメイト。 2にあなたのasnwerは多くの助けになりました。 1の場合、私はshell = Trueを使うべきではありませんでした。私の回避策は、DAIとCAのフルパスを使い、grepを実行することでした。 – DDauS

関連する問題