subprocess.Popen 当 args 是一个序列时,robocopy 不起作用

subprocess.Popen robocopy doesn't work when args are a sequence

我正在尝试使用 Python 3.9 在 Win10 上使用子进程 Popen robocopy。

我读过 当参数未拆分时需要 shell=True 并且 shell=False 如果它们是但无论我尝试什么,拆分参数总是导致错误代码 16我并将参数作为单个字符串传递似乎并不关心 shell 参数并且始终有效。

这是最重要的测试代码片段:

tmpdir = tempfile.gettempdir()

srcdir = f'{tmpdir}\tstsrc'
try: os.mkdir(srcdir)
except FileExistsError: pass
Path(f'{srcdir}\test.txt').touch()

dstdir = f'{tmpdir}\tstdst'

def testRobocopy(args, shell=False, expectedReturncode=0):
    # args should be a sequence of program arguments or else a single string - see https://docs.python.org/3/library/subprocess.html#popen-constructor
    assert(isinstance(args, list) or isinstance(args, str))
    shutil.rmtree(dstdir, ignore_errors=True)
    p = subprocess.Popen(args, shell=shell)
    p.wait()
    assert(p.returncode == expectedReturncode)
    
# all of the following set returncode=16 (The filename, directory name, or volume label syntax is incorrect.)
testRobocopy(['Robocopy', f'"{srcdir}"', f'"{dstdir}"'], shell=False, expectedReturncode=16)
testRobocopy(['Robocopy', f'"{srcdir}"', f'"{dstdir}"'], shell=True, expectedReturncode=16)

# all of the following set returncode=1 (success)
testRobocopy(f'Robocopy "{srcdir}" "{dstdir}"', shell=False, expectedReturncode=1)
testRobocopy(f'Robocopy "{srcdir}" "{dstdir}"', shell=True, expectedReturncode=1)

可以找到完整的测试代码here

如何使用拆分参数打开 robocopy?

重复引号是问题所在:当将命令指定为列表时,参数应为 f'{srcdir}' 等而不是 f'"{srcdir}"',否则 Robocopy 将接收 "c:\path\to\file"(带有引号),也许它不知道要剥离。
当命令作为字符串传递时,引号被评估并由 shell.

去除