Python 패키지의 종속성을 찾는 방법
프로그래밍 방식으로 Python 패키지의 종속성 목록을 얻으려면 어떻게해야합니까?
표준 setup.py
에 문서화되어 있지만 Python이나 명령 줄 에서 쉽게 액세스 할 수있는 방법을 찾을 수 없습니다 .
이상적으로는 다음과 같은 것을 찾고 있습니다.
$ pip install somepackage --only-list-deps
kombu>=3.0.8
billiard>=3.3.0.13
boto>=2.26
또는:
>>> import package_deps
>>> package = package_deps.find('somepackage')
>>> print package.dependencies
['kombu>=3.0.8', 'billiard>=3.3.0.13', 'boto>=2.26']
참고로, 패키지를 가져 와서 참조 된 모든 모듈을 찾는 것에 대해 말하는 것이 아닙니다. 대부분의 종속 패키지를 찾을 수 있지만 필요한 최소 버전 번호를 찾을 수 없습니다. 그것은 setup.py에만 저장됩니다.
pip show [package name]
명령 외에도 pipdeptree
.
그냥 해
$ pip install pipdeptree
그런 다음 실행
$ pipdeptree
그리고 그것은 당신에게 트리 형태로 당신의 의존성을 보여줄 것입니다.
flake8==2.5.0
- mccabe [required: >=0.2.1,<0.4, installed: 0.3.1]
- pep8 [required: !=1.6.0,>=1.5.7,!=1.6.1,!=1.6.2, installed: 1.5.7]
- pyflakes [required: >=0.8.1,<1.1, installed: 1.0.0]
ipdb==0.8
- ipython [required: >=0.10, installed: 1.1.0]
이 프로젝트는 https://github.com/naiquevin/pipdeptree에 있으며 여기에서 사용 정보도 찾을 수 있습니다.
show
에서 명령을 사용해보십시오 pip
. 예를 들면 다음과 같습니다.
$ pip show tornado
---
Name: tornado
Version: 4.1
Location: *****
Requires: certifi, backports.ssl-match-hostname
업데이트 (지정된 버전으로 deps 검색) :
from pip._vendor import pkg_resources
_package_name = 'somepackage'
_package = pkg_resources.working_set.by_key[_package_name]
print([str(r) for r in _package.requires()]) # retrieve deps from setup.py
Output: ['kombu>=3.0.8',
'billiard>=3.3.0.13',
'boto>=2.26']
Alex의 대답은 좋습니다 (+1). 파이썬에서 :
pip._vendor.pkg_resources.working_set.by_key['twisted'].requires()
다음과 같은 것을 반환해야합니다.
[Requirement.parse('zope.interface>=3.6.0')]
여기서 twisted는 패키지의 이름이며 사전에서 찾을 수 있습니다.
pip._vendor.pkg_resources.WorkingSet().entry_keys
모두 나열하려면 :
dict = pip._vendor.pkg_resources.WorkingSet().entry_keys
for key in dict:
for name in dict[key]:
req =pip._vendor.pkg_resources.working_set.by_key[name].requires()
print('pkg {} from {} requires {}'.format(name,
key,
req))
다음과 같은 목록을 제공해야합니다.
pkg pyobjc-framework-syncservices from /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC requires [Requirement.parse('pyobjc-core>=2.5.1'), Requirement.parse('pyobjc-framework-Cocoa>=2.5.1'), Requirement.parse('pyobjc-framework-CoreData>=2.5.1')]
이 기사 에 따라 파이썬으로 시도하십시오 .
import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
다음과 같이 표시됩니다.
['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24',
'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3',
'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1',
'werkzeug==0.9.4']
여기에 꽤 많은 답변이 프로그램에서 사용하기 위해 가져 오는 pip를 보여줍니다. pip에 대한 문서는 이러한 pip 사용에 대해 강력히 권장합니다 .
Instead of accessing pkg_resources
via the pip import, you can actually just import pkg_resources
directly and use the same logic (which is actually one of the suggested solutions in the pip docs linked for anyone wanting to see package meta information programmatically) .
import pkg_resources
_package_name = 'yourpackagename'
def get_dependencies_with_semver_string():
package = pkg_resources.working_set.by_key[_package_name]
return [str(r) for r in package.requires()]
If you're having some trouble finding out exactly what your package name is, the WorkingSet
instance returned by pkg_resources.working_set
implements __iter__
so you can print all of them and hopefully spot yours in there :)
i.e.
import pkg_resources
def print_all_in_working_set():
ws = pkg_resources.working_set
for package_name in ws:
print(ws)
This works with both python 2 and 3 (though you'll need to adjust the print statements for python2)
All of the above solutions are correct but somewhat inefficient. If you're using a Mac, the best way would be to use the pip list
command.
참고URL : https://stackoverflow.com/questions/29751572/how-to-find-a-python-packages-dependencies
'Programing' 카테고리의 다른 글
dmp 파일 및 로그 파일에서 Oracle 데이터베이스를 가져 오는 방법은 무엇입니까? (0) | 2020.11.15 |
---|---|
Twitter Bootstrap 3, 세로 중앙 콘텐츠 (0) | 2020.11.15 |
표현 트리의 실제 사용 (0) | 2020.11.15 |
registerNatives () 메소드는 무엇을합니까? (0) | 2020.11.15 |
.join ()이 함수 인수와 함께 작동하지 않는 이유는 무엇입니까? (0) | 2020.11.15 |