如何使用subprocess捕获键盘输入并写入输出文件?
解决方法:捕获用户输入并同步到文件和子进程
你的问题核心是主进程没有捕获键盘输入的内容,所以没法把它写入输出文件。当前你的键盘输入直接传给了子进程的stdin,但主进程没记录这部分内容,同时子进程的代码还有个小问题需要修正。下面一步步来解决:
第一步:修正子进程代码(display_alphabet_type.py)
你当前的input(str())是错误写法,str()会生成空字符串,导致输入提示和输出连在一起。把main函数改成这样:
def main(): print("Enter string: ") # 直接用input()读取用户输入,不需要传空的str() string = input() d = display_digits_chars_symbols_in_string(string) print(d)
或者更简洁的合并写法:
def main(): string = input("Enter string: ") d = display_digits_chars_symbols_in_string(string) print(d)
第二步:修改主进程代码(subprocess_using_popen.py)
我们需要完成这几件关键操作:
- 开启子进程的
stdin=subprocess.PIPE,让主进程能控制子进程的输入 - 捕获用户的键盘输入,同时写入控制台、输出文件,再传给子进程
- 等待子进程结束后再获取返回码,避免拿到无效的
None值
修改后的完整代码如下:
import subprocess import sys out_f = open("output_file.txt", "w") file_path = "../Python_tests/display_alphabet_type.py" cmd = ['python3', file_path] # 打开stdin管道,保持stdout/stderr的原有设置 proc = subprocess.Popen( cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True ) # 捕获用户输入 user_input = input() # 把输入同步写入控制台和输出文件 sys.stdout.write(user_input + "\n") out_f.write(user_input + "\n") # 将输入传给子进程,flush确保子进程能立即收到输入 proc.stdin.write(user_input + "\n") proc.stdin.flush() proc.stdin.close() # 关闭stdin,告诉子进程输入已结束 # 读取子进程的输出,逐行同步到控制台和文件 for line in proc.stdout: sys.stdout.write(line) out_f.write(line) # 等待子进程执行完毕,获取正确的返回码 proc.wait() out_f.write(f"Return code: {proc.returncode}\n") out_f.close()
运行效果验证
现在运行python3 subprocess_using_popen.py并输入a123#:
- 控制台输出:
a123# Enter string: {'count_digits': 3, 'count_uppercase': 0, 'count_lowercase': 1, 'count_special_chars': 1}
- output_file.txt内容:
a123# Enter string: {'count_digits': 3, 'count_uppercase': 0, 'count_lowercase': 1, 'count_special_chars': 1} Return code: 0
额外说明
如果需要支持多行输入或者更复杂的交互场景,你可以用sys.stdin循环逐行读取输入,同步传给子进程并记录。但针对你当前的需求,上面的代码已经能完美解决问题。
内容的提问来源于stack exchange,提问作者Athulya




