2

I am trying to install some packages through python code using loop, but at once only one package get install.

Got below error on next package.

Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: 'c:\\users\\akshay~1.sha\\appdata\\local\\temp\\pip-req-tracker-aoybzz\\f37aad13bd20c8b1e66a004a7c01edf203f7e46ba784c9954fe935f7'

If I run the script again it will install the second package and throw error for the third. If I run it third time it will install the third, I want to install all the packages in one go, please help. Below is the code

===========================================================================

import os

from pip._internal import main as pipmain

PACKAGES = {'pymongo': 'pymongo-3.4.0', 'pexpect': 'pexpect-4.6.0', 'pathlib': 'pathlib-1.0.1'}

def install_dependency(pkg_name, crnt_path):
    pkg_path = os.path.join(crnt_path, "dependencies\\"+pkg_name+"\\")
    print("Installing package from local...", pkg_name)
    pipmain(["install", pkg_path])

def check_dependecies():
    current_path = os.path.dirname(os.path.abspath(__file__))
    print(PACKAGES.keys())
    for package_name in PACKAGES.keys():
        try:
            __import__(package_name, globals=globals())
            print("================> Package imported successfully", package_name)
        except ImportError as import_error:
            print("Package not present", import_error)
            install_dependency(PACKAGES[package_name], current_path)
            print("================> Package imported successfully", package_name)
            __import__(package_name, globals=globals())

if __name__ == "__main__":
    check_dependecies()

1 Answers1

0

I faced the same problem and i've solved this using a workaround.

We know that we can't install several packages in a for loop using pip, but we also know that we can install multiple package at a time!

That's how I proceed:

  1. loop through our packages looking for their presence, if not we save them inside a dict {pkg_name: pkg_id} (eg: {'pymongo': 'pymongo-3.4.0'})
  2. Create a list pkg2install composed by only pkg_id (eg: ['pymongo-3.4.0', 'pexpect-4.6.0'])
  3. Use pipmain to install them all in one shot: `pipmain(['install', *pkg2install])

Your code reviewed:

from pip._internal import main as pipmain

PACKAGES = {'pymongo': 'pymongo', 'pexpect': 'pexpect', 'pathlib': 'pathlib'}


def check_dependecies():
    missing_pkgs = {}

    for package_name in PACKAGES.keys():
        try:
            __import__(package_name, globals=globals())
            print("================> Package imported successfully", package_name)

        except ImportError as import_error:
            print("Package not present", import_error)

            missing_pkgs.update({package_name: PACKAGES[package_name]})

    pkgs2install = missing_pkgs.values()

    status = pipmain(["install", *pkgs2install])

    if status == 0:
        print("================> Missing packages installed successfully", pkgs2install)    

        for pkg in missing_pkgs.keys():
            __import__(pkg, globals=globals())
            print("================> Package imported successfully", pkg)


if __name__ == "__main__":
    check_dependecies()

The output it generates:

Package not present No module named 'pymongo'
Package not present No module named 'pexpect'
================> Package imported successfully pathlib
Collecting pymongo
  Downloading https://files.pythonhosted.org/packages/a3/8c/ec46f4aa95515989711a7893e64c30f9d33c58eaccc01f8f37c4513739a2/pymongo-3.9.0-cp37-cp37m-macosx_10_6_intel.whl (378kB)
    100% |████████████████████████████████| 378kB 4.4MB/s 
Collecting pexpect
  Using cached https://files.pythonhosted.org/packages/0e/3e/377007e3f36ec42f1b84ec322ee12141a9e10d808312e5738f52f80a232c/pexpect-4.7.0-py2.py3-none-any.whl
Collecting ptyprocess>=0.5 (from pexpect)
  Using cached https://files.pythonhosted.org/packages/d1/29/605c2cc68a9992d18dada28206eeada56ea4bd07a239669da41674648b6f/ptyprocess-0.6.0-py2.py3-none-any.whl
Installing collected packages: pymongo, ptyprocess, pexpect
Successfully installed pexpect-4.7.0 ptyprocess-0.6.0 pymongo-3.9.0
================> Missing packages installed successfully dict_values(['pymongo', 'pexpect'])
================> Package imported successfully pymongo
================> Package imported successfully pexpect

Note: I didn't use version or local packages, but the mechanism should remain the same

I hope this is helpful despite being 11 months late.