Python Fabric:如何检索目录的文件列表

Posted

技术标签:

【中文标题】Python Fabric:如何检索目录的文件列表【英文标题】:Python Fabric: How to retrieve a filelist of a dir 【发布时间】:2011-10-01 11:29:09 【问题描述】:

我正在使用 python-fabric 库构建远程服务器管理工​​具,并且正在寻找一种为远程服务器上的目录检索文件列表的好方法。目前我正在使用 run("ls dir") 并手动拆分返回字符串,这看起来很可怕并且非常依赖于架构。 fabric.contrib.files 似乎没有任何用处..

非常感谢您的建议。

干杯, 回复

【问题讨论】:

fabric 维护者的“官方”答案是将fabric 视为shell 命令的传递。因此,当前执行此操作的方法是使用“ls”命令。此外,“ls -l”应该每行输出一个文件,使处理更容易.. 首先,您询问如何获取远程文件列表 - 通过指定 Fabric,您还指定了 SSH,这隐含地表示 UNIX shell。然后在其他地方评论最佳答案(jathanism)取决于环境是错误的。如果你有一个运行 SSH 的 OS X、Linux 甚至是一个 WINDOWS 机器——那么“ls -l”就可以了。严格来说, ls -l 不是架构的功能(如您所建议的),它甚至不是操作系统的功能。 ls 是 sh 兼容 shell 的内置程序,它存在于包括 Windows 在内的所有平台上。当然可以在任何 SSH shell 上。 【参考方案1】:

这是怎么回事?

output = run('ls /path/to/files')
files = output.split()
print files

查看documentation on run() 了解更多技巧。

【讨论】:

它的错误在于“ls”的输出完全取决于您使用的环境,因此它不是您想要的架构独立。 您要支持多少种系统类型?对输出进行有条件的处理可能会更好。还有ls -1(每行列出一个文件)在所有基于 POSIX 的系统上的行为应该相同。 我以前用过这个技巧,但是看了this之后我不确定这是不是最好的解决方案。 了解 jpihl 的链接很重要,但请注意,针对解析“ls”的警示故事是本地代码场景。如果您可以避免解析 ls,请这样做。但是,如果您需要执行远程 ls,那么您别无选择,只能解析 ls 或者您可以通过 scp 处理更安全的文件并运行该文件。但是我们很多运行 Fabric 的人没有在运行这些脚本之前将脚本移动到盒子上的奢侈。正如原始问题所要求的那样,这样做并不能解决 Fabric 中的问题。【参考方案2】:

我认为最好的方法是编写一个 BASH(其他 shell 的行为类似)oneliner。检索目录中的文件列表。

for i in *; do echo $i; done

所以返回绝对路径的完整解决方案:

from fabric.api import env, run, cd

env.hosts = ["localhost"]
def list_dir(dir_=None):
    """returns a list of files in a directory (dir_) as absolute paths"""
    dir_ = dir_ or env.cwd
    string_ = run("for i in %s*; do echo $i; done" % dir_)
    files = string_.replace("\r","").split("\n")
    print files
    return files

def your_function():
    """docstring"""
    with cd("/home/"):
        list_dir()

【讨论】:

以上是关于Python Fabric:如何检索目录的文件列表的主要内容,如果未能解决你的问题,请参考以下文章

python第五十二天---第九周作业 类 Fabric 主机管理程序

如何检索特定目录中的.wav文件列表[重复]

Hyperledger Fabric 智能合约实战 安装fabric

如何使用fabric从twitter webview中检索登录回调

如何只从Python3中的列表中检索链接? [初学者]

Tungsten Fabric架构解析丨TF支持API一览