微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

执行 WinSCP 脚本时,subprocess.Popen 中的 Python 双引号不起作用

如何解决执行 WinSCP 脚本时,subprocess.Popen 中的 Python 双引号不起作用

我正在尝试使用 https://stackoverflow.com/a/56454579 中的代码从 Windows 10 上的 Python 使用 WinSCP 将文件上传到服务器。代码如下所示:

import subprocess
path = r'C:\mp4s\Sci-Fi Light Flicker.mp4'

process = subprocess.Popen(
  ['C:\Program Files (x86)\WinSCP\WinSCP.com','/ini=nul','/command','option batch abort','option confirm off','open ftp://user:pass@ftp.website.com',f'put "{path}"','exit'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
for line in iter(process.stdout.readline,b''):
  print(line.decode().rstrip())

我得到输出

batch           abort
confirm         off
Connecting to ftp.website.com ...
Connected
Starting the session...
Session started.
Active session: [1] user@ftp.website.com
File or folder '\C:\mp4s\Sci-Fi' does not exist.
System Error.  Code: 123.
The filename,directory name,or volume label Syntax is incorrect
(A)bort,(R)etry,(S)kip,Ski(p) all: Abort

这告诉我 put 命令没有正确处理文件名中的空格。我需要更改什么才能使其正常工作?删除路径周围的双引号会给我一个不同的错误(它认为我正在尝试上传多个文件)。

解决方法

我认为您不能使用数组为 WinSCP 提供参数。 subprocess.Popen 使用反斜杠转义参数中的双引号,这与 WinSCP 预期的 double double-quotes escaping 冲突。

您必须自己格式化 WinSCP 命令行:

args =  "\"C:\Program Files (x86)\WinSCP\WinSCP.com\" /ini=nul " + \
       f"/command \"open ftp://user:pass@ftp.website.com\" \"put \"\"{path}\"\"\" exit"

(请注意,我已经省略了您的 option commands,因为它们都是默认值)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。