【问题标题】:python copy file in local network (linux -> linux) and outputpython 在本地网络中复制文件(linux -> linux)并输出
【发布时间】:2014-05-06 09:46:57
【问题描述】:

我正在尝试编写一个脚本来从我的台式电脑复制树莓派中的文件。 这是我的代码:(一部分)

print "start the copy"   
path_pi = '//192.168.2.2:22/home/pi/Stock/'
file_pc = path_file + "/" + file
print "the file to copy is: ", file_pc

shutil.copy2(file_pc, path_pi + file_pi)

其实我有这个错误:(法语)

IOError: [Errno 2] Aucun fichier ou dossier de ce type: '//192.168.2.2:22/home/pi/Stock/exemple.txt'

那么,我该如何继续?我必须在尝试复制之前连接两台机器吗? 我试过了:

path_pi = r'//192.168.2.2:22/home/pi/Stock'

但问题是一样的。 (而file_pc是一个变量)

谢谢

编辑: 好的,我找到了这个:

command = 'scp', file_pc, file_pi  
p = subprocess.Popen(command, stdout=subprocess.PIPE) 

但没有办法获得输出...(使用 Shell=False)

【问题讨论】:

标签: python networking subprocess local scp


【解决方案1】:

您是否启用了 SSH?这样的事情可以帮助你:

import os
os.system("scp FILE USER@SERVER:PATH")

【讨论】:

  • 虽然这应该可行,但这并不是一个好主意。使用subprocess.call(['scp', filename, '{}@{}:{}'.format(user, hostname, path)]) 会更干净一些。 os.system 正在生成一个 shell,并评估文本,如果您将任何用户输入放入该字段,这既是不必要的,也可能导致简单的安全漏洞。
【解决方案2】:

shutil.copy2() 适用于本地文件。 192.168.2.2:22 建议您通过 ssh 复制文件。您可以将远程目录 (RaspberryPi) 挂载到桌面计算机 (sshfs) 上的本地目录上,以便 shutil.copy2() 可以工作。

如果您想查看命令的输出,请不要设置stdout=PIPE(注意:如果您设置了stdout=PIPE,那么您应该从p.stdout 读取,否则进程可能会永远阻塞):

from subprocess import check_call

check_call(['scp', file_pc, file_pi])

scp 将打印到您的父 Python 脚本打印的任何位置。

以字符串形式获取输出:

from subprocess import check_output

output = check_output(['scp', file_pc, file_pi])

虽然看起来 scp 如果输出被重定向,默认情况下不会打印任何内容。

您可以使用pexpect 让scp 认为它在终端中运行:

import pipes
import re
import pexpect # $ pip install pexpect

def progress(locals):
    # extract percents
    print(int(re.search(br'(\d+)%[^%]*$', locals['child'].after).group(1)))

command = "scp %s %s" % tuple(map(pipes.quote, [file_pc, file_pi]))
status = pexpect.run(command, events={r'\d+%': progress}, withexitstatus=1)[1]
print("Exit status %d" % status)

【讨论】:

  • 谢谢,一切正常。如何在字符串中获取回调?
  • @Guillaume:我已经更新了答案以显示如何获取子进程的输出
  • 好的,但是: out = check_output(['scp', file_pc, file_pi]) 打印出来什么都没有,它停留在第一行。事实上,我想获得进度条的百分比
  • @Guillaume: update your question 或 ask a new one 特别是关于如何从 scp 命令获取百分比。
  • @Guillaume:我添加了基于pexpect 的解决方案,可以从scp 中提取进度信息
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 2014-08-29
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 2019-02-08
相关资源
最近更新 更多