[python] Python 패키지가 설치되어 있는지 확인

Python 스크립트 내에서 패키지가 설치되었는지 확인하는 좋은 방법은 무엇입니까? 통역사에서는 쉽지만 스크립트 내에서해야합니다.

설치 중에 생성 된 디렉토리가 시스템에 있는지 확인할 수있을 것 같지만 더 좋은 방법이있는 것 같습니다. Skype4Py 패키지가 설치되어 있는지 확인하려고합니다. 그렇지 않으면 설치하겠습니다.

수표 수행에 대한 나의 아이디어

  • 일반 설치 경로에서 디렉토리를 확인하십시오.
  • 패키지 가져 오기를 시도하고 예외가 발생하면 패키지를 설치하십시오.


답변

파이썬 스크립트를 의미하는 경우 다음과 같이하십시오.

Python 3.3 이상은 sys.modules 및 find_spec을 사용합니다 .

import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

if name in sys.modules:
    print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you choose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"{name!r} has been imported")
else:
    print(f"can't find the {name!r} module")

파이썬 3 :

try:
    import mymodule
except ImportError as e:
    pass  # module doesn't exist, deal with it.

파이썬 2 :

try:
    import mymodule
except ImportError, e:
    pass  # module doesn't exist, deal with it.


답변

업데이트 된 답변

이를 수행하는 더 좋은 방법은 다음과 같습니다.

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]

결과:

print(installed_packages)

[
    "Django",
    "six",
    "requests",
]

requests설치되어 있는지 확인하십시오 .

if 'requests' in installed_packages:
    # Do something

왜 이렇게? 때로는 앱 이름 충돌이 있습니다. 앱 네임 스페이스에서 가져 오는 것은 시스템에 설치된 항목의 전체 그림을 제공하지 않습니다.

제안 된 솔루션이 작동합니다.

  • pip를 사용하여 PyPI 또는 다른 대체 소스 (예 : pip install http://some.site/package-name.zip또는 다른 아카이브 유형) 에서 설치할 때 .
  • 설치시 수동으로 사용 python setup.py install.
  • 시스템 저장소에서 설치할 때 sudo apt install python-requests.

작동 하지 않을 수있는 경우 :

  • 개발 모드에서 설치할 때 python setup.py develop.
  • 개발 모드에서 설치할 때 pip install -e /path/to/package/source/.

이전 답변

이를 수행하는 더 좋은 방법은 다음과 같습니다.

import pip
installed_packages = pip.get_installed_distributions()

pip> = 10.x의 경우 다음을 사용하십시오.

from pip._internal.utils.misc import get_installed_distributions

왜 이렇게? 때로는 앱 이름 충돌이 있습니다. 앱 네임 스페이스에서 가져 오는 것은 시스템에 설치된 항목의 전체 그림을 제공하지 않습니다.

결과적으로 pkg_resources.Distribution개체 목록이 표시 됩니다. 예를 들어 다음을 참조하십시오.

print installed_packages
[
    "Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
    "six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
    "requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]

목록 작성 :

flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]

requests설치되어 있는지 확인하십시오 .

if 'requests' in flat_installed_packages:
    # Do something


답변

Python 3.3부터 find_spec () 메서드를 사용할 수 있습니다.

import importlib.util

# For illustrative purposes.
package_name = 'pandas'

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name +" is not installed")


답변

터미널에서 확인을 받으려면 다음을 실행할 수 있습니다.

pip3 show package_name

아무것도 반환되지 않으면 패키지가 설치되지 않은 것입니다.

예를 들어 누락 된 경우 설치할 수 있도록이 검사를 자동화하려는 경우 bash 스크립트에 다음을 포함 할 수 있습니다.

pip3 show package_name 1>/dev/null #pip for Python 2
if [ $? == 0 ]; then
   echo "Installed" #Replace with your actions
else
   echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ?
fi


답변

이 답변 의 확장으로 :

Python 2. *의 pip show <package_name>경우 동일한 작업을 수행합니다.

예를 들어 pip show numpy다음 또는 유사 항목을 반환합니다.

Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires:
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy


답변

setuptools에서 pkg_resources 모듈을 사용할 수 있습니다. 예를 들면 :

import pkg_resources

package_name = 'cool_package'
try:
    cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
    print('{} not installed'.format(package_name))
else:
    print(cool_package_dist_info)

python 모듈과 python 패키지에는 차이가 있습니다. 패키지에는 여러 모듈이 포함될 수 있으며 모듈 이름이 패키지 이름과 일치하지 않을 수 있습니다.


답변

명령 프롬프트 유형을 엽니 다.

pip3 list