web-dev-qa-db-ja.com

OSモジュールとサブプロセスモジュールを介してシェルコマンドを実行します。一方は機能し、もう一方は機能しません

Osモジュールとサブプロセスモジュールを通じてシェルコマンドを実行する方法を学んでいます。以下は私のコードです。

from subprocess import call
call('/usr/lib/mailman/bin/find_member -w user_email')
import os
os.system('/usr/lib/mailman/bin/find_member -w user_email')

2つ目は非常にうまく機能しますが、1つ目は機能せず、次のエラーが発生しました。

Traceback (most recent call last):
  File "fabfile.py", line 6, in <module>
    call('/usr/lib/mailman/bin/find_member -w user_email')
  File "/usr/lib64/python2.6/subprocess.py", line 478, in call
    p = Popen(*popenargs, **kwargs)
  File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

これら2つの方法は同じ効果があると思いました。ここで考えられるエラーは何ですか?どうもありがとう。

1
josephS

2つの間の1つの違いは文書化されています( ここ

os.system(コマンド)

サブシェルでコマンド(文字列)を実行します。

一方、 subprocess.call() は次のようになります。

subprocess.call(args、*、stdin = None、stdout = None、stderr = None、Shell = False)

Argsで記述されたコマンドを実行します。コマンドが完了するのを待ってから、returncode属性を返します。

subprocess.call()os.system()と同じように動作させるには、Shell=Trueを渡す必要があります。だから次のようなもの:

from subprocess import call
call('/usr/lib/mailman/bin/find_member -w user_email', Shell=True)
2
Stephen Rauch