Python中Bash反引号的等价物

89 投票
11 回答
51308 浏览
提问于 2025-04-15 14:15

在Ruby和Perl中,有一种用反引号(`)的写法,那么在Python中有什么类似的用法呢?也就是说,在Ruby中我可以这样做:

foo = `cat /tmp/baz`

那么在Python中,类似的写法是什么样的呢?我试过用 os.system("cat /tmp/baz"),但是这样做会把结果输出到标准输出,并且返回给我这个操作的错误代码。

11 个回答

28

有些东西是对的。你也可以使用 os.popen(),但如果可以的话(Python 2.4 及以上版本),一般推荐使用 subprocess。

不过,不像某些语言鼓励这样做,通常认为在可以用语言内部完成的情况下,启动一个子进程是不太好的做法。这会更慢、可靠性差,而且依赖于平台。你的例子可以改成:

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

补充说明:

baz 是一个目录,我想获取那个目录下所有文件的内容。

? 在目录上使用 cat 会报错。

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

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))
85

最灵活的方式是使用 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 来执行程序,但这样做会有一些 限制

112

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常会把它们转换成一种统一的格式。这样做的好处是,程序在处理这些数据时就不会出现混乱。

比如说,如果你有一个用户输入的日期,可能是“2023年10月1日”,而程序需要的是“2023-10-01”这种格式。我们就需要写一些代码来把它转换过来。这个过程叫做“数据格式化”。

另外,处理数据时还可能会遇到一些错误,比如用户输入了不合法的内容。这时候,我们需要检查这些数据是否符合要求,如果不符合,就要给用户一个提示,让他们重新输入。这个过程叫做“数据验证”。

总之,处理数据时,我们需要确保数据的格式正确,并且要检查数据的有效性,这样才能让程序顺利运行。

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

撰写回答