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

标签 python windows whitespace double-quotes winscp

我正在尝试使用 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:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3b4b5a48487b5d4f4b154c5e5948524f5e15585456" rel="noreferrer noopener nofollow">[email protected]</a>', 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] <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="483d3b2d3a082e3c38663f2d2a3b213c2d662b2725" rel="noreferrer noopener nofollow">[email protected]</a>
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使用反斜杠转义参数中的双引号,与 double double-quotes escaping 冲突WinSCP 所期望的。

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

args =  "\"C:\Program Files (x86)\WinSCP\WinSCP.com\" /ini=nul " + \
       f"/command \"open ftp://user:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e595849696a5839195cb928087968c9180cb868a88" rel="noreferrer noopener nofollow">[email protected]</a>\" \"put \"\"{path}\"\"\" exit"

(请注意,我省略了您的 option commands ,因为它们无论如何都是默认值)

关于执行 WinSCP 脚本时,subprocess.Popen 中的 Python 双引号不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65802754/

相关文章:

带空格的 Java 正则表达式

python - Django 反向正则表达式匹配

python - 如何将 Pandas 中的数据帧相加超过 5 个

c++ - 音频设备输入名称被截断

python - 如何在 Windows 上修复 python 的 getaddrinfo 失败

c++ - Windows - 从消息队列中删除与键盘相关的消息

jsf - 如何防止空格形成 JSF h :inputText

Python 的逻辑运算符 AND

python - 从 Pandas 写入 Excel 时设置默认数字格式

javascript - childNodes - 元素内的空白