【问题标题】:Python subprocess.run C Program not workingPython subprocess.run C程序不工作
【发布时间】:2026-01-14 14:30:01
【问题描述】:

我正在尝试编写代码以使用 Python 运行 C 可执行文件。

在终端调用./myprogram即可运行C程序,会提示选择菜单,如下图:

1. Login
2. Register

现在,使用 Python 和子进程,我编写了以下代码:

import subprocess
subprocess.run(["./myprogram"])

Python 程序运行,但什么也没显示(也没有错误!)。任何想法为什么会发生?

当我尝试时:

import subprocess
subprocess.run(["ls"])

显示该特定目录中的所有文件。所以我认为这是对的。

【问题讨论】:

  • 尝试p=subprocess.Popen(["./myprogram"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 并使用stdout_data,stderr_data=p.communicate()。这将返回一个标准错误和标准输出数据的元组。然后只需在标准输出中打印数据(作为文件)
  • 谢谢@Adam。在这种情况下,如何输入要从菜单中选择的值?
  • 如果你的程序myprogram,通过stdin与用户交互,那么你不能,因为你已经将子进程stdin绑定到subprocess.PIPE,用于ipc与父进程。如果myprogram 不需要与用户输入交互,则考虑通过标准输入管道将这些输入从父级推送到子级。
  • 有什么解决方法吗?所以我不能使用 Python 与 C 程序交互?

标签: python c subprocess


【解决方案1】:

也许刷新标准输出?

print("", flush=True,end="")

【讨论】:

    【解决方案2】:

    你必须像这样打开子进程:

    import subprocess
    cmd = subprocess.Popen(['./myprogram'], stdin=subprocess.PIPE)
    

    这意味着cmd 将有一个.stdin 你可以写信; print 默认情况下将输出发送到 Python 脚本的标准输出,它与子进程的标准输入无关。那就这样做吧:

    cmd.stdin.write('1\n')  # tell myprogram to select 1
    

    那么你很可能应该:

    cmd.stdin.flush()  # don't let your input stay in in-memory-buffers
    

    cmd.stdin.close()  # if you're done with writing to the subprocess.
    

    PS 如果您的 Python 脚本是 *nix 系统上长期运行的进程,并且您注意到您的子进程已结束但仍显示为 Z(僵尸)进程,请查看that 答案。

    【讨论】:

    • 谢谢。有用。现在的问题是 C 程序似乎无法接受输入。它只是立即提示说我没有输入正确的输入。
    • 当您运行 C 程序时,您是否看到打印的菜单,然后提示输入选择并返回(案例 A),或者它是否填充了终端窗口,颜色和内容,以及等待按键(情况B)?如果是情况A,那我们就试着去理解;如果是情况 B,也许尝试写一个普通的 '1' 而不是 '1\n' 并刷新,但不确定它是否会起作用。