正在从获取输出操作系统(无子流程)

2024-10-01 17:41:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试捕获和/或删除由操作系统()打电话。该脚本将在Linux和Windows下运行。在

我不能使用子流程模块,因为该命令是交互式的(即:用户可以键入指令来触发各种操作)。因此,请不要将此主题作为常见问题的重复,例如:

  1. Python: How to get stdout after running os.system?
  2. How to store the return value of os.system that it has printed to stdout in python?
  3. Assign output of os.system to a variable and prevent it from being displayed on the screen
  4. 。。。在

一个解决方案可以是让子进程与这样一个“包装”的程序一起工作,但这似乎是一个相当复杂的任务,我希望使解决方案保持简单(没有外部模块或1000行代码段…),因为它不是我的脚本的主要功能。下面的线程看起来很有前途,但它们的工作效果不如一个粗糙的线程操作系统()(也不是那么简单…)公司名称:

  1. Running an interactive command from within python
  2. Non-blocking read on a subprocess.PIPE in python
  3. http://log.ooz.ie/2013/02/interactive-subprocess-communication-in.html

另一个解决方案是设计一个“tee”函数,比如本机支持的函数 在Linux发行版中。例如,我在这里找到了一个很好的实现(一个修改系统标准输出同时写入文件和原始文件系统标准输出)公司名称:

问题是操作系统()似乎未打印到主脚本stdout。相反,它在子shell中启动程序,我无法找到检索/抑制其输出的方法。。。在

如果您有任何其他方法或解决方案,请告知大都会。谢谢。在


下面的评论中询问并给出了一些关于上下文的细节。主要的问题是我为什么要坚持下去操作系统()当子流程似乎是显而易见的解决方案时。在

我执行的程序名为CAST3M(http://www-cast3m.cea.fr/)。它是一个有限元程序,用于解决物理的各个领域的问题。由于没有GUI,因此用户通过一种名为GIBIANE的命令行自定义语言进行交互。通常,您可以使用预先编写的GIBIANE数据文件向CAST3M提供数据,也可以在不使用数据文件的情况下启动程序,并在运行中使用enter命令。以下是典型的GIBIANE指令(它们定义了一些点,然后是一条直线、一个正方形,最后是一个立方体):

OPTI 'DONN' 3 'ELEM' 'CUB8' ;
PT1 = 0. 0. 0. ;
PT2 = 1. 0. 0. ;
PT3 = 0. 1. 0. ;
PT4 = 0. 0. 1. ;
NN1 = 5 ;
DR1 = PT1 DROI NN1 PT2 ;
SF1 = DR1 TRAN NN1 PT3 ;
VL1 = SF1 VOLU 'TRAN' NN1 PT4 ;

我用Python编写了一个包装器,目的是在实际启动CAST3M之前调整它的一些功能。我需要记录这个Python脚本打印的内容以及CAST3M会话的输出。当没有交互性时,子进程执行该任务。当有交互性时,我被迫使用操作系统()因为子流程在CAST3M中工作得很差(我只需要把它交给CAST3M,后者操作系统()实现了开箱即用,牺牲了IO控制,这是真的)


Tags: 模块toin程序脚本oslinuxstdout
2条回答

=>;正如Martijn Pieters所说,无法检索操作系统()调用(因为它产生了一个subshell=一个黑盒子,我们只知道它的返回码)。解决方案是让Python充当最终用户和CAST3M之间的代理(传递配置:Python是“中间人”,监听用户请求并“原样”地发送给CAST3M,然后捕获CAST3M答案并将其打印回用户)。为此,您必须使用子进程、线程和队列模块。如果您不介意它带来的复杂性(以及原始HCI体验的改变),以下是一些链接的快速摘要,这些链接可能会显示出有用的信息:

  1. Wrap subprocess' stdout/stderr
  2. Can you make a python subprocess output stdout and stderr as usual, but also capture the output as a string?
  3. Running an interactive command from within python
  4. Non-blocking read on a subprocess.PIPE in python
  5. http://log.ooz.ie/2013/02/interactive-subprocess-communication-in.html

=>;Robᵩ通过将日志记录任务指定给“脚本”Linux工具,仅为Linux提供了一个解决方案。这使得“user<;>CAST3M”交互功能保持不变(这里没有代理)。在

在Linux上,script提供一个交互式环境,同时捕获所有用户交互:

os.system("script -c '/bin/ed /etc/passwd' /tmp/capture_file")

上面的函数调用将调用密码文件上的行编辑器ed。所有用户交互将存储在/tmp/capture_file中。在

相关问题 更多 >

    热门问题