Python kurulumumdaki (UNIX sunucusu) bir Python modülünün listesini almak istiyorum.
Bilgisayarınızda yüklü olan Python modüllerinin listesini nasıl edinebilirsiniz?
help('modules')
python Kabuğu/İsteminde.
Şimdi, bu yöntemleri kendim denedim ve reklamı tam olarak ne oldu: Tüm modüller.
Ne yazık ki, gerçekten stdlib'i umursamıyorsun, bir python kurulumuyla ne elde ettiğini biliyorsun.
Gerçekten,Iyüklü olanı istiyorum.
Asıl şaşırtıcı olan, gayet iyi çalışan şeydi:
pip freeze
Hangi döndü:
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
"Şaşırtıcı" diyorum, çünkü paket yükleme aracı, bu işlevi bulmak için beklediğiniz tam yerdi, ancak 'donma' adı altında olmasa da, python ambalajı çok garip, bu aracın anlam ifade etmesinden korkuyorum. Pip 0.8.2, Python 2.7.
ipython
NAME _ içine "import
yazabilirsinizTab".
Standart Python yorumlayıcısına "help('modules')
" yazabilirsiniz.
Komut satırında kullanabilirsiniz pydoc
NAME _modules
name__.
Bir komut dosyasında, pkgutil.iter_modules()
arayın.
Pip 1.3 sürümünden bu yana, şunlara erişebilirsiniz:
pip list
Hangi "pip donma" için sözdizimsel şeker gibi görünüyor. Sürüm numaralarıyla birlikte kurulumunuza veya sanal makinenize özgü tüm modülleri listeler. Ne yazık ki, herhangi bir modülün güncel sürüm numarasını göstermiyor, bulaşıkları yıkıyor veya ayakkabılarınızı parlatmıyor.
Bunu şu anda kullanılan modülleri görmek için kullanıyorum:
import sys as s
s.modules.keys()
pitonunuzda çalışan tüm modülleri gösterir.
Tüm yerleşik modüller için kullanın:
s.modules
Hangi tüm modülleri içeren bir nesne ve ithal nesneleri.
Normal Shell'de sadece kullanın
pydoc modules
Pip 10'dan itibaren, kabul edilen cevap artık çalışmayacak. Geliştirme ekibi, get_installed_distributions
yordamına erişimi kaldırdı. Aynı şeyi yapmak için setuptools
dosyasında alternatif bir işlev vardır. Pip 10 ile çalışan alternatif bir sürüm:
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)
Lütfen önceki pip versiyonlarında da çalışıp çalışmadığını bana bildirin.
Kurulu paketleri Python Kabuğu'nda listelememiz gerekirse, help
komutunu aşağıdaki gibi kullanabiliriz
>>help('modules package')
OS X'te özel bir yüklü python 2.7 ile karşılaştım. Yüklü modülleri listelemek için X11'e ihtiyaç duydum (hem yardım hem de pydoc kullanarak).
X11 kurmadan tüm modülleri listeleyebilmek için http sunucusu olarak pydoc kullandım, yani:
pydoc -p 12345
Daha sonra tüm modülleri görmek için Safari'yi http://localhost:12345/
adresine yönlendirmek mümkündür.
pkgutil.iter_modules kullanarak çok basit arama
from pkgutil import iter_modules
a=iter_modules()
while True:
try: x=a.next()
except: break
if 'searchstr' in x[1]: print x[1]
pencerelerde, Bunu cmd cinsinden girin
c:\python\libs>python -m pip freeze
Paketlerin bir listesini almak için normalde pip list
kullanın (versiyonlu).
Bu elbette sanal bir ortamda da çalışır.
pip freeze
kullanmak dışında, sanal ortamlarıma yolk kurulumunu yapıyorum.
Bu çözüm, birincil olarak importlib
ve pkgutil
modüllerine dayanıyor ve CPython 3.4 ve CPython 3.5 ile çalışıyor, ancak CPython 2 için bir desteği yok.
Açıklama
sys.builtin_module_names
- tüm yerleşik modülleri adlandırır (cevabımı bak burada )pkgutil.iter_modules()
- kullanılabilir tüm modüller hakkında bilgi döndürürimportlib.util.find_spec()
- varsa, modülü içe aktarma hakkında bir bilgi döndürürBuiltinImporter
- yerleşik modüller için bir ithalatçı ( docs )SourceFileLoader
- standart bir Python modülü için bir ithalatçı (varsayılan olarak * .py uzantısına sahiptir) ( docs )ExtensionFileLoader
- paylaşılan kütüphane (C veya C++ ile yazılmış) gibi modüller için bir ithalatçıTam kod
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 __== '__main__':
main()
Kullanım
CPython3.5 için (kesilmiş)
$ 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*******************************)
CPython3.4 için (kesilmiş)
$ 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*******************************)
sys.modules
komutunu çalıştırın.pip
tarafından yüklendi), pip.get_installed_distributions()
dosyasına bakabilirsinizİkinci amaç için örnek kod:
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
pip freeze hepsini paket buluyor, ancak python paketlerinin bulunduğu tüm yolları listelemek için aşağıdaki komutu yazmanız yeterli.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Bunları dene
pip list
veya
pip freeze
Bu, Adam Matan'ın cevabı (kabul edilen) esinlenerek:
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))
hangi bir tablo şeklinde yazdırır
19:33 [email protected] [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
------------------------------------------- -------------- ------
böylece Sudo
ile ve onsuz hangi paketleri kurduğunuzu kolayca ayırt edebilirsiniz.
Bir kenara not: Bir paketi bir defa Sudo
aracılığıyla ve bir kez olmadan kurduğumda birinin öncelikli olduğunu ve diğerinin listelenmediğini (sadece bir konum gösteriliyor) fark ettim. Yerel dizindeki tek listenin listelendiğine inanıyorum. Bu geliştirilebilir.
Pek çok fikir var, başlangıçta bu ikisi üzerinde kafa yoruyorum:
pip
eksileri: her zaman yüklü değil
help ('modüller')
eksileri: konsola çıktı; kırık modüllerle (bkz. ubuntu ...) segfault
Temel kütüphaneleri kullanarak ve eski python 2.x ile uyumlu, kolay bir yaklaşıma ihtiyacım var
Ve ışığı görüyorum: listmodules.py
2.5'teki dokümantasyon kaynak dizininde gizli bir Python kurulumu için mevcut tüm modülleri listeleyen küçük bir komut dosyasıdır.
Artıları:
yalnızca imp, sys, os, re, time kullanır
python 1.5.2 ve daha yeni sürümlerde çalışmak üzere tasarlandı
kaynak kodu oldukça küçüktür, bu nedenle örneğin buggy modüllerinin bir istisna listesini iletmek için kolayca onarabilirsiniz.
Bir kediyi cildin pek çok yolu var.
En basit yol, pydoc
işlevini doğrudan Kabuktan aşağıdakilerle kullanmaktır:pydoc modules
Ancak daha fazla bilgi için pip-date adlı aracı kullanarak size kurulum tarihlerini de söyleyin.pip install pip-date
Paketlerin belirli bir sürümünü varsayılan olarak AWS Lambda'da bulmam gerekiyordu. Bunu, bu sayfadaki fikirlerin bir karışımı ile yaptım. Gelecek için paylaşıyorum.
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
],
}
Benim keşfettiğim, sağlanan boto3 kütüphanesinin eski olduğunu ve kodumun başarısız olması benim suçum değildi. Sadece projeme boto3 ve botocore eklemem gerekiyordu. Ama bu olmadan kodumun kötü olduğunu düşünerek kafama çarpıyor olurdum.
{
"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
},
...
Benim keşfettiklerim ayrıca resmen yayınladıkları 'den farklıydı. Bunu yazarken:
- İşletim sistemi - Amazon Linux
- AMI - amzn-AMI-hvm-2017.03.1.20170812-x86_64-gp2
- Linux çekirdeği - 4.14.77-70.59.amzn1.x86_64
- JavaScript için AWS SDK - 2.290.0 \
- Python için SDK (Boto 3) - 3-1.7.74 botocore-1.10.74
Terminalde veya IPython'da:
help('modules')
sonra
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
Bir Python programından pip list
nasıl aranacağını merak eden herkes için aşağıdakileri kullanabilirsiniz:
import pip
pip.main(['list]) # this will print all the packages