2016-06-01 1 views
0

私は変数にPythonと店舗で実行する次のコマンドがあります。複数の引数を持つ 'ls'シェルコマンドを実行する最も良い方法は?

ls -1 var1 2>/dev/null | grep var2 | grep var3 | head -n 1 

をしかし、私はそれを動作させることはできません。私はサブプロセスを使用してみました(両方の 'call'と 'check_output'と 'os.system'の両方で働いていました。)いつも私にエラーや誤った入力を与えました。

+6

のようになります。ところで、これはさえネイティブシェルで、一般的な非常に悪い形である - http://mywiki.wooledge.org/ParsingLsで説明したように - とPythonでは、ディレクトリツリーを反復処理するためのネイティブツールがあります。すべての可能なファイル名が改行で区切られたストリームで表現できるわけではないので、 'ls'が間違って表示する名前が必然的に存在します。 –

+4

シェルコマンドの束を呼びたい場合、シェルスクリプトはPythonプログラムよりも適切なツールになります。 Pythonを書く場合は、 'os.listdir'やPython独自の文字列マッチングユーティリティなどのツールを使うべきです。 – user2357112

+0

チャールズ・ダフィーは言った。また、UnixとLinuxの[なぜ* * not * parse 'ls'?](http://unix.stackexchange.com/q/128985/88378)の回答を参照してください。その人のために –

答えて

3

あなたがサブプロセスモジュールを使用したいシェルコマンドを実行します。 Python Docs: subprocess

はbashを呼び出すための実際のPythonのコードは、この

import subprocess 
task = subprocess.Popen("ls -1 var1 2>/dev/null | grep var2 | grep var3 | head -n 1", 
         shell=True, 
         stdout=subprocess.PIPE) 
directory = task.stdout.read() 
print(directory) # result 

のように推奨される方法を見てしまうかのディレクトリ検索を行うためのpythonを使用するようになります

使用方法および実施例はで見つけることができます。 Python listdir() oslistdirためのコマンドは、この

files = [f for f in os.listdir('.') if re.match(r'[0-9]+.*\.jpg', f)] 
+0

この特定のケースについて私はスクリプト移植性のためにPythonの 'os'モジュールを使用することにしましたが、将来の仕事に役立つ、ありがとう! – Gambit2007

+0

Py3では 'サブプロセスを使うだけで簡単にできます。check_output'、OPが 'head -n 1'を使用している場合、最初の結果が必要なように見えるので、変数に代入するだけです。 – AChampion

1

subprocessを使用したとき、私は問題ありません。

>>> import subprocess 
>>> sub = subprocess.Popen("ls -1 var1 2>/dev/null | grep var2 | grep var3 | head -n 1", shell=True, stdout=subprocess.PIPE) 
>>> str = sub.stdout.read() 
>>> str 
'' 

あなたは出力hereを節約しながら、シェルコマンドを呼び出すことに関する追加の情報を見つけることができます

はそれが役に立つことでしょうホープ

0

シェルを実行していることを確認する必要があります。シェルを使用してパイプをディスパッチする場合(例: (PY> 3.1):

import subprocess 
var1, var2, var3 = "var1", "var2", "var3" 
cmd = "ls -1 {} 2>/dev/null | grep {} | grep {} | head -n 1".format(var1, var2, var3) 
result = subprocess.check_output(cmd, shell=True) 
+0

'var1'、' var2'、または 'var3'のいずれかに空白またはglobメタキャラクタが含まれている場合、これは意図したとおりに動作しません。 – chepner

+0

OPのオリジナルの質問でこれらのvarsを使用していると仮定すると、奇妙なことがあるようです。 – AChampion

+0

元の質問はリテラル文字列を使用しています。それらをPython変数に変更しました。 – chepner

関連する問題