在Python中,Ruby和Perl中的反引号对应的是什么?也就是说,在Ruby中我可以这样做:
foo = `cat /tmp/baz`在Python中等价的语句是什么样子的?我尝试过os.system("cat /tmp/baz"),但它将结果标准化,并返回给我该操作的错误代码。
发布于 2009-09-11 13:53:48
output = os.popen('cat /tmp/baz').read()发布于 2009-09-11 13:52:17
最灵活的方法是使用subprocess模块:
import subprocess
out = subprocess.run(["cat", "/tmp/baz"], capture_output=True)
print("program output:", out)capture_output是在Python3.7中引入的,对于较老的版本,可以使用特殊的函数check_output():
out = subprocess.check_output(["cat", "/tmp/baz"])如果您需要细粒度控制,也可以手动构造子流程对象:
proc = subprocess.Popen(["cat", "/tmp/baz"], stdout=subprocess.PIPE)
(out, err) = proc.communicate()所有这些函数都支持keyword parameters自定义子流程的执行方式。例如,如果您需要*的文件名扩展之类的东西,您可以使用shell=True通过shell执行程序,但这是limitations附带的。
发布于 2009-09-11 14:00:11
sth is right。您也可以使用os.popen(),但在可用的地方(Python 2.4+)子过程通常更可取。
然而,与一些鼓励它的语言不同,它通常被认为是不好的形式来产生一个子进程,在这个子进程中,您可以在语言中完成相同的工作。它速度较慢,可靠性较差,且依赖于平台。您的示例可能会更好,因为:
foo= open('/tmp/baz').read()预计到达时间:
baz是一个目录,我正在尝试获取该目录中所有文件的内容
?cat on a directory会给我一个错误。
如果您想要一个文件列表:
import os
foo= os.listdir('/tmp/baz')如果您想要一个目录中所有文件的内容,如下所示:
contents= []
for leaf in os.listdir('/tmp/baz'):
path= os.path.join('/tmp/baz', leaf)
if os.path.isfile(path):
contents.append(open(path, 'rb').read())
foo= ''.join(contents)或者,如果您可以确保其中没有目录,您可以将其放在一行代码中:
path= '/tmp/baz'
foo= ''.join(open(os.path.join(path, child), 'rb').read() for child in os.listdir(path))https://stackoverflow.com/questions/1410976
复制相似问题