Guy Twig
Guy Twig

Reputation: 131

Interact with python subprocess once waits for user input

I'm working on a script to automate tests of a certain software, and as part of it I need to chech if it runs commands correctly.

I'm currently launching an executeable using subprocess and passing the initial parameters. My code is: subprocess.run("program.exe get -n WiiVNC", shell=True, check=True) As far as I understand, this runs the executeable, and is supposed to return an exception if the exit code is 1.

Now, the program launches, but at some point waits for user input like so: Required user input

My question is, how do I go about submitting the user input "y" using subprocess once either, the text "Continue with download of "WiiVNC"? (y/n) >" shows up, or once the program waits for user input.

Upvotes: 2

Views: 3531

Answers (2)

ErdoganOnal
ErdoganOnal

Reputation: 880

Try this:

import subprocess

process = subprocess.Popen("program.exe get -n WiiVNC", stdin=subprocess.PIPE, shell=True)
process.stdin.write(b"y\n")
process.stdin.flush()
stdout, stderr = process.communicate()

Upvotes: 4

Bobby Ocean
Bobby Ocean

Reputation: 3294

You should use the pexpect module for all complicated subprocessing. In particular, the module is designed to handle the complicated case of either passing through the input to the current process for the user to answer and/or allowing your script to answer the input for the user and continue the subprocess.

Added some code for an example:

### File Temp ### 
# #!/bin/env python
# x = input('Type something:')
# print(x)

import pexpect

x = pexpect.spawn('python temp') #Start subprocess. 
x.interact()                     #Imbed subprocess in current process. 

# or

x = pexpect.spawn('python temp') #Start subprocess.
find_this_output = x.expect(['Type something:'])
if find_this_output is 0:
    x.send('I type this in for subprocess because I found the 0th string.')

Upvotes: 3

Related Questions