我想在Python脚本中运行命令行程序并获取输出。
如何获取foo显示的信息,以便我可以在我的脚本中使用它?
例如,我从命令行调用foo file1
,它会打印出:
Size: 3KB
Name: file1.txt
Other stuff: blah
我该如何获取文件名,例如执行代码 filename = os.system('foo file1')
后得到文件名?我想在Python脚本中运行命令行程序并获取输出。
如何获取foo显示的信息,以便我可以在我的脚本中使用它?
例如,我从命令行调用foo file1
,它会打印出:
Size: 3KB
Name: file1.txt
Other stuff: blah
我该如何获取文件名,例如执行代码 filename = os.system('foo file1')
后得到文件名?使用subprocess模块:
import subprocess
command = ['ls', '-l']
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.IGNORE)
text = p.stdout.read()
retcode = p.wait()
那么你可以对变量text
进行任何想做的操作:正则表达式,分割等。
subprocess.Popen
的第二个和第三个参数是可选的,可以被移除。
['foo', 'file1', 'file2', ...]
作为command
参数。+1。 - Fred Foopat = re.compile(r'Name:\s+(.*)$') m = pat.search(text) if m: m.group(1)
(您需要添加一些换行符) - koblas通过你的Python脚本调用工具并获取输出最简单的方法是使用标准库中的subprocess模块。请查看subprocess.check_output。
>>> subprocess.check_output("echo \"foo\"", shell=True)
'foo\n'
如果您的工具从不可信来源获取输入,请确保不使用shell=True
参数。
这通常是一个bash脚本的主题,您可以在Python中运行:
#!/bin/bash
# vim:ts=4:sw=4
for arg; do
size=$(du -sh "$arg" | awk '{print $1}')
date=$(stat -c "%y" "$arg")
cat<<EOF
Size: $size
Name: ${arg##*/}
Date: $date
EOF
done
编辑:如何使用:打开伪终端,然后复制粘贴以下内容:
cd
wget http://pastie.org/pastes/2900209/download -O info-files.bash
在 Python 2.4 中:
import os
import sys
myvar = ("/bin/bash ~/info-files.bash '{}'").format(sys.argv[1])
myoutput = os.system(myvar) # myoutput variable contains the whole output from the shell
print myoutput
from subprocess import run
o = run("python q2.py",capture_output=True,text=True)
print(o.stdout)
输出将被编码
from subprocess import run
o = run("python q2.py",capture_output=True)
print(o.stdout)
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)
在这里,输出不会被编码 只是一个提示
subcommand
模块中,以便我们可以解析响应文本,如下所示:
将以下代码保存为test.py:
#!/usr/bin/python
import subprocess
command = ('echo "this echo command' +
' has subquotes, spaces,\n\n" && echo "and newlines!"')
p = subprocess.Popen(command, universal_newlines=True,
shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
text = p.stdout.read()
retcode = p.wait()
print text;
然后像这样运行它:
python test.py
输出结果如下:
this echo command has subquotes, spaces,
and newlines!
这是一个纯Python的便携式解决方案:
import os
import stat
import time
# pick a file you have ...
file_name = 'll.py'
file_stats = os.stat(file_name)
# create a dictionary to hold file info
file_info = {
'fname': file_name,
'fsize': file_stats [stat.ST_SIZE],
'f_lm': time.strftime("%m/%d/%Y %I:%M:%S %p",time.localtime(file_stats[stat.ST_MTIME])),
}
print("""
Size: {} bytes
Name: {}
Time: {}
"""
).format(file_info['fsize'], file_info['fname'], file_info['f_lm'])