gpt4 book ai didi

Python StringIO - 有选择地将数据放入标准输入

转载 作者:行者123 更新时间:2023-12-01 05:53:17 35 4
gpt4 key购买 nike

我们正在使用一些我们没有源代码的编译Python代码。该代码提示用户输入,我们正在尝试自动化该部分。

基本上要求输入用户名、密码,然后根据特定情况询问一些不同的问题。我不知道编译后的函数是使用raw_input、input还是其他什么。

我已经能够使用 StringIO 来替换 stdin w/用户名和密码,并且我可以用我自己的类替换 stdout 并找出出现的提示,但是当涉及到有选择地放置数据时,我感到很困惑根据我从标准输出读取的内容进入标准输入。

import sys
import re
from StringIO import StringIO

def test():
overwrite = raw_input("The file exists, overwrite? ")
notify = raw_input("This file is marked for notifies. Notify?")
sys.stdout.write("Overwrite: %s, Notify: %s" % (overwrite,notify))

class Catcher(object):
def __init__(self):
pass

def write(self, msg):
if re.search("The file exists, overwrite", msg):
# put data into stdin
if re.search("The file is marked for notification", msg):
# put data into stdin

sys.stdout = Catcher()
test()

我不能只预加载一个 StringIO 对象,因为问题可能会根据情况而变化,但我需要自动输入到标准输入中,因为他们试图将其放入自动构建系统中,所以他们会通过命令行提供默认值来回答出现的任何问题。

如果我在调用编译函数之前将 stdin 设置为空 StringIO 对象,那么它只会出错并显示 EOF - 不知道如何让它等待输入。

类似这样的事情:

import sys
import re
from StringIO import StringIO

def test():
overwrite = raw_input("The file exists, overwrite? ")
notify = raw_input("This file is marked for notifies. Notify?")
sys.__stdout__.write("Overwrite: %s, Notify: %s" % (overwrite,notify))

class Catcher(object):
def __init__(self, stdin):
self.stdin = stdin

def write(self, msg):
if re.search("The file exists, overwrite", msg):
self.stdin.write('yes\n')
if re.search("The file is marked for notification", msg):
self.stdin.write('no\n')

sys.stdin = StringIO()
sys.stdout = Catcher(sys.stdin)
test()

产品:

Traceback (most recent call last):
File "./teststdin.py", line 25, in <module>
test()
File "./teststdin.py", line 8, in test
overwrite = raw_input("The file exists, overwrite? ")
EOFError: EOF when reading a line

有什么想法吗?

最佳答案

如果您想从刚写入的 StringIO 中读取数据,则必须先将其倒回到您开始写入的位置。
另外,您的第二次搜索测试了错误的字符串。

这应该有效:

import sys
import re
from StringIO import StringIO

def test():
overwrite = raw_input("The file exists, overwrite? ")
notify = raw_input("This file is marked for notifies. Notify?")
sys.__stdout__.write("Overwrite: %s, Notify: %s" % (overwrite,notify))

class Catcher(object):
def __init__(self, stdin):
self.stdin = stdin

def write(self, msg):
if re.search("The file exists, overwrite?", msg):
self.stdin.truncate(0)
self.stdin.write('yes\n')
self.stdin.seek(0)
if re.search("This file is marked for notifies. Notify?", msg):
self.stdin.truncate(0)
self.stdin.write('no\n')
self.stdin.seek(0)

sys.stdin = StringIO()
sys.stdout = Catcher(sys.stdin)
test()

关于Python StringIO - 有选择地将数据放入标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13480632/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com