如何从linux程序逐行输入到python的输入?

Cod*_*lue 45 python pipe

我想ps -ef逐行管道输出到python.

我使用的脚本是这个(first.py) -

#! /usr/bin/python

import sys

for line in sys.argv:
   print line
Run Code Online (Sandbox Code Playgroud)

不幸的是,"行"被分成由空格分隔的单词.所以,例如,如果我这样做

echo "days go by and still" | xargs first.py
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

./first.py
days
go
by
and
still
Run Code Online (Sandbox Code Playgroud)

如何编写输出的脚本

./first.py
days go by and still
Run Code Online (Sandbox Code Playgroud)

Jan*_*cke 97

我不太明白你为什么要使用命令行参数而不是简单地从标准输入读取.Python有一个简单的习惯用于迭代stdin上的行:

import sys

for line in sys.stdin:
    sys.stdout.write(line)
Run Code Online (Sandbox Code Playgroud)

我的用法示例:

$ echo -e "first line\nsecond line" | python python_iterate_stdin.py 
first line
second line
Run Code Online (Sandbox Code Playgroud)

你的用法示例:

$ echo "days go by and still" | python python_iterate_stdin.py
days go by and still
Run Code Online (Sandbox Code Playgroud)

  • 操作系统对程序可以处理的命令行参数的数量施加了限制。`xargs`确保由`xargs`的第一个参数定义的程序永远不会被调用超过此限制所定义的args。如果需要,它将简单地多次调用该程序,以便处理所有参数。因此,对于大量输入,您的Python程序可能会多次“独立”运行。通常,命令行参数不是提供大量输入数据的地方。 (3认同)
  • 你如何检查用户/调用者是否真的通过管道输入了一些东西,或者只是输入了`python ./python_iterate_stdin.py`? (2认同)

Vin*_*ond 7

您想要的是popen,这使得可以像读取文件一样直接读取命令的输出:

import os
with os.popen('ps -ef') as pse:
    for line in pse:
        print line
        # presumably parse line now
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想进行更复杂的分析,则必须深入研究的文档subprocess.Popen