首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的Bash Backticks等效项

Python中的Bash Backticks等效项
EN

Stack Overflow用户
提问于 2009-09-11 13:47:53
回答 11查看 45.7K关注 0票数 88

在Python中,Ruby和Perl中的反引号对应的是什么?也就是说,在Ruby中我可以这样做:

代码语言:javascript
复制
foo = `cat /tmp/baz`

在Python中等价的语句是什么样子的?我尝试过os.system("cat /tmp/baz"),但它将结果标准化,并返回给我该操作的错误代码。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-09-11 13:53:48

代码语言:javascript
复制
output = os.popen('cat /tmp/baz').read()
票数 107
EN

Stack Overflow用户

发布于 2009-09-11 13:52:17

最灵活的方法是使用subprocess模块:

代码语言:javascript
复制
import subprocess

out = subprocess.run(["cat", "/tmp/baz"], capture_output=True)
print("program output:", out)

capture_output是在Python3.7中引入的,对于较老的版本,可以使用特殊的函数check_output()

代码语言:javascript
复制
out = subprocess.check_output(["cat", "/tmp/baz"])

如果您需要细粒度控制,也可以手动构造子流程对象:

代码语言:javascript
复制
proc = subprocess.Popen(["cat", "/tmp/baz"], stdout=subprocess.PIPE)
(out, err) = proc.communicate()

所有这些函数都支持keyword parameters自定义子流程的执行方式。例如,如果您需要*的文件名扩展之类的东西,您可以使用shell=True通过shell执行程序,但这是limitations附带的。

票数 85
EN

Stack Overflow用户

发布于 2009-09-11 14:00:11

sth is right。您也可以使用os.popen(),但在可用的地方(Python 2.4+)子过程通常更可取。

然而,与一些鼓励它的语言不同,它通常被认为是不好的形式来产生一个子进程,在这个子进程中,您可以在语言中完成相同的工作。它速度较慢,可靠性较差,且依赖于平台。您的示例可能会更好,因为:

代码语言:javascript
复制
foo= open('/tmp/baz').read()

预计到达时间:

baz是一个目录,我正在尝试获取该目录中所有文件的内容

?cat on a directory会给我一个错误。

如果您想要一个文件列表:

代码语言:javascript
复制
import os
foo= os.listdir('/tmp/baz')

如果您想要一个目录中所有文件的内容,如下所示:

代码语言:javascript
复制
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)

或者,如果您可以确保其中没有目录,您可以将其放在一行代码中:

代码语言:javascript
复制
path= '/tmp/baz'
foo= ''.join(open(os.path.join(path, child), 'rb').read() for child in os.listdir(path))
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1410976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档