문제

파이썬 스크립트 내에서 패키지가 설치되어 있는지 확인하는 좋은 방법은 무엇입니까? 통역사에서 쉽게 알고 있지만 대본 내에서해야합니다.

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

수표 달성에 대한 나의 아이디어

  • 일반적인 설치 경로에서 디렉토리를 확인하십시오
  • 패키지를 가져오고 예외가 발생하면 패키지를 설치하십시오.
도움이 되었습니까?

해결책

파이썬 스크립트를 의미한다면 다음과 같은 일을하십시오.

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

왜 이렇게? 때로는 앱 이름 충돌이 있습니다. 앱 네임 스페이스에서 가져 오면 시스템에 설치된 내용에 대한 전체 그림이 제공되지 않습니다.

오래된 대답

이 작업을 수행하는 더 나은 방법은 다음과 같습니다.

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
import sys

# 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

확장으로 이 답변:

파이썬 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)

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

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

The에는 약간의 문제가 있습니다

try:
   import ..
except:
   ..

해결책. 제 경우에는 파이썬 모듈 중 하나가 호출되었습니다 python-nmap,하지만 당신은 그것을 가져옵니다 import nmap 그리고 당신이 이름을 볼 수 있듯이 불일치. 따라서 위의 솔루션을 사용한 테스트는 잘못된 결과를 반환하고 적중시 모듈을 가져 오지만 간단한 테스트/점검을 위해 많은 메모리를 사용할 필요가 없습니다.

나는 또한 그것을 발견했다

import pip
installed_packages = pip.get_installed_distributions()

installed_packages 가질 것이다 패키지 만 있었다 PIP와 함께 설치. 내 시스템에서 pip freeze 반환합니다 40 파이썬 모듈 installed_packages 전적으로 1, 내가 수동으로 설치 한 것 (Python-nmap).

아래의 또 다른 해결책은 내가 알고 있습니다 질문과 관련이 없을 수 있습니다,하지만 나는 그것이 좋은 관행이라고 생각합니다. 테스트 기능을 별도로 유지하십시오 설치를 수행하는 것 중 일부는 일부에게 유용 할 수 있습니다.

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

from imp import find_module

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

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

스크립트가 누락 된 패키지를 설치하고 계속하려면 이와 같은 작업을 수행 할 수 있습니다 ( '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))

빠른 방법은 사용하는 것입니다 파이썬 명령 줄 도구. 간단히 입력하십시오 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
$

이동 옵션 #2. 만약에 ImportError 던지면 패키지가 설치되지 않았습니다 (또는 sys.path).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top