我正在为我知道存在的特定文件运行find命令。我想获取该文件的路径,因为我不想假设我知道文件的位置。我的理解是我需要重定向stdout,运行命令并捕获输出,重新连接标准输出,然后检索结果。检索结果时会出现问题...我无法解读它们:
import os
from cStringIO import StringIO
stdout_backup = sys.stdout #Backup standard output
stdout_output = StringIO()
sys.stdout = stdout_output #Redirect standard output
os.system("find . -name 'foobar.ext' -print") #Find a known file
sys.stdout = stdout_backup #re-hook-up standard output as top priority
paths_to_file = stdout_ouput.get_value() #Retrieve results
我找到了我想要的所有路径,麻烦的是paths_to_file产生了这个:
Out[9]: '\n\x01\x1b[0;32m\x02In [\x01\x1b[1;32m\x027\x01\x1b[0;32m\x02]: \x01\x1b[0m\x02\n\x01\x1b[0;32m\x02In [\x01\x1b[1;32m\x028\x01\x1b[0;32m\x02]: \x01\x1b[0m\x02'
我不知道该怎么做。我想要的是类似于print命令提供的内容:
./Work/Halpin Programs/Servers/selenium-server.jar
如何使该输出可用于打开文件?如果我能得到print命令,我可以打开我想要的文件。
如果我被误导,请重新调整问题的方向。谢谢!
答案 0 :(得分:2)
您无法通过更改sys.stdout
来捕获子流程的输出。您捕获的内容似乎是来自交互式Python解释器(IPython?)的一些ANSI转义序列。
要获取外部命令的输出,您应该使用subprocess.check_output()
:
paths = subprocess.check_output(["find", ".", "-name", "foobar.ext"])
在这种特殊情况下,我通常根本不会调用外部命令,而是使用os.walk()
从Python进程中直接找到文件。
修改:以下是使用os.walk()
查找文件的方法:
def find(path, pattern):
for root, dirs, files in os.walk(path):
for match in fnmatch.filter(files, pattern):
yield os.path.join(root, match)
paths = list(find(".", "foobar.ext"))