【问题标题】:Python scp copy file with spaces in filenamePython scp 复制文件,文件名中带有空格
【发布时间】:2014-05-08 21:28:26
【问题描述】:

我正在尝试使用 scp 复制本地网络中的文件。 它适用于没有空格的文件名,但它会崩溃。 我尝试将“”替换为“\”,就像 exemple 一样,但它不起作用。 这是我的代码:

def connection(locals):
         a = (int(re.search(br'(\d+)%$', locals['child'].after).group(1)))
         print a
         perc = (Decimal(a)/100)
         print (type(perc)), perc
         while gtk.events_pending():
             gtk.main_iteration()
         FileCopy.pbar.set_text("Copy of the file in the Pi...   " + str(a) + "%")
         while gtk.events_pending():
             gtk.main_iteration()
         FileCopy.pbar.set_fraction(perc)

file_pc = "/home/guillaume/folder/a very large name of file with space .smthg"
file_pi = "pi@192.168.X.X:/home/pi/folder/a very large name of file with space .smthg"

if " " in file_pc:
   file_pc = fichier_pc.replace(" ", '\\\ ')   # tried '\\ ' or '\ '
   file_pi = fichier_pi.replace(" ", '\\\ ')   # but no way
else:
   pass
command = "scp %s %s" % tuple(map(pipes.quote, [file_pc, file_pi]))
pexpect.run(command, events={r'\d+%': connection}) # this command is using to get the %

我该如何解决这个问题? 谢谢

【问题讨论】:

标签: python filenames space scp


【解决方案1】:

您可能想查看fabric,这是一个简化 SSH 使用的 Python 库。

from fabric.state import env
from fabric.operations import get

env.user = 'username'
env.key_filename = '/path/to/ssh-key'

get('/remote_path/*', 'local_path/')

【讨论】:

【解决方案2】:

您可以按原样保留本地文件file_pcpipes.quote 将转义空格)。应该更改远程文件:

import pipes

file_pi = 'pi@192.168.X.X:/home/pi/folder/file with space.smth'
host, colon, path = file_pi.partition(':')
assert colon
file_pi = host + colon + pipes.quote(path)

即,user@host:/path/with space 应更改为 user@host:'/path/with space'

【讨论】:

  • 你很强壮。谢谢!
【解决方案3】:

使用subprocess 模块和/或shlex.split()

import subprocess
subprocess.call(['scp', file_pc, file_pi])

而且您无需担心转义或引用任何内容

【讨论】:

  • 不,我不能。我想获取命令的输出,以显示进度条。 (见here
  • 输出显示在标准输出上。如果您不希望它被捕获以实时做出反应......好吧,它可以完成,但它很麻烦。您需要线程,使用适当的标志重新打开进程标准输出的 fd 描述符等。最好检查 paramiko 模块,但这是完全不同的问题。
  • 我试过 paramiko,但是,有一个大文件的错误(见here)。正如我所说,脚本运行良好,名称中没有空格。
  • @m.wasowski:阅读my answer to the question that Guillaume've linked。它表明scp 打印 nothing 如果 stdout 是管道。虽然它适用于pexpect 模块提供的伪 tty(在这种情况下没有缓冲问题)。问题是如何将带空格的文件名传递给 scp 命令
  • 好的,等我回家再给个解决办法
猜你喜欢
  • 2015-07-23
  • 1970-01-01
  • 2011-01-24
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2011-01-19
  • 1970-01-01
相关资源
最近更新 更多