【问题标题】:How to specify path in directory tree structure如何在目录树结构中指定路径
【发布时间】:2017-03-20 16:14:25
【问题描述】:

来自子进程import Popen, PIPE

process = Popen(['/home/hadoop/BackupFolders/','tree','.','-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

您好,我正在尝试运行这些代码行,以显示像Linux/Unix 那样的目录树结构。我已经显示了树结构,但仅适用于当前工作目录。

每次我进入路径并运行时,它都会显示access denied。我将 shell 设置为 true 和 false,但它不起作用。

我希望能够显示当前工作目录,但也可以选择指定其他路径。

【问题讨论】:

    标签: python linux subprocess


    【解决方案1】:

    exec 在 unix 中通过传递参数字符串来工作,这样第一个参数是可执行文件的位置或名称,随后的参数通常是选项。在上面的示例中,您的可执行文件是“树”,但您将 /home/hadoop/BackupFolders/ 作为列表中的第一个元素,因此基本上 python 正在尝试 run BackupFolders 目录,这当然是没有意义的因此是一个错误。

    此外,通常标记. 表示当前工作目录,因此命令tree . -d 尝试使用选项-d 在当前工作目录上运行树。要从 cwd 更改目标目录,请更改 .范围。因此['tree','/home/hadoop/BackupFolders/','-d']tree /home/hadoop/BackupFolders/ -d

    还有一个警告——你很可能会在这件事上过头了。子进程 PIPE 上的内存是固定大小的,当您溢出该内存大小时,POpen 往往会挂起,因为一旦 stdout 流无法再写入管道,它就永远不会关闭。 tree 确实没有固定的返回大小,因此挂起的风险很大。用临时文件替换该管道并稍后读取输出。或者更好地从 stdout 读取并异步运行它。

    【讨论】:

    • 谢谢您,先生!非常感谢您的帮助,python 新手。
    • 很好的答案,除了 OP 使用 .communicate 来确保管道不会填满。只要输出不会占用可用内存,就不需要中间文件。
    • 通信正是导致挂起的原因,因为它在正在运行的进程关闭之前不会清除管道,它没有任何内部异步读取。
    • 这不是它的工作原理。 communicate 创建线程来读取 stdout 和 stderr 以便没有阻塞。这就是它存在的原因,可以安全地读取输出和错误流而不会出现死锁。
    • 其实不会。从 svn.python.org/projects/python/trunk/Lib/subprocess.py def _readerthread(self, fh, buffer): buffer.append(fh.read()) ... read 将阻塞,直到 eof 被放入流中以返回,因为这是用于消耗 stdout 和 stderr 的线程,这意味着在使用 eof 关闭流之前它不会读取。
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多