Skip to content
Advertisement

Python: Run command for another software in terminal

I am using a software that my lab has developed, lets call it cool_software. When I type cool_software on terminal, basically I get a new prompt cool_software > and I can imput commands to this software from the terminal.

Now I would like to automate this in Python, however I am not sure how to pass the cool_software commands onto it. Here’s my MWE:

import os
os.system(`cool_software`)           
os.system(`command_for_cool_software`)

The problem with the code above is that command_for_cool_software is executed in the usual unix shell, it is not executed by the cool_software.

Advertisement

Answer

Based on @Barmar suggestion from the comments, using pexpect is pretty neat. From the documentation:

The spawn class is the more powerful interface to the Pexpect system. You can use this to spawn a child program then interact with it by sending input and expecting responses (waiting for patterns in the child’s output).

This is a working example using the python prompt as an example:

import pexpect

child = pexpect.spawn("python") # mimcs running $python
child.sendline('print("hello")') # >>> print("hello")
child.expect("hello") # expects hello
print(child.after) # prints "hello"
child.close()

In your case, it will be like this:

import pexpect

child = pexpect.spawn("cool_software")
child.sendline(command_for_cool_software)
child.expect(expected_output) # catch the expected output
print(child.after)
child.close()

NOTE

child.expect() matches only what you expect. If you don’t expect anything and want to get all the output since you started spawn, then you can use child.expect('.+') which would match everything.

This is what I got:

b'Python 3.8.10 (default, Jun  2 2021, 10:49:15) rn[GCC 9.4.0] on linuxrnType "help", "copyright", "credits" or "license" for more information.rn>>> print("hello")rnhellorn>>> '
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement