如何从Python程序中的命令行获取数据?

How to get data from command line from within a Python program?

我想从一个python脚本中运行一个命令行程序并获得输出。

如何获取foo显示的信息,以便在脚本中使用它?

例如,我从命令行调用foo file1,它会打印出来

1
2
3
Size: 3KB
Name: file1.txt
Other stuff: blah

我怎样才能让文件名像filename = os.system('foo file1')这样?


使用子进程模块:

1
2
3
4
5
6
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参数是可选的,可以被删除。


在最简单的方式来获得输出为一通孔的工具是使用Python脚本中使用的标准库模块。有一个看subprocess.check _输出。

1
2
3
>>> subprocess.check_output("echo "foo"", shell=True)
'foo
'

(如果你得到来自不可信来源的输入工具,确保不使用shell=True论点。)


这是一个bash脚本通常a主题:在Python中,你可以运行

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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

编辑:如何使用它:打开一pseuso终端,然后复制粘贴本:

1
2
cd
wget http://pastie.org/pastes/2900209/download -O info-files.bash

在python2.4:

1
2
3
4
5
6
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


在Python中,你可以通过一个操作系统命令subquotes平原和newlines到空间,所以我们subcommandCAN模块的响应文本解析:样本

  • 本test.py保存为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/python
    import subprocess

    command = ('echo"this echo command' +
    ' has subquotes, spaces,

    " && 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;
  • 然后运行它像这样:

    1
    python test.py
  • 这照片:

    1
    2
    3
    4
    this echo command has subquotes, spaces,


    and newlines!
  • 如果这不是为你工作,它可能是一个麻烦的Python版本或操作系统。我使用Ubuntu(12.10这在Python的例子。


    这是一个便携式的解决方案:在纯Python

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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'])