我正在尝试使用 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/