无法从命令行访问NamedTemporaryFile

时间:2013-06-20 12:39:33

标签: python linux unix

我有以下(简化)代码:

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)然后打印&amp;执行命令,它的工作原理。这有什么不对?

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

1 个答案:

答案 0 :(得分:3)

您错误地使用了subprocess.call()

传入参数列表:

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

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

您的其他选项包括使用shlex.split()为您执行空格分割,或者,作为最后的手段,告诉subprocess使用带有shell=True标志的命令的shell。有关启用shell的信息,请参阅big warning on the subprocess documentation