61

我想ps -ef逐行将输出传递给python。

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

#! /usr/bin/python

import sys

for line in sys.argv:
   print line

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

echo "days go by and still" | xargs first.py

我得到的输出是

./first.py
days
go
by
and
still

如何编写脚本以使输出为

./first.py
days go by and still

?

4

4 回答 4

146

我建议不要使用命令行参数,而是从标准输入( stdin) 中读取。Python 有一个简单的习惯用法来遍历行stdin

import sys

for line in sys.stdin:
    sys.stdout.write(line)

我的使用示例(上面的代码保存到iterate-stdin.py):

$ echo -e "first line\nsecond line" | python iterate-stdin.py 
first line
second line

用你的例子:

$ echo "days go by and still" | python iterate-stdin.py
days go by and still
于 2013-07-15T16:04:35.830 回答
11

你想要的是popen,它可以像读取文件一样直接读取命令的输出:

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

请注意,如果您想要更复杂的解析,则必须深入研究subprocess.Popen.

于 2017-04-03T21:56:32.580 回答
0

我知道这真的过时了,但你可以试试

#! /usr/bin/python
import sys
print(sys.argv, len(sys.argv))

if len(sys.argv) == 1:
    message = input()
else:
    message = sys.argv[1:len(sys.argv)]

print('Message:', message)

我因此对其进行了测试:

$ ./test.py
['./test.py'] 1
this is a test
Message: this is a test

$ ./test.py this is a test
['./test.py', 'this', 'is', 'a', 'test'] 5
Message: ['this', 'is', 'a', 'test']

$ ./test.py "this is a test"
['./test.py', 'this is a test'] 2
Message: ['this is a test']

$ ./test.py 'this is a test'
['./test.py', 'this is a test'] 2
Message: ['this is a test']

$ echo "This is a test" | ./test.py
['./test.py'] 1
Message: This is a test

或者,如果您希望消息每次都是一个字符串,那么

    message = ' '.join(sys.argv[1:len(sys.argv)])

会在第 8 行做到这一点

于 2020-12-10T10:18:06.200 回答
-1

另一种方法是使用input()函数(代码适用于 Python 3)。

while True:
        try:
            line = input()
            print('The line is:"%s"' % line)
        except EOFError:
            # no more information
            break

答案与Jan-Philip Gehrcke 博士得到的答案之间的区别在于,现在每行末尾都没有换行符 (\n)。

于 2020-07-15T13:43:42.117 回答