2017-06-11 7 views
0

のコマンドを許可していません。linuxでは次のコマンドを使用できます。os.systemは>

ls > >(tee -a a) 

しかし、python os.systemでは構文が許可されていません。

>>> import os 
>>> os.system("ls > >(tee -a a)") sh: -c: line 0: syntax error near unexpected token `>' sh: -c: line 0: `ls > >(tee -a)' 256 
>>> 

任意の文字をエスケープする特別な方法が必要ですか?

+0

shはその構文を許可していません。 POSIXシェルはbashではありません。 'os.system()'は '/ bin/bash'ではなく'/bin/sh'を使います。 –

+0

あなたが達成しようとしているものは、おそらくPythonを使うべきです。 –

答えて

2

コメントで言及したように、os.system/bin/shでコマンドを実行します。これが/bin/bashへのリンクであっても、Bashを/bin/shとして実行すると、実行中のコマンドのようなBash固有の構文が機能しないPOSIX準拠モードに切り替わります。

一つの解決策は、使用することです:

os.system("/bin/bash -c 'ls > >(tee -a a)'") 

これはかなり粗である - それは、目的のコマンドを実行するために、新しいシェル/bin/bashを実行するためにシェル/bin/shを使用しています。本当にこれをやりたければ、パッケージsubprocessの関数を使って直接Bashを実行すると、より洗練されたものになります。

この場合、もっと簡単な解決策があると思います。 「パイプ」構文:

os.system("ls | tee -a a") 

/bin/sh互換である、と私はそれはあなたがここでやろうとしている同じことを実現すると思います。

別のコメントで述べたように、それはどちらか、ハードは純粋なPythonでこれを実行するということではありません。

# Python 3 
with open("a", "a") as o: 
    for f in os.listdir("."): 
     print(f) 
     print(f, file=o) 

# Python 2 
with open("a", "a") as o: 
    for f in os.listdir("."): 
     print f 
     print >>o, f 
1

os.systemはsubprocessに置き換えられます。ここにサブプロセスを持つソリューションがあります。サブプロセスを使用したソリューションです.Popen

import subprocess 
process = subprocess.Popen("ls", stdout=subprocess.PIPE) 
stdoutdata, _ = process.communicate() 
print stdoutdata 
with open ("a", "a") as fle: 
    fle.write(stdoutdata) 
関連する問題