我想逐行将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
答案 0 :(得分:85)
我不太明白为什么要使用命令行参数而不是简单地从标准输入读取。 Python有一个简单的习惯用法,用于在stdin上迭代行:
import sys
for line in sys.stdin:
sys.stdout.write(line)
我的用法示例:
$ echo -e "first line\nsecond line" | python python_iterate_stdin.py
first line
second line
您的使用示例:
$ echo "days go by and still" | python python_iterate_stdin.py
days go by and still
答案 1 :(得分:4)
你想要的是popen
,它可以直接读取命令的输出,就像你读取文件一样:
import os
with os.popen('ps -ef') as pse:
for line in pse:
print line
# presumably parse line now
请注意,如果您想要更复杂的解析,您必须深入研究subprocess.Popen
的文档。
答案 2 :(得分:0)
另一种方法是使用input()
函数(该代码用于Python 3)。
while True:
try:
line = input()
print('The line is:"%s"' % line)
except EOFError:
# no more information
break
答案与博士获得的答案之间的区别。 Jan-Philip Gehrcke 是,现在每行末尾都没有换行符(\ n)。
答案 3 :(得分: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行上完成技巧