2016-09-30 19 views
-1

はbashで正常に動作プロセス置換のおもちゃの例である:シェルとPythonのサブプロセスから呼び出されたときプロセス置換は、Pythonのサブプロセスがshell = Trueで許可していませんか?ここで

$ wc -l <(pwd) 
1 /proc/self/fd/11 

なぜ同じコマンドをTrue =構文エラーを与えるのでしょうか?

>>> subprocess.check_call('wc -l <(pwd)', shell=True) 
/bin/sh: 1: Syntax error: "(" unexpected 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/path/to/my/python/lib/python3.5/subprocess.py", line 581, in check_call 
    raise CalledProcessError(retcode, cmd) 
subprocess.CalledProcessError: Command 'wc -l <(pwd)' returned non-zero exit status 2 
+0

'shell = True'はBashを使用していません。 '/ bin/sh'を使っています。 (どこかでそれが設定可能かどうかはわかりません) – user2357112

+0

それは問題です。ありがとう! –

+0

正確な相違点については、https://stackoverflow.com/questions/5725296/difference-between-sh-and-bashも参照してください。 – tripleee

答えて

2

/bin/sh: 1: Syntax error: "(" unexpected

あなたはbashismを持っています。 /bin/shが実装しているPOSIXでは有効ではありません。

+2

ありがとう!解決策は、 'executable = '/ bin/bash'で' check_call'を呼び出すことです。 –

2

もう1つの解決方法は、シェルコードをPython自体に移すことです。例えば:それはあなたがより容易にはPython自体に行う方法を見ているより小さな塊に仕事を分解するとして

from subprocess import Popen, PIPE, check_call 

p1 = Popen(["pwd"], stdout=PIPE) 
p2 = check_call(["wc", "-l"], stdin=p1.stdout) 

これは、多くの場合、全くsubprocessを使用する必要性を排除に向けた最初のステップである可能性があります。

関連する問題