You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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)

我们需要完成这几件关键操作:

  1. 开启子进程的stdin=subprocess.PIPE,让主进程能控制子进程的输入
  2. 捕获用户的键盘输入,同时写入控制台、输出文件,再传给子进程
  3. 等待子进程结束后再获取返回码,避免拿到无效的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

火山引擎 最新活动