从 Python 中的远程计算机选择文件

File Selection From Remote Machine In Python

我正在 Ubuntu python 中编写程序。在那个程序中,我在连接 RaspberryPi 的远程网络上使用命令 askopenfilename 努力 select 一个文件。

任何人都可以指导我如何使用 askopenfilename 命令或类似的东西从远程计算机 select 文件吗?

from Tkinter import *
from tkFileDialog import askopenfilename
import paramiko

if __name__ == '__main__':

    root = Tk()

    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('192.168.2.34', username='pi', password='raspberry')
    name1= askopenfilename(title = "Select File For Removal", filetypes = [("Video Files","*.h264")])
    stdin, stdout, stderr = client.exec_command('ls -l')
    for line in stdout:
        print '... ' + line.strip('\n')
    client.close()

哈哈,又是你好!

无法使用 tkinter 的文件对话框列出(或 select)远程计算机上的文件。您需要使用例如 SSHFS(如问题评论中所述)安装远程计算机的驱动器,或使用显示远程文件列表(在 stdout 变量中)的自定义 tkinter 对话框并让你选一个。

您可以自己编写对话框window,这里是一个快速演示:

from Tkinter import *


def double_clicked(event):
    """ This function will be called when a user double-clicks on a list element.
        It will print the filename of the selected file. """
    file_id = event.widget.curselection()  # get an index of the selected element
    filename = event.widget.get(file_id[0])  # get the content of the first selected element
    print filename

if __name__ == '__main__':
    root = Tk()
    files = ['file1.h264', 'file2.txt', 'file3.csv']

    # create a listbox
    listbox = Listbox(root)
    listbox.pack()

    # fill the listbox with the file list
    for file in files:
        listbox.insert(END, file)

    # make it so when you double-click on the list's element, the double_clicked function runs (see above)
    listbox.bind("<Double-Button-1>", double_clicked)

    # run the tkinter window
    root.mainloop()

没有 tkinter 的最简单解决方案是 - 您可以让用户使用 raw_input() 函数键入文件名。

有点像:

filename = raw_input('Enter filename to delete: ')
client.exec_command('rm {0}'.format(filename))

因此用户必须输入要删除的文件名;然后该文件名直接传递给 rm 命令。

这不是真正安全的方法 - 您绝对应该转义用户的输入。想象一下,如果用户键入 '-rf /*' 作为文件名会怎样。没有什么好处,即使您没有以 root 身份连接。
但是当你自己学习和保留剧本时,我想这没关系。