2016-07-01 4 views
0

文字列(shell = True)の代わりにリストを読み込んで、本当にイライラするサブプロセスモジュールが見つかりました。直感的に、subprocess.callは([ "モジュール"、 "リスト"])動作するはずですが、それはできませんし、利回りこの:subprocess.call(["module"、 "list"])が失敗するのはなぜですか?

File "test.py", line 45, in main 
    subprocess.call(["module","list"]) 
    File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 493, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
    OSError: [Errno 2] No such file or directory 

しかし、subprocess.call("module list", shell=True)作品。どうして?

+0

おそらく、シェル初期化ファイルは 'module'が見つかるようにいくつかのパス操作を行いますか? – mgilson

+1

'module'プログラムへのフルパスを使用するとうまくいきますか? – Barmar

答えて

-1

これは単にコマンドのフォーマットです。シェルを介さずに解析するときは、各コマンドと引数を個別に処理します。しかし、インタプリタがgnome-shellを使用するように指示されたとき(これはコマンド文字列全体を解析する上で非常に優れていて、間隔に関するニックピッキーです)、コマンドのフォーマットはそれを反映するように変更されます。この構文解析の問題は、非活性化された入力がシェルプロセスに直接ポンピングされることによるセキュリティの危険性に反映されます。 the docsから:信頼できないソースからunsanitized入力を組み込むシェルコマンドを実行

シェル注射、任意のコマンドの実行をもたらすことができる深刻なセキュリティ上の欠陥にプログラムが脆弱になります。この理由から、shell=Trueの使用は、コマンド文字列が外部入力から構成されている場合は避けてください。

+0

ドキュメントのより良い選択は、 "shellがTrueの場合、指定されたコマンドはシェルを介して実行されます... shell = Trueの場合、**はデフォルトで/ bin/sh **になります。文字列、文字列はシェルを介して実行するコマンドを指定します。これは、 'module'コマンドがシェルを通して利用可能であることを意味しますが、Pythonで直接使用されるときは使用できません。モジュールは '本当の'プログラムのようには見えないので、Pythonでは利用できません。 http://modules.sourceforge.net/man/module.htmlのパッケージ初期化を参照してください。 – KymikoLoco

関連する問題