我知道S / O已经有很多这方面了但是我很茫然。这是重现问题的最小来源:
文件test.py
from subprocess import call
Filename1 = "A & B.txt"
Filename2 = "A&B.txt"
Archivename1 = "A & B.7z"
Archivename2 = "A&B.7z"
ShellArgs = ["7zip.bat", "a", Archivename1, Filename1]
call (ShellArgs, shell = False)
ShellArgs = ["7zip.bat", "a", Archivename2, Filename2]
call (ShellArgs, shell = False)
档案7Zip.bat
"C:\Program Files\7-Zip\7z.exe" %*
A&B.txt
和A & B.txt
可以是任何现有文件。如果您要尝试重现该问题,我建议使用空文件夹,因为错误的行为导致7-Zip尝试创建整个文件夹内容的存档。
我遇到的问题是第一次调用有效,第二次调用没有,我相信原因是Python看到参数A & B.txt
包含空格,所以它会双引号参数。第二个失败,因为A&B.txt
不包含空格,因此它不提供引号。 Windows因此看到命令行
"C:\Program Files\7-Zip\7z.exe" a A&B.7z A&B.txt
它将其解释为3个链式命令 - 即
"C:\Program Files\7-Zip\7z.exe" a A
B.7z A
B.txt
不幸的是,第一个被7Zip解释为“将归档A.7z
命名为”并将其中的所有内容放入其中“(我让它在一夜之间运行并开始在其中一个中找到一个35 Gb文件程序遍历的文件夹。)
当文件名没有空格时,如何解决引用参数的失败?我尝试自己添加它们,但是他们(我实际上并不确定“他们”是谁)有助于逃脱双引号-i.e.将"
转换为\"
。我猜其他特殊字符也可能导致类似的问题 - 我还没试过。
答案 0 :(得分:0)
对于Python的Windows subprocess
模块中的一个错误,我认为subprocess.call
工作正常。证明:
$ cat ./argtester.c
#include <stdio.h>
int main ( int argc, char** argv ) {
int i = 0;
while ( i < argc ) {
printf("ARG %d: %s\n", i+1, argv[i]);
++i;
}
return 0;
}
因此,它会将每个传递给它的参数喷出,每行一个。希望我们不会通过嵌入换行符传递任何参数...(我们不在这里)。
$ cat test.py
from subprocess import call
Filename1 = "A & B.txt"
Filename2 = "A&B.txt"
Archivename1 = "A & B.7z"
Archivename2 = "A&B.7z"
ShellArgs = ["./argtester", "a", Archivename1, Filename1]
call (ShellArgs, shell = False)
ShellArgs = ["./argtester", "a", Archivename2, Filename2]
call (ShellArgs, shell = False)
您的计划,但将7zip.exe
更改为./argtester
。现在,编译argtester:
$ gcc -o argtester argtester.c
看看会发生什么:
$ python2.7 test.py
ARG 1: ./argtester
ARG 2: a
ARG 3: A & B.7z
ARG 4: A & B.txt
ARG 1: ./argtester
ARG 2: a
ARG 3: A&B.7z
ARG 4: A&B.txt
鉴于这些论点,这正是我所期望的。因此,我的预感是7z.exe
或7zip.bat
错误。根据“我的代码是最可能的罪魁祸首”的原则,我猜7zip.bat
:
"C:\Program Files\7-Zip\7z.exe" %*
%*
看起来非常可疑。我不说MS命令解释器,但在* nix land / Bash中,有很多引用方法。要在Bash土地上做类似的事情,我会这样做:
/path/to/my/7z "$@"
"$@"
扩展到所有参数,并且 - 至关重要 - 在将其传递给7z
之前也引用每个参数。如果我使用$@
(注意缺少引号),那么我在* nix land中会遇到与你在MS土地上相同的错误。
也许看一下Batch语法?或者完全避开批处理文件并提供7zip.exe
的完整路径?