Python Forum

Full Version: reading data from command line
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I want to automate updating python packages through pip. I think I have most of it. I just don't know how to evaluate the output from results = os.system('pip list --outdated'). I thought putting 0 for none would be sufficient but it doesn't work. It gives me a list of outdated packages but says they are all up to date. It never runs lines 12-21. Wall
def pkg_update():
    options = ['Check for updates?', '1 Yes', '2 Exit']
    for option in options:
        print(option)
    choice = input('> ')
    if choice == '1':
        print('Checking for updates.')
        results = os.system('pip list --outdated')
        if results == 0: # What do I put here?
            print('All packages are up to date.\n')
            pkg_update()
        else:
            print(results)
            while True:
                update_list = list(results)
                current = update_list.pop(0)
                print(f'Updating {current}.')
                os.system(f'''pip install --upgrade
				             {current}''')
                print('Done')
            pkg_update()

    elif choice == '2':
        raise SystemExit

    else:
        pkg_update()


if __name__ == "__main__":
    pkg_update(
Do not use os.system() it's deprecated and unsafe,use subprocess .
Example i check for module/package,if it's in outdated list i upgrade it.
import subprocess

out = subprocess.run(['pip', 'list', '--outdated'], capture_output=True)
response = out.stdout.decode()
module_name = 'click'
if module_name in response:
    subprocess.run(['pip', 'install', module_name, '--upgrade'])
else:
    print(f'No module with name <{module_name}> found')
Output:
E:\div_code λ python sub_2.py Collecting click Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl Installing collected packages: click Found existing installation: click 6.7 Uninstalling click-6.7: Successfully uninstalled click-6.7 Successfully installed click-7.0
I only use pip list in a virtual envorioment,as OS is mess because i do test a lot often to help users install problem on forum.
So i have many modules/package that i don't care about or want to update.
I use this for list --outdated
import pkg_resources
from subprocess import call

packages = [dist.project_name for dist in pkg_resources.working_set]

outdated = call("pip list --outdated " + ' '.join(packages), shell=True)
print(outdated)