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.
去除
我正在尝试使用 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.