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 主机管理程序
Hyperledger Fabric 智能合约实战 安装fabric