16

I need to install some package using apt or rpm, according the OS. I saw the lib "apt" to update or upgrade the system, but it is possible use it to install a single package?

I was trying to use too "subprocess":

subprocess.Popen('apt-get install -y filetoinstall', shell=True, stdin=None, stdout=None, stderr=None, executable="/bin/bash")

But this command shows all process in the shell, I cannot hide it.

2
  • It seems you are not getting the forked properly. Have you tried reading the documentation? Commented Dec 12, 2011 at 22:43
  • For Python 3.5+, see subprocess.run() Commented Aug 6, 2017 at 18:11

5 Answers 5

14

You can use check_call from the subprocess library.

from subprocess import STDOUT, check_call
import os
check_call(['apt-get', 'install', '-y', 'filetoinstall'],
     stdout=open(os.devnull,'wb'), stderr=STDOUT) 

Dump the stdout to /dev/null, or os.devnull in this case.

os.devnull is platform independent, and will return /dev/null on POSIX and nul on Windows (which is not relevant since you're using apt-get but, still good to know)

Sign up to request clarification or add additional context in comments.

2 Comments

Thank guys ! I use part of each solution. My code: proc = subprocess.Popen('apt-get install -y FILE', shell=True, stdin=None, stdout=open(os.devnull,"wb"), stderr=STDOUT, executable="/bin/bash") proc.wait() Added: stdout and .wait Thank you one more time
This worked for me. I would like to suggest using a try and except block so that in case of an error it will tell you what the issue is rather than just saying there was an error. I added an answer below as a supplement.
6

I use part of each solution:

proc = subprocess.Popen('apt-get install -y FILE', shell=True, stdin=None, stdout=open(os.devnull,"wb"), stderr=STDOUT, executable="/bin/bash")
proc.wait()

Added: stdout and .wait

Comments

4

For this particular task, as an alternative to subprocess you might consider using Fabric, a python deployment tool to automate builds.

Comments

3

This is meant as an addition to Russell Dias's accepted answer. This adds a try and except block to output actionable error information rather than just stating there was an error.

from subprocess import check_call, CalledProcessError
import os
try:
    check_call(['apt-get', 'install', '-y', 'filetoinstall'], stdout=open(os.devnull,'wb'))
except CalledProcessError as e:
    print(e.output)

Comments

1

Use this to redirect the output to /dev/null:

proc = subprocess.Popen('apt-get install -y filetoinstall', shell=True, stdin=None, stdout=open("/dev/null", "w"), stderr=None, executable="/bin/bash")
proc.wait()

The call to .wait() will block until the apt-get is complete.

2 Comments

Ah ok thanks but how can I stop the program, waiting the apt finish the install, and when is installed , procced with the other functions?
Thank guys ! I use part of each solution. My code: proc = subprocess.Popen('apt-get install -y FILE', shell=True, stdin=None, stdout=open(os.devnull,"wb"), stderr=STDOUT, executable="/bin/bash") proc.wait() Added: stdout and .wait Thank you one more time

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.