Python 为subprocess.run设置字符串格式;无收盘报价”;

Python 为subprocess.run设置字符串格式;无收盘报价”;,python,subprocess,valueerror,shlex,Python,Subprocess,Valueerror,Shlex,我要运行以下命令: 'xcopy /e "%s" "%s"'%(executablesPath + "\\*", sourcePath+"\\Executables\\") 格式为: xcopy /e "I:\Storage$\tools\Executables\*" "C:\Win10x64-1903\Executables\" 并在以下范围内运行: subprocess.run(shlex.split(command)) 导致错误的原因是什么ValueError:没有结束引号?shle

我要运行以下命令:

'xcopy /e "%s" "%s"'%(executablesPath + "\\*", sourcePath+"\\Executables\\")
格式为:

xcopy /e "I:\Storage$\tools\Executables\*" "C:\Win10x64-1903\Executables\"
并在以下范围内运行:

subprocess.run(shlex.split(command))

导致错误的原因是什么
ValueError:没有结束引号

shlex.split
不喜欢双引号前的最后一个反斜杠。似乎你想逃避这句话,因此这条信息

快速修复:将
sourcePath+“\\Executables\\”
替换为
os.path.join(sourcePath,“Executables”)

更好的解决方法:不要为了再次拆分而编写命令行。只需使用参数列表

subprocess.run(["xcopy","/e",os.path.join(executablesPath,"*"),os.path.join(sourcePath,"Executables")])
更好的方法是,使用递归复制目录。不需要不可移植的外部命令。一些(未经测试的)东西,比如:


“C:\Win10x64-1903\Executables\”
应该是
“C:\Win10x64-1903\Executables”
(末尾没有反斜杠)。更好的方法是:不要使用外部命令复制文件,使用
shutil
module虽然这被标记为可接受的答案,但应该注意shutil.copy并不总是有利于复制子目录及其内容。我只能对单个文件使用shutil.copy,并在嵌套目录的递归函数中使用它。你说得对。对于
shutil.copytree
,我一直有点避而不谈。它有许多局限性。有时你必须创建目录,有时不能。。。有一些调整要做,但至少它是可移植的,不依赖于旧的xcopy
import shutil
shutil.copytree(executablesPath,os.path.join(sourcePath,"Executables"))