从 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 身份连接。
但是当你自己学习和保留剧本时,我想这没关系。
我正在 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 身份连接。
但是当你自己学习和保留剧本时,我想这没关系。