相当于Python中的Bash反引号

Chr*_*nch 79 python backticks

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

foo = `cat /tmp/baz`
Run Code Online (Sandbox Code Playgroud)

Python中的等效语句是什么样的?我已经尝试os.system("cat /tmp/baz")但是将结果置于标准输出并返回给我该操作的错误代码.

Joh*_*ica 92

output = os.popen('cat /tmp/baz').read()
Run Code Online (Sandbox Code Playgroud)

  • @mckenzm问题是关于捕获外部进程的输出.捕获Python函数的输出将是一个完全不同的问题. (4认同)

sth*_*sth 82

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

import subprocess

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

如果要通过shell传递调用,例如要capture_output使用扩展文件名,可以使用该check_output()参数.如果你这样做,你必须提供一个字符串引用命令,引用/ ...就像你在shell提示符下输入它一样:

out = subprocess.check_output(["cat", "/tmp/baz"])
Run Code Online (Sandbox Code Playgroud)

  • re:"*"不起作用; 请改用subprocess.Popen(["cat","/ tmp/baz"],stdout = subprocess.PIPE,shell = True).由于glob(星型)扩展由shell处理,因此在这种情况下,子处理模块必须使用shell扩展(由/ bin/sh提供). (6认同)
  • 是的,这是唯一理智的方式,你可以把它包装在一个函数中,这样你就可以调用execute("command")之类的东西 (2认同)

bob*_*nce 26

某事是对的.您也可以使用os.popen(),但在可用的情况下(Python 2.4+)子进程通常更可取.

但是,与一些鼓励它的语言不同,产生子进程通常被认为是不好的形式,你可以在语言中做同样的工作.它更慢,更不可靠,并且依赖于平台.你的例子会更好:

foo= open('/tmp/baz').read()
Run Code Online (Sandbox Code Playgroud)

ETA:

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

?目录上的猫给我一个错误.

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

import os
foo= os.listdir('/tmp/baz')
Run Code Online (Sandbox Code Playgroud)

如果您想要目录中所有文件的内容,例如:

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)
Run Code Online (Sandbox Code Playgroud)

或者,如果你可以确定那里没有目录,你可以将它放在一个单行中:

path= '/tmp/baz'
foo= ''.join(open(os.path.join(path, child), 'rb').read() for child in os.listdir(path))
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 15

foo = subprocess.check_output(["cat", "/tmp/baz"])
Run Code Online (Sandbox Code Playgroud)

  • 这是现在最直接的方式.在获得其他"popen"答案之后,2010年7月发布的Python 2.7中添加了"subprocess.check_output". (3认同)

ger*_*rit 9

从Python 3.5开始,推荐的方法是使用subprocess.run.要获得与您描述的相同的行为,您将使用:

output = subprocess.run("ls", shell=True, stdout=subprocess.PIPE).stdout
Run Code Online (Sandbox Code Playgroud)

这将返回一个bytes对象.你可能想要追加.decode("ascii")或者.decode("utf-8")到最后得到一个str.


Bal*_*san 6

最简单的方法是使用命令包.

import commands

commands.getoutput("whoami")
Run Code Online (Sandbox Code Playgroud)

输出:

'bganesan'

  • 很简单,但该模块现已弃用. (6认同)