2013-06-20 28 views
2

我有以下(簡化的)代碼:NamedTemporaryFile不能從命令行acessed

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。

回答

3

您錯誤地使用subprocess.call()

通行證在參數列表:

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

的說法是不通過殼處理,像一個殼會做不解析出。這是一件好事,因爲它可以防止不可信的命令行參數帶來安全問題。

您的其他選項包括使用shlex.split()爲您做空白分割,或作爲最後手段告訴subprocess使用shell命令與shell=True標誌。有關啓用shell,請參閱big warning on the subprocess documentation

+0

哦,我真是個白癡!我忘了'shell = True'。我回到了你的(更好的)列表解決方案,它完美地工作。感謝您及時的回覆。 – javex