如何从 Python 程序中的命令行获取数据?
Posted
技术标签:
【中文标题】如何从 Python 程序中的命令行获取数据?【英文标题】:How to get data from command line from within a Python program? 【发布时间】:2012-01-03 07:03:54 【问题描述】:我想从 python 脚本中运行命令行程序并获取输出。
如何获取 foo 显示的信息以便在我的脚本中使用它?
例如,我从命令行调用foo file1
,它会打印出来
Size: 3KB
Name: file1.txt
Other stuff: blah
我怎样才能得到文件名,比如filename = os.system('foo file1')
?
【问题讨论】:
Executing command line programs from within python 的可能重复项 【参考方案1】:使用子流程模块:
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
的第2个和第3个参数是可选的,可以去掉。
【讨论】:
... 其中command
应该是['foo', 'file1', 'file2', ...]
。 +1。
谢谢!所以 foo 输出全部是文本......现在我将如何从中获取文件名?它像一个数组还是我可以获得文本[1]的东西?或者我可以通过它搜索“名称:”吗?还是从第 2 行字符第 7 行开始到换行符?
查看 re 模块并编写一个简单的正则表达式,将其拉入pat = re.compile(r'Name:\s+(.*)$') m = pat.search(text) if m: m.group(1)
(您需要添加一些换行符)
subprocess 和 PIPE 应该在 2.4 - docs.python.org/release/2.4/lib/node227.html 要忽略的标准错误丢失。
'module' 对象没有属性 'IGNORE'【参考方案2】:
获取通过 Python 脚本调用的工具的输出的最简单方法是使用标准库中的 subprocess 模块。看看subprocess.check_output。
>>> subprocess.check_output("echo \"foo\"", shell=True)
'foo\n'
(如果您的工具从不受信任的来源获取输入,请确保不要使用 shell=True
参数。)
【讨论】:
@PrakashPandey 已在此处回答:***.com/questions/23420990/…【参考方案3】:这通常是一个可以在 python 中运行的 bash 脚本的主题:
#!/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
在python2.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
【讨论】:
我对 bash 一无所知。如何在 Python 中使用它? 此解决方案仅适用于 Linux 或 Windows 如果您有 Cygwin en.wikipedia.org/wiki/Cygwin 如果您使用的是 Windows 或如果您想要一个便携式解决方案,请参阅我的新帖子【参考方案4】:这是纯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'])
【讨论】:
【参考方案5】:在 Python 中,您可以将带有空格、子引号和换行符的普通操作系统命令传递给 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 版本或操作系统存在问题。在本示例中,我在 Ubuntu 12.10 上使用 Python 2.7.3。
【讨论】:
【参考方案6】:参考https://docs.python.org/3/library/subprocess.html#subprocess.run
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)
这里的输出不会被编码 只是一个提示
【讨论】:
以上是关于如何从 Python 程序中的命令行获取数据?的主要内容,如果未能解决你的问题,请参考以下文章