user2690151
user2690151

Reputation: 135

python subprocess and passing in shell arguments

I'm trying to utilize python's subprocess to run a command that downloads a file, but it requires an argument in order to proceed. If I run the command stand alone, it will prompt you as shown below:

./goro-new export --branch=testing --file=corp/goro.sites/test/meta.json

Finding pages .........
The following pages will be exported from Goro to your local filesystem:

  /goro.sites/test/meta.json -> /usr/local/home/$user/schools/goro.sites/test/meta.json

Export pages? [y/N]: y
Exporting 1 pages ..............................................................................................................   0%  0:00:03

Exported 1 pages in 3.66281s.

My question is, how do I answer the "y/N" in the Export pages part? I suspect I need to pass in an argument to my subprocess, but I am relatively a newcomer to python, so I was hoping for some help. Below is a printout of my testing in the python environment:

>>> import subprocess
>>> cmd = ['goro-new export --branch=test --file=corp/goro.sites/test/meta.json']
>>> p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE, stdin=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
Finding pages .... 
The following pages will be exported from Goro to your local filesystem:
/goro.sites/test/meta.json -> /var/www/html/goro.sites/test/meta.json
Export pages? [y/N]: 

How can I pass in the "y/N" so it can proceed?

Upvotes: 0

Views: 1916

Answers (2)

Jed Estep
Jed Estep

Reputation: 605

The easiest way to do this if you always want to answer yes (which I'm assuming you do) is with some bash: yes | python myscript.py. To do this directly in python, you can make a new subprocess.Popen (say, called yes) with stdout=subprocess.PIPE, and set the stdin of p to be equal to yes.stdout. Reference: Python subprocess command with pipe

Upvotes: 0

msvalkon
msvalkon

Reputation: 12077

You use the function which you are already using, the communicate() -function and pass whatever you want as it's input parameter. I cannot verify this works but it should give you an idea:

>>> import subprocess
>>> cmd = ['goro-new export --branch=test --file=corp/goro.sites/test/meta.json']
>>> p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE, stdin=subprocess.PIPE)
>>> out, err = p.communicate(input="y")
>>> print out

Upvotes: 2

Related Questions