|
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