从远程IPython笔记本服务器检索文件?

22

如果我不想向远程IPython笔记本服务器的用户提供SSH访问权限,有没有一种方法可以让用户浏览非 .ipynb 文件并下载它们?

2个回答

42

你可以使用内置的FileLinkFileLinks

from IPython.display import FileLink, FileLinks
FileLinks('.') #lists all downloadable files on server

以上代码生成:

./
some_python_file.py
some_xml_file.xml
some_ipynb_file.ipynb

上面的三个项目是可以点击下载的链接。

点击此处查看ipython.org的示例


如何下载所有文件并保留它们的原始文件夹层次结构,而无需逐个点击每个项目? - Jason

1

很遗憾,由于边缘情况原因FileLink无法处理Jupyter目录外的文件。 但是,您可以通过先创建一个链接来解决此问题:

os.symlink( file_name, "tmp.txt" )
display( FileLink( "tmp.txt" ) )

实际上,上述解决方法在磁盘上保留了链接。它还假定所有内容都带有“txt”扩展名。我们可能想要清理之前的链接以避免混乱目录,并且不重命名下载的文件。这里是一种解决方案,每次只保留一个链接并保留基本名称:
def download_file( file_name : str ) -> None:
    import os
    from IPython.display import display, FileLink
    
    base_name : str = os.path.basename( file_name )
    k_info_file : str = ".download_file_info.txt"
    
    # Remove previous link
    if os.path.isfile( k_info_file ):
        with open( k_info_file, "r" ) as fin:
            previous_file = fin.read()
        
        if os.path.isfile( previous_file ):
            print( "Removing previous file link." )
            os.remove( previous_file )
    
    # Remember current link
    with open( k_info_file, "w" ) as fout:
        fout.write( base_name )
    
    # Create the link
    assert not os.path.isfile( base_name ), "Name in use."
    os.symlink( file_name, base_name )
    
    # Return the link
    display( FileLink( base_name ) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接