如何在另一个程序中使用控制台的运行输出

时间:2019-01-10 01:22:26

标签: python terminal

我正在从命令行运行程序。该程序将打印出我的一些CPU统计信息(如果有兴趣,请链接到程序:https://github.com/opcm/pcm)。该程序不会退出。它将在同一终端上定期打印更新的统计信息。

我正在尝试使用该统计信息在我正在编写的另一个程序中检索该程序。我正在编写的程序只是应该在python中实时绘制这些CPU统计信息与时间 的关系图。

我不确定如何实时检索和使用程序中打印到控制台的统计信息。我知道我可以通过输入import React from 'react' import axios from 'axios' // import { H3, P } from '../../components/StyledHeading' // import Button from '../../components/Button' class ContactForm extends React.Component { constructor(props) { super(props) this.state = { firstName: '', lastName: '', email: '', phone: '', zipCode: 29006, errors: [], } } SendLead = payload => { const URL = "http://localhost:3001/v1" const authToken = "Token token=5e2pJ5P234234123" const config = { "headers": { Authorization: authToken } } const bodyParams = payload axios.post(`${URL}/leads`, bodyParams, config) .then(res => console.log({res})) .catch(error => { console.log({error}) this.setState({ errors: error.response.data, }) }) } _handleInputChange = e => this.setState({ [e.target.name]: e.target.value }) _handleSubmit = evt => { evt.preventDefault() const { firstName, lastName, email, phone, zipCode } = this.state; const payload = { "first_name": firstName, "last_name": lastName, "email": email, "phone": phone, "zip_code": zipCode, } this.SendLead(payload) } render() { const { firstName, lastName, email, phone, zipCode } = this.state; return ( <form onSubmit={this._handleSubmit}> <h3>Ready to reserve your spot?</h3> <p className="subtitle">Fill out the form below and we&rsquo;ll get in touch soon.</p> <div className="inputFieldSection"> <label> First Name: <input type="text" value={firstName} onChange={this._handleInputChange} // disabled={isSending} name="firstName" placeholder="Thomas" /> </label> <label> Last Name: <input type="text" value={lastName} onChange={this._handleInputChange} // disabled={isSending} name="lastName" placeholder="Edison" /> </label> <label> Phone Number: <input type="text" value={phone} onChange={this._handleInputChange} // disabled={isSending} name="phone" placeholder="555-555-5555" /> </label> <label> Email address: <input type="text" value={email} onChange={this._handleInputChange} // disabled={isSending} name="email" placeholder="edison@email.com" /> </label> <input type="hidden" name="zipCode" value={29006} /> </div> <button type="submit">Submit My Reservation</button> </form> ) } } export default ContactForm 将输出定向到文本文件而不是控制台。

我的第一个想法是将输出的统计信息推送到文本文件,并同时在程序中读取该文本文件。但这感觉像是一种蛮力方法,我不确定它是否会起作用。

有人知道我如何在另一个程序中使用一个程序的实时输出吗?

3 个答案:

答案 0 :(得分:1)

您可以通过多种方式获得此结果。

在UNIX系统上,我认为最简单的方法是使用管道 假设您有program1(p1)输出一些数据,而program2(p2)则读取并使用这些数据。

您可以按照@Charles Landau的建议,使用|将p1的输出传递给p2,这将在两个程序的stdout和stdin之间创建一条管道。

./p1 | p2

如果您还希望可视化p1的输出,则可以使用tee来获取标准输入并将其分叉到标准输出和程序中

./p1 | tee p2

现在,仅当您打算同时启动p1和p2时才有效(这时相信将其设为单个程序会更好)。 管道的更通用用法是p1创建命名管道(FIFO),p2从该管道读取:

p1.py(服务器)

import os
from random import randint
import time

FIFO="/tmp/test_fifo"

if not os.path.exists(FIFO):
    os.mkfifo(FIFO)

pipe = os.open( FIFO, os.O_RDWR) #I use this to avoid the program hanging on this step.
                                 #When you open a FIFO, the behavior is blocking, meaning that the program will hang until both end (r/w) of the pipe are being used
f = os.fdopen( pipe, "w")        #Then i want a file object so i can flush it

while 1:
    # Do operation
    output = randint(0,999999)
    # Print output
    print(output)

    # Send output into pipe
    f.flush()
    f.write( str(output) + '\n')
    time.sleep(0.5)

f.close()
pipe.close()

os.unlink(FIFO)

p2.py(客户端)

import os
import sys

FIFO="/tmp/test_fifo"

if not os.path.exists(FIFO):
    exit()

f = open( FIFO, "r")

while 1:
    read_fifo = f.readline()
    print( read_fifo, end='')
    sys.stdout.flush()

您也可以使用Shell在Linux上对FIFO进行一些简单的测试

mkfifo 1
shell1: tail -f 1
shell2: echo "Hello!" > 1

以类似的方式,您可以将TCP协议用于2个程序进行通信 有关此方法的更多信息,请参见python https://docs.python.org/3/library/socket.html

答案 1 :(得分:0)

听起来像您想要管道。管道采用程序的标准输出,并将其直接传递给下一个。我能想到的最简单的例子:

ls | grep ".bin"

很容易记住,因为管道运算符有点像管道|

有关管道的更多信息:http://web.cse.ohio-state.edu/~mamrak.1/CIS762/pipes_lab_notes.html

编辑:使用sys.stdin永远读取管道here

要采取的重要模式就在这里:

import sys
while True:
    line = sys.stdin.readline()
    # do something with line

答案 2 :(得分:0)

您可以在python中制作类似于tail的内容。这是代码示例,但是如果文件被删除将无法处理。

def tail_F(some_file):
    while True:
        try:
            for line in sh.tail("-f", some_file, _iter=True):
                yield line
                # do whatever with new line
        except sh.ErrorReturnCode_1:
            yield None