如何在不执行任何命令的情况下用python读取控制台输出



我有一个API,它在控制台上获得成功或错误消息。我是python的新手,并试图阅读响应。谷歌抛出了很多例子来使用子进程,但我不想运行,调用任何命令或子进程。我只是想阅读下面API调用后的输出。

这是当success

时控制台的响应17:50:52 |登录了!!

这是sdk和文档的github链接https://github.com/5paisa/py5paisa

这是代码
from py5paisa import FivePaisaClient
email = "myemailid@gmail.com"
pw = "mypassword"
dob = "mydateofbirth"
cred={
"APP_NAME":"app-name",
"APP_SOURCE":"app-src",
"USER_ID":"user-id",
"PASSWORD":"pw",
"USER_KEY":"user-key",
"ENCRYPTION_KEY":"enc-key"
}
client = FivePaisaClient(email=email, passwd=pw, dob=dob,cred=cred)
client.login()

一般来说,从STDOUT获取值是不好的做法。有一些方法,但相当棘手(它不是为它而生的)。问题不是来自你,而是来自错误设计的API,它应该返回一个值,例如TrueFalse(至少)来告诉你是否登录,而他们不这样做。

所以,根据他们的文档,这是不可能知道你是否登录,但你可以看到如果你登录通过检查属性client_code在客户端对象。

如果client.client_code等于某个东西,那么它应该登录,如果它等于其他东西,那么不应该登录。您可以尝试在成功登录或失败(例如错误的凭据)时比较它的值。然后你可以设置一个条件:如果它是NoneFalse0(你必须自己看到这个),那么它失败了。

您可以尝试在成功和失败的登录中执行以下操作吗?

client.login()
print(client.client_code)

API来源:

# Login function :
# (...)
message = res["body"]["Message"]
if message == "":
log_response("Logged in!!")
else:
log_response(message)
self._set_client_code(res["body"]["ClientCode"])
# (...)
# _set_client_code function :
def _set_client_code(self, client_code):
try:
self.client_code = client_code   # <<<< That's what we want
except Exception as e:
log_response(e)

既然这个问题问如何捕获"stdout"实现这一点的一种方法是在日志消息到达标准输出之前拦截它。在Python脚本中捕获日志消息的最小代码如下所示:

#!/usr/bin/env python3
import logging
logger = logging.getLogger(__name__)

class RequestHandler(logging.Handler):
def emit(self, record):
if record.getMessage().startswith("Hello"):
print("hello detected")
handler = RequestHandler()
logger.addHandler(handler)
logger.warning("Hello world")

把它们放在一起,你可能会做这样的事情:

import logging
from py5paisa import FivePaisaClient
email = "myemailid@gmail.com"
pw = "mypassword"
dob = "mydateofbirth"
cred={
"APP_NAME":"app-name",
"APP_SOURCE":"app-src",
"USER_ID":"user-id",
"PASSWORD":"pw",
"USER_KEY":"user-key",
"ENCRYPTION_KEY":"enc-key"
}
client = FivePaisaClient(email=email, passwd=pw, dob=dob,cred=cred)

class PaisaClient(logging.Handler):
def __init__():
self.loggedin = False  # this is the variable we can use to see if we are "logged in"
def emit(self, record):
if record.getMessage().startswith("Logged in!!")
self.loggedin = True
def login():
client.login()
logging.getLogger(py5paisa) # get the logger for the py5paisa library
# tutorial here: https://betterstack.com/community/questions/how-to-disable-logging-from-python-request-library/
logging.basicConfig(handlers=[PaisaClient()], level=0, force=True)
c = PaisaClient()
c.login()

相关内容

  • 没有找到相关文章