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

foo = `cat /tmp/baz`

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

有帮助吗?

解决方案

output = os.popen('cat /tmp/baz').read()

其他提示

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

import subprocess

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

capture_output 是在Python 3.7中引入的,对于旧版本,可以使用特殊函数 check_output()

out = subprocess.check_output(["cat", "/tmp/baz"])

如果需要精细控制,也可以手动构建子进程对象:

proc = subprocess.Popen(["cat", "/tmp/baz"], stdout=subprocess.PIPE)
(out, err) = proc.communicate()

所有这些功能都支持关键字参数自定义子进程的执行方式。例如,你可以使用 shell = True 来通过shell执行程序,如果你需要像 * 这样的文件名扩展,但是它带有限制

某事是对的。您也可以使用os.popen(),但通常可以使用(Python 2.4+)子进程。

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

foo= open('/tmp/baz').read()

ETA:

  

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

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

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

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))
foo = subprocess.check_output(["cat", "/tmp/baz"])

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

output = subprocess.run("ls", shell=True, stdout=subprocess.PIPE).stdout

这将返回 bytes 对象。您可能希望将 .decode(" ascii") .decode(" utf-8")附加到结尾以获取 str

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

import commands

commands.getoutput("whoami")

输出:

  

'bganesan'

import os
foo = os.popen('cat /tmp/baz', 'r').read()

我正在使用

  

(6:0)$ python --version   Python 2.7.1

上面的一个例子是:

import subprocess
proc = subprocess.Popen(["cat", "/tmp/baz"], stdout=subprocess.PIPE, shell=True)
(out, err) = proc.communicate()
print "program output:", out

对我来说,这无法访问目录/ tmp。查看子进程的doc字符串后,我替换了

  

[" prog"," arg"]

  

“prog arg”

并获得了所需的shell扩展行为(一个Perl的'prog arg`)

  

print subprocess.Popen(" ls -ld / tmp / v *",stdout = subprocess.PIPE,shell = True).communicate()[0]


我暂时退出使用python,因为我很难做到相当于perl`cmd ...`的困难。我很高兴发现Python已经做到了这一点。

如果您使用subprocess.Popen,请记住指定bufsize。默认值为0,表示“未缓冲”,而不是“选择合理的默认值”。

这在python3中不起作用,但在python2中,您可以使用自定义 __ repr __ 方法扩展 str ,该方法调用shell命令并返回如下:

#!/usr/bin/env python

import os

class Command(str):
    """Call system commands"""

    def __repr__(cmd):
        return os.popen(cmd).read()

你可以使用

#!/usr/bin/env python
from command import Command

who_i_am = `Command('whoami')`

# Or predeclare your shell command strings
whoami = Command('whoami')
who_i_am = `whoami`

反引号(`)运算符 Python 3 中已删除 。它与单引号容易混淆,很难在某些键盘上输入。而不是反引号,使用等效的内置函数 <代码>再版()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top