带引号参数时subprocess.run与getoutput不等价的scp执行问题
解决subprocess.run执行scp跨系统传输文件的路径问题
问题核心是subprocess两种调用方式的参数处理逻辑完全不同:
- 用
subprocess.getoutput()时,依赖系统shell解析整个命令字符串,你加的'"F:/data_save"'会被shell解析成纯路径F:/data_save(带空格的路径也能被正确识别为单个参数)。 - 但用列表形式调用
subprocess.run()时,每个列表元素会直接作为命令的参数传递,没有shell介入解析,你之前给config_path加的'和"会被当成路径的一部分,导致scp去找'F:/data_save'这个不存在的路径,因此报错。
解决方案
- 修正
config_path的定义,去掉所有多余的引号:# 无空格路径写法 config_path = "Administrator@192.168.31.57:F:/data_save" # 如果路径带空格,直接写即可,不需要加任何引号 # config_path = "Administrator@192.168.31.57:F:/data save" - 用修正后的参数调用
subprocess.run():subprocess.run(["sshpass", "-p", win_password, "scp", "StartSaving.tmp", config_path])
原理说明
列表形式的subprocess.run()会把每个元素原封不动传给目标命令,不需要像shell命令那样用引号包裹带空格的参数——整个字符串会被scp直接识别为单个路径参数,自然能正确处理带空格的目录。
内容的提问来源于stack exchange,提问作者Chenye Zhou
相关产品推荐
相关产品推荐

