如何从 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 程序中的命令行获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从命令行获取设备的 iOS 版本?

使用 python,我如何从 csv 中获取唯一行,但获取合并了哪些行(或行中的值)的记录?

Python从菜鸟到高手:获取用户输入函数与注释

Python从菜鸟到高手:获取用户输入函数与注释

显示从 ASP.NET MVC 中的命令行进程获取的数据

如何从命令行获取 nvidia 驱动程序版本?