your programing

Python 패키지가 설치되어 있는지 확인합니다.

lovepro 2023. 6. 11. 21:14
반응형

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.

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

업데이트된 답변

더 나은 방법은 다음과 같습니다.

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사 를여 또는대 예pip install http://some.site/package-name.zip또는 다른 보관 유형).
  • 를 사용하여 하는 경우python setup.py install.
  • 할 때 를 들어, " 템스리리에설때치할서들어토예포를지시,들", "▁when예어를ing▁system때▁from▁like▁repos▁install,itories리토"와 같이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

만약 당신이 터미널에서 수표를 받고 싶다면, 당신은 실행할 수 있습니다.

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

명령 프롬프트 유형 열기

pip3 list

터미널 유형

pip show some_package_name

pip show matplotlib

답변의 확장으로:

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

if pip list | grep -q \^'PACKAGENAME\s'
  # installed ...
else
  # not installed ...
fi

방법 1

날씨를 검색하려면 패키지가 존재하거나 pip3 list 명령을 사용하지 않습니다.

#**pip3 list** will display all the packages and **grep** command will search for a particular package
pip3 list | grep your_package_name_here

방법 2

가져오기 오류를 사용할 수 있습니다.

try:
    import your_package_name
except ImportError as error:
    print(error,':( not found')

방법 3

!pip install your_package_name
import your_package_name
...
...

다음을 사용할 수 있습니다.

class myError(exception):
 pass # Or do some thing like this.
try:
 import mymodule
except ImportError as e:
 raise myError("error was occurred")

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

약간의 문제가 있습니다.

try:
   import ..
except:
   ..

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

나는 또한 그것을 발견했습니다.

import pip
installed_packages = pip.get_installed_distributions()

installed_packages 패키지만 pip와 함께 설치됩니다.내 시스템에서pip freeze에 대한 이익.40모듈, 반면에 Python 듈모,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이 경우 모듈이 메모리에 로드되지 않습니다.

저는 to @ice.ni cer 답변에 대해 코멘트하고 싶지만, 답변할 수 없어서...대시가 있는 패키지는 @dwich 주석이 지적한 점뿐만 아니라 밑줄로 저장됩니다.

를 들어,은 들어당, 은신를을 .pip3 install sphinx-rtd-theme그러나:

  • importlib.util.find_spec(sphinx_rtd_theme)합니다.
  • importlib.util.find_spec(sphinx-rtd-theme)없음을 반환합니다.
  • importlib.util.find_spec(sphinx.rtd.theme) ModuleNotFoundError는 모듈을 찾을 수 없습니다.

게다가, 몇몇 이름들은 완전히 바뀌었습니다.를 들어,은 들어당, 은신를을 .pip3 install pyyaml하지만 그것은 간단히 저장됩니다.yaml

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

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

간단한 방법은 python 명령줄 도구를 사용하는 것입니다.단순형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
$

음...가장 편리한 답변은 명령줄을 사용하여 가져오기를 시도한 것입니다.하지만 저는 심지어 그것을 피하는 것을 선호합니다.

'pip freeze | grep pkname'은 어떻습니까?저는 그것을 시도했고 그것은 잘 작동합니다.또한 버전이 있는 버전과 버전 제어(설치)로 설치되어 있는지 또는 편집 가능(개발)으로 설치되어 있는지도 표시합니다.

나는 항상 pylibcheck를 사용하여 lib가 설치되어 있는지 여부를 확인하고, 간단하게 다운로드합니다.pip install pylibcheck그리고 그는 이렇게 될 수 있습니다.

import pylibcheck

if not pylibcheck.checkPackage("mypackage"):
     #not installed

또한 튜플과 목록을 지원하므로 여러 패키지를 확인하고 설치 여부를 확인할 수 있습니다.

import pylibcheck

packages = ["package1", "package2", "package3"]

if pylibcheck.checkPackage(packages):
     #not installed

만약 당신이 그것을 원한다면 당신은 그것과 함께 립스를 설치할 수 있습니다, 당신이 공식 파이피를 확인하는 것을 추천합니다.

다음과 같은 기술을 사용하는 투표된 최고의 솔루션importlib.util.find_spec그리고.sys.modules그리고 가져오기 예외를 잡는 것은 대부분의 패키지에 대해 작동하지만 일부 에지 경우에는 실패합니다.beautifulsouppackage) 수입품에 사용되는 패키지 이름이 다소 다른 경우(bs4이 경우)는 설치 파일 구성에 사용되는 것보다 많습니다.이러한 에지 사례의 경우 가져오기에 사용된 패키지 이름 대신 사용된 패키지 이름을 전달하지 않으면 이 솔루션이 작동하지 않습니다.requirements.txt또는pip설비

나의 사용 사례를 위해, 나는 설치된 패키지를 확인하는 패키지 체커를 작성해야 했습니다.requirements.txt그래서 이 해결책은 효과가 없었습니다.결국 제가 사용하게 된 것은.subprocess.check패키지 설치를 확인하기 위해 명시적으로 pip 모듈을 호출합니다.

import subprocess

for pkg in packages:
    try:
        subprocess.check_output('py -m pip show ' + pkg)
    except subprocess.CalledProcessError as ex:
        not_found.append(pkg)

다른 방법보다 조금 느리지만 안정적이고 엣지 케이스를 처리합니다.

2번 옵션으로 이동합니다.한다면ImportError되지 않음).sys.path).

아래에 주어진 스니펫을 사용할 수 있는 기회가 있습니까?이 코드를 실행하면 "모듈 팬더가 설치되지 않았습니다"가 반환됩니다.

a = "pandas"

try:
    import a
    print("module ",a," is installed")
except ModuleNotFoundError:
    print("module ",a," is not installed")

그러나 아래에 주어진 코드를 실행하면:

try:
    import pandas
    print("module is installed")
except ModuleNotFoundError:
    print("module is not installed")

"모듈 팬더가 설치되었습니다"를 반환합니다.

그들 사이의 차이점은 무엇입니까?

언급URL : https://stackoverflow.com/questions/1051254/check-if-python-package-is-installed

반응형