Tôi muốn có một danh sách các mô-đun Python, trong bản cài đặt Python của tôi (máy chủ UNIX).
Làm thế nào bạn có thể nhận được một danh sách các mô-đun Python được cài đặt trong máy tính của bạn?
Tôi muốn có một danh sách các mô-đun Python, trong bản cài đặt Python của tôi (máy chủ UNIX).
Làm thế nào bạn có thể nhận được một danh sách các mô-đun Python được cài đặt trong máy tính của bạn?
Câu trả lời:
50 xu của tôi để nhận pip freeze
danh sách giống như từ tập lệnh Python:
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)
Như một (quá dài) một lớp lót:
sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
Tặng:
['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']
Giải pháp này áp dụng cho phạm vi hệ thống hoặc phạm vi môi trường ảo và bao gồm các gói được cài đặt bởi setuptools
, pip
và (không cho phép ) easy_install
.
Tôi đã thêm kết quả của cuộc gọi này vào máy chủ bình của mình, vì vậy khi tôi gọi nó với http://example.com/exampleServer/environment
danh sách các gói được cài đặt trên virtualenv của máy chủ. Nó làm cho việc gỡ lỗi dễ dàng hơn rất nhiều.
Tôi đã nhận thấy một hành vi kỳ lạ của kỹ thuật này - khi trình thông dịch Python được gọi trong cùng thư mục với một setup.py
tệp, nó không liệt kê gói được cài đặt bởi setup.py
.
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $
Nhân bản một repo git với setup.py
(test_env) $ git clone https://github.com/behave/behave.git
Cloning into 'behave'...
remote: Reusing existing pack: 4350, done.
remote: Total 4350 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
Resolving deltas: 100% (2388/2388), done.
Checking connectivity... done.
Chúng tôi đã cư xử setup.py
trong /tmp/behave
:
(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Cài đặt gói python từ git repo
(test_env) $ cd /tmp/behave && pip install .
running install
...
Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
Finished processing dependencies for behave==1.2.5a1
/tmp
>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp'
/tmp/behave
>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp/behave'
behave==1.2.5a1
là mất tích từ ví dụ thứ hai, bởi vì thư mục làm việc chứa behave
's setup.py
tập tin.
Tôi không thể tìm thấy bất kỳ tài liệu tham khảo về vấn đề này trong tài liệu. Có lẽ tôi sẽ mở một lỗi cho nó.
import pkg_resources; installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set]
AttributeError: module 'pip' has no attribute 'get_installed_distributions'
.
help('modules')
trong trình bao / nhắc Python.
pydoc modules
hoạt động. Bạn nên gửi nó như một câu trả lời.
python -c 'help("modules")'
Bây giờ, những phương pháp này tôi đã thử bản thân mình và tôi đã nhận được chính xác những gì được quảng cáo: Tất cả các mô-đun.
Than ôi, thực sự bạn không quan tâm nhiều đến stdlib, bạn biết những gì bạn nhận được với một cài đặt python.
Thực sự, tôi muốn những thứ mà tôi đã cài đặt.
Điều thực sự, đáng ngạc nhiên, chỉ hoạt động tốt là:
pip freeze
Mà trả lại:
Fabric==0.9.3
apache-libcloud==0.4.0
bzr==2.3b4
distribute==0.6.14
docutils==0.7
greenlet==0.3.1
ipython==0.10.1
iterpipes==0.4
libxml2-python==2.6.21
Tôi nói "thật đáng ngạc nhiên" bởi vì công cụ cài đặt gói là nơi chính xác mà người ta mong đợi để tìm thấy chức năng này, mặc dù không có tên 'đóng băng' nhưng bao bì trăn rất kỳ lạ, tôi rất lúng túng rằng công cụ này có ý nghĩa. Pip 0.8.2, Python 2.7.
Kể từ phiên bản pip 1.3, bạn đã có quyền truy cập vào:
pip list
Mà dường như là cú pháp đường cho "pip đóng băng". Nó sẽ liệt kê tất cả các mô-đun cụ thể cho cài đặt hoặc virtualenv của bạn, cùng với số phiên bản của chúng. Thật không may, nó không hiển thị số phiên bản hiện tại của bất kỳ mô-đun nào, cũng không rửa bát hoặc đánh giày.
pip list --local
để phân biệt giữa virtualenv
các gói trang web toàn cầu, được thảo luận ở đây .
pip list
là đơn giản nhất và tốt nhất. Dưới đây là các tùy chọn và chi tiết.
Trong ipython
bạn có thể gõ " import
Tab".
Trong trình thông dịch Python chuẩn, bạn có thể nhập " help('modules')
".
Tại dòng lệnh, bạn có thể sử dụng .pydoc
modules
Trong một kịch bản, gọi pkgutil.iter_modules()
.
pkgutil.iter_modules()
hoạt động, giải pháp pip ở trên không liệt kê tất cả các gói, chỉ những gói được cài đặt qua pip.
python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'
. Nó sẽ kết xuất tất cả các tên mô-đun thành một danh sách Python thực sự lớn. Các x[1]
bit được sử dụng để nhổ ra tên mô-đun của các bộ được tạo ra bởi pkgutil.iter_modules()
.
Tôi chỉ sử dụng điều này để xem các mô-đun hiện đang sử dụng:
import sys as s
s.modules.keys()
trong đó hiển thị tất cả các mô-đun chạy trên python của bạn.
Đối với tất cả các mô-đun tích hợp sử dụng:
s.modules
Đó là một dict chứa tất cả các mô-đun và các đối tượng nhập khẩu.
pydoc
không pip
cài đặt (NAS trong trường hợp của tôi).
help('modules')
chỉ treo mà không có phản hồi cho tôi. Nhưng cách tiếp cận này có hiệu sys
quả hoàn hảo
Trong vỏ bình thường chỉ cần sử dụng
pydoc modules
py -m pydoc modules
trong cmd hoặc Powershell.
pydoc modules
không hoạt động với tôi trong Windows 10 với Python 3.6, nhưng sửa đổi @VKK: py -m pydoc modules
không hoạt động trong cmd / Powershell.
Kể từ pip 10, câu trả lời được chấp nhận sẽ không còn hoạt động. Nhóm phát triển đã loại bỏ quyền truy cập vào get_installed_distributions
thói quen. Có một chức năng thay thế trong việc setuptools
làm điều tương tự. Đây là phiên bản thay thế hoạt động với pip 10:
import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
Vui lòng cho tôi biết nếu nó cũng sẽ không hoạt động trong các phiên bản trước của pip.
pip freeze
; độ sâu kiến thức của tôi về chủ đề này là khá hạn chế. Tôi loay hoay tìm cách giải quyết khi câu trả lời được chấp nhận không hiệu quả với tôi và tôi đã thử kết hợp nó với một câu trả lời liên quan đến setuptools
và khiến nó hoạt động.
get_installed_distributions routine
.
setuptools
.
Tôi thường sử dụng pip list
để có được một danh sách các gói (với phiên bản).
Điều này hoạt động trong một môi trường ảo, tất nhiên. Để hiển thị những gì được cài đặt chỉ trong môi trường ảo (không phải gói toàn cầu), hãy sử dụngpip list --local
.
Đây là tài liệu hiển thị tất cả các pip list
tùy chọn có sẵn , với một số ví dụ tốt.
Tìm kiếm rất đơn giản bằng pkgutil.iter_modules
from pkgutil import iter_modules
a=iter_modules()
while True:
try: x=a.next()
except: break
if 'searchstr' in x[1]: print x[1]
for m in iter_modules()
và nó đã làm việc như là tốt.
Tôi đã chạy vào một python 2.7 được cài đặt tùy chỉnh trên OS X. Nó yêu cầu X11 để liệt kê các mô-đun được cài đặt (cả sử dụng trợ giúp và pydoc).
Để có thể liệt kê tất cả các mô-đun mà không cần cài đặt X11, tôi đã chạy pydoc dưới dạng máy chủ http, tức là:
pydoc -p 12345
Sau đó, có thể chỉ đạo Safari http://localhost:12345/
để xem tất cả các mô-đun.
Thử những thứ này xem
pip list
hoặc là
pip freeze
Trong thiết bị đầu cuối hoặc IPython, gõ:
help('modules')
sau đó
In [1]: import #import press-TAB
Display all 631 possibilities? (y or n)
ANSI audiodev markupbase
AptUrl audioop markupsafe
ArgImagePlugin avahi marshal
BaseHTTPServer axi math
Bastion base64 md5
BdfFontFile bdb mhlib
BmpImagePlugin binascii mimetools
BufrStubImagePlugin binhex mimetypes
CDDB bisect mimify
CDROM bonobo mmap
CGIHTTPServer brlapi mmkeys
Canvas bsddb modulefinder
CommandNotFound butterfly multifile
ConfigParser bz2 multiprocessing
ContainerIO cPickle musicbrainz2
Cookie cProfile mutagen
Crypto cStringIO mutex
CurImagePlugin cairo mx
DLFCN calendar netrc
DcxImagePlugin cdrom new
Dialog cgi nis
DiscID cgitb nntplib
DistUpgrade checkbox ntpath
Giải pháp này là chính dựa trên các mô-đun importlib
và pkgutil
hoạt động với CPython 3.4 và CPython 3.5, nhưng không hỗ trợ cho CPython 2.
Giải trình
sys.builtin_module_names
- tên tất cả các mô-đun tích hợp (xem câu trả lời của tôi ở đây )pkgutil.iter_modules()
- trả về thông tin về tất cả các mô-đun có sẵnimportlib.util.find_spec()
- trả về thông tin về việc nhập mô-đun, nếu tồn tạiBuiltinImporter
- một nhà nhập khẩu cho các mô-đun tích hợp ( tài liệu )SourceFileLoader
- trình nhập cho mô-đun Python chuẩn (theo mặc định có phần mở rộng * .py) ( tài liệu )ExtensionFileLoader
- nhà nhập khẩu cho các mô-đun dưới dạng thư viện dùng chung (được viết trên C hoặc C ++)Mã đầy đủ
import sys
import os
import shutil
import pkgutil
import importlib
import collections
if sys.version_info.major == 2:
raise NotImplementedError('CPython 2 is not supported yet')
def main():
# name this file (module)
this_module_name = os.path.basename(__file__).rsplit('.')[0]
# dict for loaders with their modules
loaders = collections.OrderedDict()
# names`s of build-in modules
for module_name in sys.builtin_module_names:
# find an information about a module by name
module = importlib.util.find_spec(module_name)
# add a key about a loader in the dict, if not exists yet
if module.loader not in loaders:
loaders[module.loader] = []
# add a name and a location about imported module in the dict
loaders[module.loader].append((module.name, module.origin))
# all available non-build-in modules
for module_name in pkgutil.iter_modules():
# ignore this module
if this_module_name == module_name[1]:
continue
# find an information about a module by name
module = importlib.util.find_spec(module_name[1])
# add a key about a loader in the dict, if not exists yet
loader = type(module.loader)
if loader not in loaders:
loaders[loader] = []
# add a name and a location about imported module in the dict
loaders[loader].append((module.name, module.origin))
# pretty print
line = '-' * shutil.get_terminal_size().columns
for loader, modules in loaders.items():
print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader))
for module in modules:
print('{0:30} | {1}'.format(module[0], module[1]))
if __name__ == '__main__':
main()
Sử dụng
Đối với CPython3.5 (cắt ngắn)
$ python3.5 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
30: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast | built-in
_codecs | built-in
_collections | built-in
_functools | built-in
_imp | None
_io | built-in
_locale | built-in
_operator | built-in
_signal | built-in
_sre | built-in
_stat | built-in
_string | built-in
_symtable | built-in
_thread | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
227: <class '_frozen_importlib_external.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__ | /usr/local/lib/python3.5/__future__.py
_bootlocale | /usr/local/lib/python3.5/_bootlocale.py
_collections_abc | /usr/local/lib/python3.5/_collections_abc.py
_compat_pickle | /usr/local/lib/python3.5/_compat_pickle.py
_compression | /usr/local/lib/python3.5/_compression.py
_dummy_thread | /usr/local/lib/python3.5/_dummy_thread.py
_markupbase | /usr/local/lib/python3.5/_markupbase.py
_osx_support | /usr/local/lib/python3.5/_osx_support.py
_pydecimal | /usr/local/lib/python3.5/_pydecimal.py
_pyio | /usr/local/lib/python3.5/_pyio.py
_sitebuiltins | /usr/local/lib/python3.5/_sitebuiltins.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64: <class '_frozen_importlib_external.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bisect | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so
_bz2 | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so
_codecs_cn | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so
_codecs_hk | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so
_codecs_iso2022 | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so
(****************************truncated*******************************)
Đối với CPython3.4 (cắt ngắn)
$ python3.4 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
54: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast | built-in
_bisect | built-in
_codecs | built-in
_collections | built-in
_datetime | built-in
_elementtree | built-in
_functools | built-in
_heapq | built-in
_imp | None
_io | built-in
_locale | built-in
_md5 | built-in
_operator | built-in
_pickle | built-in
_posixsubprocess | built-in
_random | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246: <class '_frozen_importlib.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__ | /usr/lib/python3.4/__future__.py
_bootlocale | /usr/lib/python3.4/_bootlocale.py
_collections_abc | /usr/lib/python3.4/_collections_abc.py
_compat_pickle | /usr/lib/python3.4/_compat_pickle.py
_dummy_thread | /usr/lib/python3.4/_dummy_thread.py
_markupbase | /usr/lib/python3.4/_markupbase.py
_osx_support | /usr/lib/python3.4/_osx_support.py
_pyio | /usr/lib/python3.4/_pyio.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
44: <class '_frozen_importlib.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bz2 | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so
_codecs_cn | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so
_codecs_hk | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so
_codecs_iso2022 | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so
_codecs_jp | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so
_codecs_kr | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so
_codecs_tw | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so
_crypt | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so
(****************************truncated*******************************)
pip
- hệ thống quản lý gói được sử dụng để cài đặt và quản lý các gói phần mềm được viết bằng Python và kết quả pip.get_installed_distributions()
trả về các mô-đun được cài đặt với pip. Câu trả lời của tôi hoàn toàn dựa trên thư viện chuẩn của Python và bao gồm tất cả các mô-đun có sẵn để nhập. Một nhược điểm lớn nhất câu trả lời của tôi - không hỗ trợ cho CPython 2.
**truncated**
, trong đó một đầu ra bị cắt ngắn. Có thể bạn không cẩn thận, nhưng nếu không, vì vậy để gửi cho tôi thông tin về hệ thống của bạn và việc triển khai Python, tôi sẽ thực hiện nghiên cứu bổ sung để khắc phục nó.
Cảnh báo: Adam Matan không khuyến khích sử dụng này trong pip> 10.0. Ngoài ra, hãy đọc bình luận của @ sinoroc bên dưới
Điều này được lấy cảm hứng từ câu trả lời của Adam Matan (người được chấp nhận):
import tabulate
try:
from pip import get_installed_distributions
except:
from pip._internal.utils.misc import get_installed_distributions
tabpackages = []
for _, package in sorted([('%s %s' % (i.location, i.key), i) for i in get_installed_distributions()]):
tabpackages.append([package.location, package.key, package.version])
print(tabulate.tabulate(tabpackages))
sau đó in ra một bảng dưới dạng
19:33 pi@rpi-v3 [iot-wifi-2] ~/python$ python installed_packages.py
------------------------------------------- -------------- ------
/home/pi/.local/lib/python2.7/site-packages enum-compat 0.0.2
/home/pi/.local/lib/python2.7/site-packages enum34 1.1.6
/home/pi/.local/lib/python2.7/site-packages pexpect 4.2.1
/home/pi/.local/lib/python2.7/site-packages ptyprocess 0.5.2
/home/pi/.local/lib/python2.7/site-packages pygatt 3.2.0
/home/pi/.local/lib/python2.7/site-packages pyserial 3.4
/usr/local/lib/python2.7/dist-packages bluepy 1.1.1
/usr/local/lib/python2.7/dist-packages click 6.7
/usr/local/lib/python2.7/dist-packages click-datetime 0.2
/usr/local/lib/python2.7/dist-packages construct 2.8.21
/usr/local/lib/python2.7/dist-packages pyaudio 0.2.11
/usr/local/lib/python2.7/dist-packages tabulate 0.8.2
------------------------------------------- -------------- ------
cho phép bạn sau đó dễ dàng nhận ra gói nào bạn đã cài đặt có và không có sudo
.
Một lưu ý sang một bên: Tôi nhận thấy rằng khi tôi cài đặt gói một lần qua sudo
và một lần mà không có, thì một ưu tiên sẽ không được liệt kê (chỉ một vị trí được hiển thị). Tôi tin rằng chỉ có một trong thư mục địa phương được liệt kê. Điều này có thể được cải thiện.
pip
một lần và sau đó thoát. Nó dường như là một vấn đề mà hành vi có thể thay đổi.
_internal
). Tất cả trong tất cả, nó rõ ràng hoạt động nhưng là thực hành xấu. Có những lựa chọn thay thế tốt hơn, một số trong các câu trả lời khác cho câu hỏi này.
Ngoài việc sử dụng, pip freeze
tôi đã cài đặt lòng đỏ trong môi trường ảo của mình.
Trong trường hợp bạn đã cài đặt bản phân phối trăn anaconda , bạn cũng có thể sử dụng
$conda list
ngoài các giải pháp được mô tả ở trên.
conda install
, nó sẽ hoạt động :)
sys.modules
pip
), bạn có thể nhìn vàopip.get_installed_distributions()
Đối với mục đích thứ hai, mã ví dụ:
import pip
for package in pip.get_installed_distributions():
name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
key = package.key # sqlalchemy, django, flask-oauthlib
module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib
location = package.location # virtualenv lib directory etc.
version = package.version # version number
/usr/bin/python
hay người đến từ python.org ? Đối với cái trước, tôi có thể sử dụng sys.modules
mà không có vấn đề.
system.modules
thay vì sys.modules
.
Chạy phần sau trong trình soạn thảo python hoặc IPython của bạn
import pkg_resources;
installed_packages = {d.project_name: d.version for d in pkg_resources.working_set}
print(installed_packages)
Đọc các câu trả lời khác và kết hợp lại với nhau, đây là cách nhanh nhất và dễ nhất trong Python
Pip đóng băng tất cả các gói tìm kiếm tuy nhiên người ta có thể chỉ cần viết lệnh sau để liệt kê tất cả các đường dẫn trong đó các gói python.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Có nhiều ý tưởng, ban đầu tôi đang suy nghĩ về hai điều này:
pip
Nhược điểm: không phải lúc nào cũng được cài đặt
trợ giúp ('mô-đun')
Nhược điểm: đầu ra cho bàn điều khiển; với các mô-đun bị hỏng (xem ubfox ...) có thể segfault
Tôi cần một cách tiếp cận dễ dàng, sử dụng các thư viện cơ bản và tương thích với python cũ 2.x
Và tôi thấy ánh sáng: listmodules.py
Ẩn trong thư mục nguồn tài liệu trong 2.5 là một tập lệnh nhỏ liệt kê tất cả các mô-đun có sẵn để cài đặt Python.
Ưu điểm:
chỉ sử dụng imp, sys, os, re, time
được thiết kế để chạy trên Python 1.5.2 và mới hơn
mã nguồn thực sự nhỏ gọn, vì vậy bạn có thể dễ dàng sửa đổi nó, ví dụ để vượt qua một danh sách ngoại lệ của các mô-đun lỗi (không thử nhập chúng)
Tôi cần tìm phiên bản cụ thể của các gói có sẵn theo mặc định trong AWS Lambda. Tôi đã làm như vậy với một mashup ý tưởng từ trang này. Tôi đang chia sẻ nó cho hậu thế.
import pkgutil
__version__ = '0.1.1'
def get_ver(name):
try:
return str(__import__(name).__version__)
except:
return None
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': [{
'path': m.module_finder.path,
'name': m.name,
'version': get_ver(m.name),
} for m in list(pkgutil.iter_modules())
#if m.module_finder.path == "/var/runtime" # Uncomment this if you only care about a certain path
],
}
Những gì tôi phát hiện ra là thư viện boto3 được cung cấp đã hết hạn và đó không phải là lỗi của tôi khi mã của tôi bị lỗi. Tôi chỉ cần thêm boto3 và botocore vào dự án của mình. Nhưng nếu không có điều này, tôi sẽ đập đầu vào suy nghĩ rằng mã của tôi là xấu.
{
"statusCode": 200,
"body": [
{
"path": "/var/task",
"name": "lambda_function",
"version": "0.1.1"
},
{
"path": "/var/runtime",
"name": "bootstrap",
"version": null
},
{
"path": "/var/runtime",
"name": "boto3",
"version": "1.9.42"
},
{
"path": "/var/runtime",
"name": "botocore",
"version": "1.12.42"
},
{
"path": "/var/runtime",
"name": "dateutil",
"version": "2.7.5"
},
{
"path": "/var/runtime",
"name": "docutils",
"version": "0.14"
},
{
"path": "/var/runtime",
"name": "jmespath",
"version": "0.9.3"
},
{
"path": "/var/runtime",
"name": "lambda_runtime_client",
"version": null
},
{
"path": "/var/runtime",
"name": "lambda_runtime_exception",
"version": null
},
{
"path": "/var/runtime",
"name": "lambda_runtime_marshaller",
"version": null
},
{
"path": "/var/runtime",
"name": "s3transfer",
"version": "0.1.13"
},
{
"path": "/var/runtime",
"name": "six",
"version": "1.11.0"
},
{
"path": "/var/runtime",
"name": "test_bootstrap",
"version": null
},
{
"path": "/var/runtime",
"name": "test_lambda_runtime_client",
"version": null
},
{
"path": "/var/runtime",
"name": "test_lambda_runtime_marshaller",
"version": null
},
{
"path": "/var/runtime",
"name": "urllib3",
"version": "1.24.1"
},
{
"path": "/var/lang/lib/python3.7",
"name": "__future__",
"version": null
},
...
Những gì tôi phát hiện ra cũng khác với những gì họ chính thức xuất bản . Tại thời điểm viết này:
- Hệ điều hành - Amazon Linux
- AMI - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
- Nhân Linux - 4.14.77-70.59.amzn1.x86_64
- SDK AWS cho JavaScript - 2.290.0 \
- SDK cho Python (Boto 3) - 3-1.7.74 botocore-1.10.74
Cài đặt
pip install pkgutil
Mã
import pkgutil
for i in pkgutil.iter_modules(None): # returns a tuple (path, package_name, ispkg_flag)
print(i[1]) #or you can append it to a list
Đầu ra mẫu:
multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil
Đây là một giải pháp mã python sẽ trả về một danh sách các mô-đun được cài đặt. Người ta có thể dễ dàng sửa đổi mã để bao gồm số phiên bản.
import subprocess
import sys
from pprint import pprint
installed_packages = reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze']).decode('utf-8')
installed_packages = installed_packages.split('\r\n')
installed_packages = [pkg.split('==')[0] for pkg in installed_packages if pkg != '']
pprint(installed_packages)
Đối với bất kỳ ai tự hỏi làm thế nào để gọi pip list
từ một chương trình Python, bạn có thể sử dụng như sau:
import pip
pip.main(['list]) # this will print all the packages
Từ vỏ
ls site-packages
Nếu điều đó không hữu ích, bạn có thể làm điều này.
import sys
import os
for p in sys.path:
print os.listdir( p )
Và xem những gì sản xuất.