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)然后打印并执行命令,它就可以工作。这里有什么问题?

我的系统是带有3.9.5-1-ARCH内核的 ArchLinux。

4

1 回答 1

3

您使用subprocess.call()不正确。

传入参数列表:

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

该参数不是由 shell 处理的,也不会像 shell 那样被解析出来。这是一件好事,因为它可以防止不受信任的命令行参数的安全问题。

您的其他选项包括使用shlex.split()为您进行空格拆分,或者作为最后的手段,告诉subprocess您使用带有shell=True标志的命令使用 shell。请参阅有关启用 shell的文档中的大警告。subprocess

于 2013-06-20T12:43:00.980 回答