文件名中带有空格的Python scp复制文件

文件名中带有空格的Python scp复制文件,python,filenames,space,scp,Python,Filenames,Space,Scp,我正在尝试使用scp复制本地网络中的文件。 它可以很好地处理没有空格的文件名,但是它会崩溃。 我试着用“\”来代替“”,但它不起作用。 这是我的密码: def connection(locals): a = (int(re.search(br'(\d+)%$', locals['child'].after).group(1))) print a perc = (Decimal(a)/100) print (type(perc

我正在尝试使用scp复制本地网络中的文件。 它可以很好地处理没有空格的文件名,但是它会崩溃。 我试着用“\”来代替“”,但它不起作用。 这是我的密码:

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 %
我如何解决这个问题?
感谢使用
子流程
模块和/或
shlex.split()


您不必担心转义或引用任何内容

使用
子流程
模块和/或
shlex.split()


您不必担心转义或引用任何内容,您可以保持本地文件的原样(
pipes.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)

i、 e.,
user@host:/path/with space
应更改为
user@host:“/path/with space”

您可以保留本地文件
文件\u pc
原样(
管道。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)

i、 e.,
user@host:/path/with space
应更改为
user@host:“/path/with space”

您可能需要研究一个简化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/')

您可能需要研究一个简化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/')

不,我不能。我想获得命令的输出,以显示progressbar。(请参阅输出显示在标准输出上。如果您不想捕获它以实时做出反应……好吧,这是可以做到的,但这很麻烦。您需要线程,为进程标准输出重新打开fd描述符,并使用正确的标志等。最好检查
paramiko
模块,但这是完全不同的问题。我尝试了paramiko,但是,有一个大文件bug(请参阅)。正如我所说,该脚本在名称中没有空格的情况下运行良好。@m.wasowski:read。它显示如果stdout是管道,
scp
将不打印任何内容。尽管它与
pexpect
模块提供的伪tty一起工作(在这种情况下没有缓冲问题)。问题是如何将带空格的文件名传递给scp命令OK,我回家后会给出另一个解决方案否,我不能。我想获得命令的输出,以显示进度条。(请参阅输出显示在标准输出上。如果您不想捕获它以实时做出反应……好吧,这是可以做到的,但这很麻烦。您需要线程,为进程标准输出重新打开fd描述符,并使用正确的标志等。最好检查
paramiko
模块,但这是完全不同的问题。我尝试了paramiko,但是,有一个大文件bug(请参阅)。正如我所说,该脚本在名称中没有空格的情况下运行良好。@m.wasowski:read。它显示如果stdout是管道,
scp
将不打印任何内容。尽管它与
pexpect
模块提供的伪tty一起工作(在这种情况下没有缓冲问题)。问题是如何将带空格的文件名传递给scp命令OK,当我回到家时,我会给出另一个解决方案相关:相关:你很强大。谢谢!你很强大。谢谢!
fabric
是在
fabric
之上实现的