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


112

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

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

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

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

Skype 시작을 자동화하는 Python 스크립트를 작성하고 tcpdump를 사용하여 패킷 데이터를 수집하여 회의 통화가있을 때 네트워크가 어떻게 작동하는지 분석 할 수 있습니다.
Kevin

답변:


107

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

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.

6
경고 : 오늘 모듈 자체 내에서 ImportError가 발생한 상황이 발생했습니다. 자주 발생하지 않아야하지만 모든 경우에이 검사가 신뢰할 수있는 것은 아니라는 점에 유의하십시오.
Koen Bok

7
이것은 확인 만하 는 것이 아닙니다 . 또한 가져옵니다. 또한 참조 stackoverflow.com/questions/14050281/...
호르헤 레이 타오에게

6
예. 그것은 일반적으로 당신이 원하는 것입니다. 가져 오기 도구 모듈을 사용하여보다 정교한 검사를 수행 할 수 있지만 대부분의 경우 모듈이 설치되어 있는지 확인하는 유일한 이유는 모듈을 사용하기 때문입니다.
Christopher

패키지와 이름이 같은 다른 파일이있는 경우 실패합니다.
Sapphire_Brick

물론입니다.하지만 그것은 완전히 다른 문제입니다. 조회 경로에 동일한 이름을 가진 두 개의 다른 모듈 또는 패키지가 있으면 문제가 있습니다.
Christopher

56

업데이트 된 답변

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

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

2
다른 답변에서 언급했듯이 오류가 포착되지 않을 수 있습니다. 그러므로 나는 이것이 받아 들여진 대답이어야한다고 생각한다.
Jorrick Sleijster 2017-08-20

1
이 메서드는 'json'과 같은 패키지에서는 작동하지 않습니다 ( import json실제로 작동하는 경우 False 반환 ). 이 경우 ice.nicer의 방법이 작동합니다.
mountrix

1
어떻게 든 if "u'requests'" in installed_packages:나를 위해 일하기 위해 업데이트 된 답변 의 수표를 사용해야했습니다 . 의 출력은 print()내 macOS python에서 다음 을 생성합니다.[..., u'pytz', u'requests', ...]
Buju

1
@ArturBarseghyan 저는 Python 2.7.10 (macOS 시스템 Python)을 사용하고 있습니다. 실제로 사용해야합니다 if "requests'"(끝에 작은 따옴표가 있습니다). 전혀 말이되지 않습니다.
Buju

1
이것은 "패키지 'x'가 설치되어 있습니까?"라는 질문에 대답하지 않습니다. .NET을 사용하지 않고 패키지를 설치하는 방법에는 여러 가지가 있습니다 pip. 예를 들어 소스에서 패키지를 만들고 설치할 수 있습니다. 이 대답은 그것을 찾지 못할 것입니다. @ ice.nicer의 대답 find_spec()이 맞습니다.
Arthur

43

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")

4
여기에 깨끗하고 간단합니다. 이것은 더 많은 찬성표가 필요합니다.
David Parks

5
조심해. 패키지 이름에 대시가 포함 된 경우 점을 사용하지 않으면 find_spec ()에서 찾을 수 없습니다. 예 : importlib.util.find_spec('google-cloud-logging')가 발견되는 동안 아무것도 찾지 못합니다 importlib.util.find_spec('google.cloud.logging'). pip가 표시하는 공식 이름과 이름은 점이 아닌 대시로 표시됩니다. 혼동 될 수 있으므로주의해서 사용하십시오.
2019 년

27

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

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

이것은 훌륭해 보이지만 항상 "설치되지 않음"을 반환합니다. 왜?
Elliptica

"$ pip3 —version"및 "$ pip3 show package_name"의 출력을 공유 할 수 있습니까? 여기서 package_name을 원하는 패키지로 바꿉니다.
Ognjen Vukovic

쉘 팁 : if성공적인 명령을 직접 테스트하는 데 사용할 수 있습니다 .if pip3 show package_name 1>/dev/null; then ...
MestreLion

6

이 답변 의 확장으로 :

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

스크립트가 아니라 명령 줄 검사에 적합합니다. 감사합니다
Jj Rivero 19

3

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 패키지에는 차이가 있습니다. 패키지에는 여러 모듈이 포함될 수 있으며 모듈 이름이 패키지 이름과 일치하지 않을 수 있습니다.



