简体   繁体   中英

using subprocess.run to automate a command line application (windows 10)

trying to use python to automate a usage of a command line application called slsk-cli

manually, the procedure is straight-forward - i open a command prompt window and type 'soulseek login', then a prompt requests username, after i type in and press enter i'm requested a password.

so far, i manage to get the prompt of the username but not getting passed that.

subprocess.run('soulseek login',shell=True)

this results in the ?Login output in the python console but also the process is stuck, when i run in debug or also in run

is there a better way to go about this?

Interacting continuously with a system via subprocess can be tricky . However, it seems that your interface prompts are one after the other, which can therefore be chained together , via newline characters which act as Return key strokes.

For example, the program shown below simply prompts a user for their username and a password, to which the 'user' (your script) provides the input via the proc.communicate() method. Once these are provided, the user is asked if they'd like to continue (and do the same thing again). The following subprocess call feeds the following input into the prompter.py script:

  • username
  • password
  • continue reply (y or n)

Example code:

import subprocess

uid = 'Bob'
pwd = 'MyPa$$w0rd'
reply = 'n'

with subprocess.Popen('./prompter.py', 
                      stdout=subprocess.PIPE, 
                      stderr=subprocess.PIPE, 
                      stdin=subprocess.PIPE,
                      text=True) as proc:
    stdout, stderr = proc.communicate(input='\n'.join([uid, pwd, reply]))

Output:

# Check output.
>>> print(stdout)

Please enter a username: Password: uid='Bob'
pwd='MyPa$$w0rd'
Have another go? [y|n]: 

# Sanity check for errors.
>>> print(stderr)
''

Script:

For completeness, I've included the contents of the prompter.py script below.

#!/usr/bin/env python

from time import sleep

def prompter():
    while True:
        uid = input('\nPlease enter a username: ')
        pwd = input('Password: ')
        print(f'{uid=}\n{pwd=}')
        sleep(2)
        x = input('Have another go? [y|n]: ')
        if x.lower() == 'n':
            break

if __name__ == '__main__':
    prompter()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM