【问题标题】:File Selection From Remote Machine In PythonPython中远程机器的文件选择
【发布时间】:2015-02-10 15:52:16
【问题描述】:

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

谁能指导我如何使用askopenfilename 命令或类似命令从远程机器中选择文件?

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()

【问题讨论】:

  • sshfs挂载远程文件系统,这样远程文件可以作为本地文件访问不是更可行吗?您似乎已经有了 ssh 访问权限。
  • @RafaelLerm 我该怎么做
  • @IrfanGhaffar7 这取决于您在计算机上使用的操作系统。例如,Google 上有 a manual for Windows 8。只需谷歌“如何在(您的操作系统)上安装 sshfs”。
  • 现在您有了指向sshfs 的指针,您可以尝试搜索它。搜索“mount sshfs”会给你带来很多其他好的结果,this page,这应该是足够的信息。

标签: python ubuntu tkinter selection paramiko


【解决方案1】:

哈哈,你好!

不可能使用 tkinter 的文件对话框来列出(或选择)远程机器上的文件。您需要使用例如 SSHFS(如问题评论中所述)安装远程机器的驱动器,或使用显示远程文件列表(即在 stdout 变量中)的自定义 tkinter 对话框并让您选择那个。

你可以自己写一个对话窗口,这里有一个快速演示:

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 身份连接。
但是,当您学习并保留脚本时,我想没关系。

【讨论】:

  • 但实际上在askforfilename 中,我只需要选择它而不是输入文件名即可删除。我的文件名很长而且很典型,所以我想使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 2017-10-23
  • 2017-02-10
相关资源
最近更新 更多