来自子流程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但它不起作用。
我希望能够显示当前的工作目录,但也可以选择指定其他路径。
答案 0 :(得分:0)
exec通过传递一串参数来工作,这样第一个参数就是可执行文件的位置或名称,以下参数通常是选项。在上面的示例中,您的可执行文件是' tree',但您有/home/hadoop/BackupFolders/
作为列表中的第一个元素,所以基本上python正在尝试运行 BackupFolders目录,这当然是无意义的错误。
此外,通常令牌.
表示当前工作目录,因此命令tree . -d
尝试使用选项-d在当前工作目录上运行树。要从cwd更改目标目录,请更改。参数。因此['tree','/home/hadoop/BackupFolders/','-d']
或tree /home/hadoop/BackupFolders/ -d
。
同样是一个警告 - 你可能会在这里过头。子进程PIPE上的内存是固定大小的,当你溢出内存大小时,POpen往往会挂起,因为stdout流程一旦无法再写入管道就永远不会关闭。树真的没有固定的返回大小,所以有很大的悬挂风险。用临时文件替换该管道并稍后读取输出。或者更好地从stdout线程化读取并异步运行它。