Python中Bash反引号的等价物
在Ruby和Perl中,有一种用反引号(`)的写法,那么在Python中有什么类似的用法呢?也就是说,在Ruby中我可以这样做:
foo = `cat /tmp/baz`
那么在Python中,类似的写法是什么样的呢?我试过用 os.system("cat /tmp/baz")
,但是这样做会把结果输出到标准输出,并且返回给我这个操作的错误代码。
11 个回答
有些东西是对的。你也可以使用 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))
最灵活的方式是使用 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 来执行程序,但这样做会有一些 限制。
在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常会把它们转换成一种统一的格式。这样做的好处是,程序在处理这些数据时就不会出现混乱。
比如说,如果你有一个用户输入的日期,可能是“2023年10月1日”,而程序需要的是“2023-10-01”这种格式。我们就需要写一些代码来把它转换过来。这个过程叫做“数据格式化”。
另外,处理数据时还可能会遇到一些错误,比如用户输入了不合法的内容。这时候,我们需要检查这些数据是否符合要求,如果不符合,就要给用户一个提示,让他们重新输入。这个过程叫做“数据验证”。
总之,处理数据时,我们需要确保数据的格式正确,并且要检查数据的有效性,这样才能让程序顺利运行。
output = os.popen('cat /tmp/baz').read()