【问题标题】:How to get data from command line from within a Python program?如何从 Python 程序中的命令行获取数据?
【发布时间】:2012-01-03 07:03:54
【问题描述】:

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

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

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

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

我怎样才能得到文件名,比如filename = os.system('foo file1')

【问题讨论】:

标签: python command-line pipe


【解决方案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 参数。)

【讨论】:

【解决方案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 模块,这样我们就可以像这样解析响应文本:

    1. 将其保存到 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;
      
    2. 然后像这样运行它:

      python test.py 
      
    3. 哪些打印:

      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)
      

      这里的输出不会被编码 只是一个提示

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 2011-06-04
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        相关资源
        最近更新 更多