Файл копии python в локальной сети (linux → linux) и вывод

Я пытаюсь написать script для копирования файлов в моем RaspberryPi с моего настольного ПК. Вот мой код: (часть)

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'

Итак, как я мог продолжить? Должен ли я подключить 2 машины до копирования? Я попробовал:

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)

Ответ 1

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 script.

Чтобы получить вывод в виде строки:

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)

Ответ 2

У вас включен SSH? Что-то вроде этого может помочь вам:

import os
os.system("scp FILE [email protected]:PATH")