2016-12-15 57 views
1

我得到一个“[错误5访问被拒绝WindowsError”。 Access is denied消息后没有列出文件夹。我不是管理员,但对目标.7z文件和输出文件夹都设置了完整的读/写/执行/修改安全设置。下面是相关代码:Python的7-Zip的子流程 - WindowsError:在我的Python脚本2.7错误:错误5访问被拒绝

if os.path.isfile(os.path.join(outRoot[0], outRoot[1] + "_photos.7z")): 
    #Unzip photo folder 
    import subprocess 
    source = outFolder + "_photos.7z" 
    pw = '' 
    subprocess.call(['"C:\\Program Files\\7-Zip\\7z.exe" x ' + source + ' -o' + outRoot[0] + ' -p' + pw]) 
+0

我建议你安装libarchive:'须藤PIP安装libarchive'这样你就可以直接解压缩.7z压缩文件。 –

回答

2

你传递一个列表一次入境到call(),但它应该是每个命令行选项一个条目,即

subprocess.call([ 
    'C:\\Program Files\\7-Zip\\7z.exe', 
    'x', 
    source, 
    '-o' + outRoot[0], 
    '-p' + pw 
]) 

列表语法是有这么你不必照顾自己。子流程会为你做到这一点。

你的代码不会告诉Python来解释整个命令行程序调用的名称;当然,这会失败。

更新:似乎7-Zip不喜欢选项名称后面的空格。相应地更新了上面的示例代码。这不是一个Python问题,但它很好地展示了执行命令行的列表语法是如何工作的。列表中的每个元素都被视为单个选项并根据需要引用(例如,如果它包含空格)。选项被空白分隔。

为了调试你可以在命令列表传递给subprocess.list2cmdline()看到被从列表中创建内部的字符串。

+0

我试过了。它给出了一条消息,说它正在解压缩该文件,但随后出现“错误:错误的命令行” – spaine

+0

更新了我的答案。不是Python问题。在使用'subprocess'时,要特别小心检查错误是来自Python还是外部命令。这是后者。 – besc

+0

谢谢,它的工作原理 - 这是我第一次玩subprocess。 – spaine

相关问题