1

이 주제에 대한 내 생각 / 발견을 추가하고 싶습니다. 맞춤형 프로그램에 대한 모든 요구 사항을 확인하는 스크립트를 작성 중입니다. 파이썬 모듈에도 많은 검사가 있습니다.

약간의 문제가 있습니다.

try:
   import ..
except:
   ..

해결책. 제 경우에는라는 파이썬 모듈 중 하나 python-nmap이지만 import nmap이름이 일치하지 않는 것을 볼 때 가져옵니다 . 따라서 위의 솔루션을 사용한 테스트는 False 결과를 반환하고 적중시 모듈도 가져 오지만 간단한 테스트 / 확인을 위해 많은 메모리를 사용할 필요가 없을 수도 있습니다.

나는 또한 발견했다

import pip
installed_packages = pip.get_installed_distributions()

installed_packages있을 것이다 패키지 만하고있다 핍 설치 . 내 시스템에 pip freeze이상 반환 40하면서 파이썬 모듈 installed_packages만을 가지고 1, 하나는 내가 (파이썬 nmap을) 수동으로 설치.

아래의 또 다른 솔루션 은 질문관련이 없을 수 있지만 테스트 기능을 설치를 수행하는 기능과 분리 하여 유지 하는 것이 좋은 습관이라고 생각합니다 .

나를 위해 일한 솔루션. 이 답변을 기반으로 파이썬 모듈을 가져 오지 않고 존재하는지 확인하는 방법

from imp import find_module

def checkPythonmod(mod):
    try:
        op = find_module(mod)
        return True
    except ImportError:
        return False

참고 :이 솔루션은 이름으로 모듈을 찾을 수 없습니다. 대신 python-nmap사용해야 nmap하지만 (사용하기 쉬움)이 경우 모듈이 메모리에로드되지 않습니다.


0

스크립트가 누락 된 패키지를 설치하고 계속하려면 다음과 같이 할 수 있습니다 (예 : 'python-krbV'패키지의 'krbV'모듈).

import pip
import sys

for m, pkg in [('krbV', 'python-krbV')]:
    try:
        setattr(sys.modules[__name__], m, __import__(m))
    except ImportError:
        pip.main(['install', pkg])
        setattr(sys.modules[__name__], m, __import__(m))

0

빠른 방법은 파이썬 명령 줄 도구 를 사용하는 것입니다 . 간단히 입력 import <your module name> 모듈이없는 경우 오류를 참조하십시오.

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> import sys
>>> import jocker
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$

0

흠 ... 편리한 대답에 가장 가까운 것은 명령 줄을 사용하여 가져 오기를 시도하는 것입니다. 그러나 나는 그것을 피하는 것을 선호합니다.

어때요 '핍 동결 | grep pkgname '? 나는 그것을 시도하고 잘 작동합니다. 또한 보유한 버전과 버전 제어 (설치) 또는 편집 가능 (개발)하에 설치되었는지 여부도 표시합니다.


0

class myError (exception) : pass # 또는 시도해보세요 : import mymodule except ImportError as e : raise myError ( "error was were changed")


0

터미널 유형에서

pip show some_package_name

pip show matplotlib

0

@ ice.nicer 답장에 댓글을 달고 싶지만 그렇게 할 수는 없습니다 ... 내 관찰은 대시가있는 패키지는 @dwich 댓글에서 지적한 점뿐만 아니라 밑줄로 저장된다는 것입니다.

예를 들어, pip3 install sphinx-rtd-theme하지만 다음 을 수행합니다 .

  • importlib.util.find_spec(sphinx_rtd_theme) 객체를 반환
  • importlib.util.find_spec(sphinx-rtd-theme) None 반환
  • importlib.util.find_spec(sphinx.rtd.theme) ModuleNotFoundError를 발생시킵니다.

또한 일부 이름은 완전히 변경되었습니다. 예를 들어, 수행 pip3 install pyyaml하지만 단순히 다음과 같이 저장됩니다.yaml

python3.8을 사용하고 있습니다.



-1

옵션 # 2로 이동합니다. 경우 ImportError에 슬로우됩니다, 다음 패키지가 설치되어 있지 않은 (또는하지의 sys.path).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.