Если вы не возражаете против использования модуля подпроцесса (вопросы безопасности) Существует способ, который зависит от вывода списка пипсов.
Простой способ проверить существование и минимальную версию
import sys
import subprocess
from distutils.version import LooseVersion
def available(desired_package, min_version):
packages = subprocess.check_output([sys.executable, '-m', 'pip', 'list']).decode().split('\n')[2:-1] # First 2 lines, and last line are not packages
package_version = [package.split() for package in packages]
package_dict = {}
for package, version in package_version:
package_dict[package] = version
try:
if LooseVersion(package_dict[desired_package]) >= LooseVersion(min_version):
print('Minimum version requirement met')
else:
print('Minimum version requirement not met')
except KeyError:
print('{} not found.'.format(desired_package))
>>> available('tensorflow', '0.0.1')
Minimum version requirement met
>>> available('tensorflow', '20.0.1')
Minimum version requirement not met
>>> available('tensorflowasd', '20.0.1')
tensorflowasd not found.
Более сложный способ, если необходимо выполнить точное сравнение с входа: «tenorflow> 1.13.0"
import sys
import subprocess
from distutils.version import LooseVersion
import re
def available(input):
def version_comparer(version, desired_version, comparator):
if comparator == '<=': return LooseVersion(version) <= LooseVersion(desired_version)
elif comparator == '>=': return LooseVersion(version) >= LooseVersion(desired_version)
elif comparator == '==': return LooseVersion(version) == LooseVersion(desired_version)
elif comparator == '>': return LooseVersion(version) > LooseVersion(desired_version)
elif comparator == '<': return LooseVersion(version) < LooseVersion(desired_version)
else:
print('Unexpected comparator')
exit(1)
match = re.match('([A-Za-z0-9-_]+)([^A-Za-z0-9-_]+)([\d\.]+$)', input)
desired_package, comparator, desired_version = match[1], match[2], match[3]
packages = subprocess.check_output([sys.executable, '-m', 'pip', 'list']).decode().split('\n')[2:-1] # First 2 lines, and last line are not packages
package_version = [package.split() for package in packages]
package_dict = {}
for package, version in package_version:
package_dict[package] = version
try:
if version_comparer(package_dict[desired_package], desired_version, comparator):
print('Input validated')
else:
print('Package exists, but requirement not met')
except KeyError:
print('{} not found.'.format(desired_package))
>>> available('tensorflow<0.0.1')
Package exists, but requirement not met
>>> available('tensorflowasd<0.0.1')
tensorflowasd not found.
>>> available('tensorflow>0.0.1')
Input validated