|
14 | 14 |
|
15 | 15 | from sys import executable |
16 | 16 | from subprocess import check_call, CalledProcessError |
| 17 | +from pkg_resources import get_distribution, DistributionNotFound |
17 | 18 |
|
18 | 19 |
|
19 | 20 | def install_package(package, version="upgrade"): |
20 | 21 | result = False |
21 | | - if version.lower() == "upgrade": |
| 22 | + |
| 23 | + def try_install(args): |
22 | 24 | try: |
23 | | - result = check_call([executable, "-m", "pip", "install", package, "--upgrade", "--user"]) |
| 25 | + check_call([executable, "-m", "pip", *args]) |
| 26 | + return True |
24 | 27 | except CalledProcessError: |
25 | | - result = check_call([executable, "-m", "pip", "install", package, "--upgrade"]) |
| 28 | + return False |
| 29 | + |
| 30 | + if version.lower() == "upgrade": |
| 31 | + args = ["install", package, "--upgrade"] |
| 32 | + result = try_install(args + ["--user"]) |
| 33 | + if not result: |
| 34 | + result = try_install(args) |
26 | 35 | else: |
27 | | - from pkg_resources import get_distribution |
28 | | - current_package_version = None |
29 | 36 | try: |
30 | | - current_package_version = get_distribution(package) |
31 | | - except Exception: |
| 37 | + installed_version = get_distribution(package).version |
| 38 | + if installed_version == version: |
| 39 | + return True |
| 40 | + except DistributionNotFound: |
32 | 41 | pass |
33 | | - if current_package_version is None or current_package_version != version: |
34 | | - installation_sign = "==" if ">=" not in version else "" |
35 | | - try: |
36 | | - result = check_call( |
37 | | - [executable, "-m", "pip", "install", package + installation_sign + version, "--user"]) |
38 | | - except CalledProcessError: |
39 | | - result = check_call([executable, "-m", "pip", "install", package + installation_sign + version]) |
| 42 | + install_version = f"{package}=={version}" if ">=" not in version else f"{package}{version}" |
| 43 | + args = ["install", install_version] |
| 44 | + if not try_install(args + ["--user"]): |
| 45 | + result = try_install(args) |
| 46 | + |
40 | 47 | return result |
0 commit comments