2014-03-27 45 views
2

我正在嘗試編寫腳本來從我的桌面PC中複製RaspberryPi中的文件。 這裏是我的代碼:(一部分)python在本地網絡中複製文件(linux - > linux)並輸出

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臺機器嗎? 我已經tryed有:

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) 

但是沒有辦法有輸出...(與殼牌=假工作)

+0

相關:我如何使用scp或ssh將文件複製到Python中的遠程服務器?](HTTP:/ /stackoverflow.com/q/68335/4279) – jfs

回答

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) 
+0

謝謝,它工作正常。 如何獲得字符串中的回調? – Guillaume

+0

@Guillaume:我已經更新了答案,以顯示如何讓子輸出 – jfs

+0

好的,但是: OUT = check_output([ 'SCP',file_pc,file_pi]) 打印出來 沒什麼appers,它停留在第一線。事實上,我想獲得一個進度條的百分比 – Guillaume

1

您是否啓用SSH?像這樣的東西可以幫助你:

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

雖然這應該工作,但這不是一個好主意。使用'subprocess.call(['scp',filename,'{} @ {}:{}'.format(user,hostname,path)])'會更清潔一些。 'os.system'產生一個shell,並對文本進行評估,這是不必要的,並且如果您將任何用戶輸入放入該字段,可能會導致輕鬆的安全漏洞。 – wolfd