2011-10-21 7 views
2

regexp(つまり、cat filename*)を含むpythonからシェルコマンドを呼び出すにはどうすればよいですか?regexpを含むpythonからシェルコマンドを呼び出すにはどうすればよいですか?

私が書いた:

pid = subprocess.Popen(["cat", filename + "*"]) 

を私はエラー

猫のファイル名*そのようなファイルやディレクトリを取得しています。

私は、シェルが強制的に "*"を正規表現として扱い、文字列として扱わないようにしたいと考えています。これを実装する方法はありますか?

+0

'cat'を開くファイルはありますか?例を挙げていただけますか? – fredley

+0

私は、filaneme00、filaename01、...というファイル名でファイルを分割したフォルダを持っています。 cat filename *> filename_original_version – curious

答えて

4

:コマンドを実行する前に、引数を展開するglob.globを使用し、また

pid = subprocess.Popen(["cat",filename+"*"], shell=True) 

をあなたが実行したいと思うようなものです。つまり、catを実行するには/ bin/shを起動する必要があります。

pid = subprocess.Popen(["/bin/sh", "-c", "cat", filename + "*"]); 

実際に/ bin/shはあなたのためにアスタリスクの拡張を実際に実行し、あなたは望みの結果を得るでしょう。

それとも、拡張を自分でグロブ行うためにグロブライブラリを使用することができます(すなわちんシェルの作業を行う):

pid = subprocess.Popen(["cat"] + glob.glob(filename + "*")); 

glob.globは()グロブに一致するファイルの配列を返します。

+0

glob.glob(filename + "\ *")を使用しているとき、ファイルをアルファベット順に組み合わせていないと、シェルを開いてcat filenameと入力したときと同じように\ *。私は新しいシェルを呼び出すとき、これを得ています:cat: - :入出力エラーです。 @ Kirkの答えでも同じことが起こっています – curious

+2

はい、 'glob'は、ファイルがディレクトリに格納されているアルファベット順でない順番を使用します。あなたは 'glob.glob()'呼び出しの周りに 'ソート済み(...)'を置くことができます。 – kindall

+1

Ahmedは、 'Popen()'の 'shell = True'引数も同じことを成し遂げます。 –

6

あなたのグロブ展開する基本的なシェルを使用します(グロブそれはシェル拡張だ、それは正規表現ではありませんFIRST

import glob 
pid = subprocess.Popen(["cat"] + glob.glob(filename + "*")) 
関連する問題