【问题标题】:Python subprocess allow for user interactionPython 子进程允许用户交互
【发布时间】:2012-07-25 01:18:50
【问题描述】:

我正在尝试从 python 脚本运行一些学生 FORTRAN 程序。这些程序没有按任何特定顺序编写,通常依赖于简单的 FORTRAN read(*,*) 命令。一个简单的程序可以是:

program main
    implicit none
    real :: p,t
    write(*,*)'Enter p'
    read(*,*)p
    write(*,*)'Enter t'
    read(*,*)t
    write(*,*)p,t
end program main

此代码暂停并允许用户根据提示输入某些信息。我想通过使用 subprocess Popen 命令来实现类似的功能。脚本在运行之前不知道输入是什么,甚至不知道它们是否需要发生。

目前,对于没有必要输入的程序,以下脚本有效:

p = sub.Popen('./file',stdout=sub.PIPE,stderr=sub.PIPE,stdin=sub.PIPE,shell=True)
output,error = p.communicate()

有什么方法可以让脚本运行器在程序运行的时候在终端输入数据?

【问题讨论】:

    标签: python fortran subprocess


    【解决方案1】:

    看起来你想使用pexpect

    import pexpect
    child = pexpect.spawn('student_program')
    while child.expect('Enter (\w+)\r\n', pexpect.EOF) == 0:
        if child.match[1] == 'p':
            child.sendline('3.14159')
    

    要将程序的交互控制传递给用户,请使用child.interact()

    【讨论】:

    • 可以将输出“管道”回python程序吗?那会很有帮助。
    • 是的,您可以将output_filter 回调参数用于interact()logfile 属性。
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多