2

次の(簡略化された)コードがあります。

with NamedTemporaryFile() as f:
    f.write(zip_data)
    f.flush()
    subprocess.call("/usr/bin/7z x %s" % f.name)

次のエラーで終了します。

Traceback (most recent call last):
  File "decrypt_resource.py", line 70, in <module>
    unpack(sys.argv[2])
  File "decrypt_resource.py", line 28, in unpack
    print(subprocess.check_output(cmd))
  File "/usr/lib/python2.7/subprocess.py", line 568, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1308, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

ただし、NamedTemporaryFile(delete=False)コマンドを使用してから印刷して実行すると、機能します。ここで何が問題なのですか?

私のシステムは、カーネルを備えた ArchLinux3.9.5-1-ARCHです。

4

1 に答える 1

3

使い方がsubprocess.call()間違っています。

引数のリストを渡します。

subprocess.call(["/usr/bin/7z", "x", f.name])

引数はシェルによって処理され、シェルのように解析されません。これは、信頼されていないコマンド ライン引数によるセキュリティ上の問題を防ぐため、良いことです。

他のオプションには、使用shlex.split()して空白を分割するか、最後の手段として、フラグsubprocessを使用してコマンドにシェルを使用するように指示することが含まれます。シェルの有効化に関するドキュメントの大きな警告をshell=True参照してください。subprocess

于 2013-06-20T12:43:00.980 に答える