ฉันต้องการรับรายการโมดูล Python ซึ่งอยู่ในการติดตั้ง Python ของฉัน (เซิร์ฟเวอร์ UNIX)
คุณจะรับรายการโมดูล Python ที่ติดตั้งในคอมพิวเตอร์ได้อย่างไร
ฉันต้องการรับรายการโมดูล Python ซึ่งอยู่ในการติดตั้ง Python ของฉัน (เซิร์ฟเวอร์ UNIX)
คุณจะรับรายการโมดูล Python ที่ติดตั้งในคอมพิวเตอร์ได้อย่างไร
คำตอบ:
50 เซ็นต์ของฉันสำหรับการรับpip freeze
รายการเหมือนจากสคริปต์ 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)
ในฐานะหนึ่งซับ (ยาวเกินไป) หนึ่งซับ:
sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
ให้:
['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']
การแก้ปัญหานี้นำไปใช้กับขอบเขตระบบหรือขอบเขตสภาพแวดล้อมเสมือนจริงและแพคเกจติดตั้งโดยครอบคลุมsetuptools
, pip
และ ( พระเจ้าห้ามeasy_install
)
ฉันเพิ่มผลลัพธ์ของการโทรนี้ไปยังเซิร์ฟเวอร์ขวดของฉันดังนั้นเมื่อฉันเรียกมันด้วยhttp://example.com/exampleServer/environment
ฉันจะได้รับรายการแพ็คเกจที่ติดตั้งบน virtualenv ของเซิร์ฟเวอร์ ทำให้การดีบักง่ายขึ้นมาก
ฉันได้สังเกตเห็นพฤติกรรมแปลก ๆ ของเทคนิคนี้ - เมื่อล่ามหลามถูกเรียกในไดเรกทอรีเดียวกันเป็นไฟล์ก็ไม่ได้แสดงรายการแพคเกจติดตั้งโดยsetup.py
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) $
โคลน repo คอมไพล์ด้วย 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.
เรามีพฤติกรรมsetup.py
ใน/tmp/behave
:
(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
ติดตั้งแพ็กเกจหลามจาก repo git
(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
หายไปจากตัวอย่างที่สองเพราะไดเรกทอรีการทำงานมีbehave
's setup.py
ไฟล์
ฉันไม่พบการอ้างอิงถึงปัญหานี้ในเอกสารประกอบ บางทีฉันจะเปิดข้อบกพร่องสำหรับมัน
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')
ใน Python เชลล์ / พรอมต์
pydoc modules
งานได้ คุณควรส่งมันเป็นคำตอบ
python -c 'help("modules")'
ตอนนี้วิธีการเหล่านี้ฉันลองด้วยตัวเองและฉันได้รับสิ่งที่โฆษณา: โมดูลทั้งหมด
อนิจจาจริงๆคุณไม่สนใจ stdlib มากนักคุณรู้ว่าคุณจะได้อะไรจากการติดตั้ง python
จริง ๆ แล้วฉันต้องการสิ่งที่ฉันติดตั้ง
สิ่งที่น่าประหลาดใจจริงๆก็คือการทำงานได้ดีคือ:
pip freeze
ซึ่งส่งคืน:
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
ฉันพูดว่า "น่าประหลาดใจ" เพราะเครื่องมือติดตั้งแพคเกจเป็นที่แน่นอนที่ใคร ๆ ก็คาดหวังว่าจะได้พบกับฟังก์ชั่นนี้แม้ว่าจะไม่ได้อยู่ภายใต้ชื่อ 'หยุด' แต่บรรจุภัณฑ์หลามนั้นแปลกมาก Pip 0.8.2, Python 2.7
ตั้งแต่ pip เวอร์ชั่น 1.3 คุณสามารถเข้าถึง:
pip list
ซึ่งดูเหมือนว่าจะเป็นน้ำตาล syntactic สำหรับ "แช่แข็ง pip" มันจะแสดงรายการโมดูลทั้งหมดโดยเฉพาะการติดตั้งหรือ virtualenv ของคุณพร้อมกับหมายเลขรุ่นของพวกเขา น่าเสียดายที่มันไม่ได้แสดงหมายเลขเวอร์ชั่นปัจจุบันของโมดูลใด ๆ และไม่ล้างจานหรือขัดรองเท้า
pip list --local
สำหรับความแตกต่างระหว่างvirtualenv
และเว็บไซต์ทั่วโลกแพคเกจกล่าวถึงที่นี่
pip list
เป็นสิ่งที่ง่ายและดีที่สุด นี่คือตัวเลือกและรายละเอียด
ในipython
คุณสามารถพิมพ์ " import
Tab"
ในตัวแปล Python มาตรฐานคุณสามารถพิมพ์ " help('modules')
"
ในบรรทัดคำสั่งที่คุณสามารถใช้pydoc
modules
pkgutil.iter_modules()
ในสคริปต์โทร
pkgutil.iter_modules()
ใช้งานได้โซลูชัน pip ดังกล่าวไม่ได้แสดงรายการแพ็คเกจทั้งหมดเพียงรายการที่ติดตั้งผ่าน pip
python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'
. ควรทิ้งชื่อโมดูลทั้งหมดเป็นรายการ Python ที่มีขนาดใหญ่จริงๆ x[1]
บิตจะใช้ในการถอนออกชื่อโมดูลของ tuples pkgutil.iter_modules()
ที่สร้างขึ้นโดย
ฉันแค่ใช้สิ่งนี้เพื่อดูโมดูลที่ใช้อยู่ในปัจจุบัน:
import sys as s
s.modules.keys()
ซึ่งจะแสดงโมดูลทั้งหมดที่ทำงานบนหลามของคุณ
สำหรับโมดูลในตัวทั้งหมดใช้:
s.modules
ซึ่งเป็น dict ที่มีโมดูลทั้งหมดและนำเข้าวัตถุ
pydoc
มิได้pip
ติดตั้ง (ก NAS ในกรณีของฉัน)
help('modules')
แค่แฮงค์โดยไม่มีการตอบสนองสำหรับฉัน แต่วิธีการนี้มีsys
ผลงานสมบูรณ์แบบ
ในเปลือกปกติเพียงใช้
pydoc modules
py -m pydoc modules
ใน cmd หรือ Powershell
pydoc modules
ไม่ทำงานสำหรับฉันใน Windows 10 ที่มี Python 3.6 แต่การแก้ไข @VKK: py -m pydoc modules
ทำงานใน cmd / Powershell
ตั้งแต่ pip 10 คำตอบที่ยอมรับจะไม่ทำงานอีกต่อไป ทีมพัฒนาได้ลบการเข้าถึงget_installed_distributions
รูทีน มีฟังก์ชั่นสำรองในการsetuptools
ทำสิ่งเดียวกัน นี่คือเวอร์ชั่นสำรองที่ใช้งานได้กับ 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)
โปรดแจ้งให้เราทราบว่าจะใช้หรือไม่ทำงานใน pip รุ่นก่อนหน้าเช่นกัน
pip freeze
; ความรู้เชิงลึกของฉันในหัวข้อนี้ค่อนข้าง จำกัด ฉันคลำหาวิธีแก้ปัญหาเมื่อคำตอบที่ยอมรับไม่ได้ผลสำหรับฉันและฉันพยายามรวมกับคำตอบที่เกี่ยวข้องsetuptools
และนำไปใช้งานได้
get_installed_distributions routine
พูดคุยของทีมพัฒนาเกี่ยวกับการเข้าถึงที่ถูกลบออกไป
setuptools
ผมคิดว่าเป็นสถานที่ที่แน่นอนที่ผมได้รับการอ้างอิงสำหรับ
หากเราต้องการแสดงรายการแพ็คเกจที่ติดตั้งไว้ใน Python shell เราสามารถใช้help
คำสั่งดังต่อไปนี้
>>help('modules package')
ปกติฉันจะใช้pip list
เพื่อรับรายการแพ็คเกจ (พร้อมรุ่น)
ใช้งานได้ในสภาพแวดล้อมเสมือนจริงเช่นกัน เพื่อแสดงให้เห็นว่ามีการติดตั้งเฉพาะในสภาพแวดล้อมเสมือนจริง (ไม่ได้แพคเกจทั่วโลก), pip list --local
การใช้งาน
นี่คือเอกสารที่แสดงpip list
ตัวเลือกที่มีทั้งหมดพร้อมตัวอย่างที่ดีหลายอย่าง
ค้นหาง่ายมากโดยใช้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()
และมันก็ใช้ได้ดีเช่นกัน
ฉันวิ่งเข้าไปใน python 2.7 ที่ติดตั้งแบบกำหนดเองบน OS X ต้องใช้ X11 เพื่อแสดงรายการโมดูลที่ติดตั้ง (ทั้งสองใช้ความช่วยเหลือและ pydoc)
เพื่อให้สามารถแสดงรายการโมดูลทั้งหมดโดยไม่ต้องติดตั้ง X11 ฉันรัน pydoc เป็น http-server เช่น
pydoc -p 12345
จากนั้นจึงเป็นไปได้ที่จะให้ Safari ไปhttp://localhost:12345/
ยังโมดูลทั้งหมด
ในเทอร์มินัลหรือ IPython ให้พิมพ์:
help('modules')
แล้วก็
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
วิธีการแก้ปัญหานี้มีพื้นฐานมาจากโมดูลimportlib
และpkgutil
และทำงานกับ CPython 3.4 และ CPython 3.5 แต่ไม่รองรับ CPython 2
คำอธิบาย
sys.builtin_module_names
- ชื่อโมดูลในตัวทั้งหมด (ดูคำตอบของฉันที่นี่ )pkgutil.iter_modules()
- ส่งคืนข้อมูลเกี่ยวกับโมดูลที่มีอยู่ทั้งหมดimportlib.util.find_spec()
- ส่งคืนข้อมูลเกี่ยวกับการนำเข้าโมดูลหากมีอยู่BuiltinImporter
- ผู้นำเข้าสำหรับโมดูลในตัว ( เอกสาร )SourceFileLoader
- ผู้นำเข้าสำหรับโมดูล Python มาตรฐาน (โดยค่าเริ่มต้นมีส่วนขยาย * .py) ( เอกสาร )ExtensionFileLoader
- ผู้นำเข้าสำหรับโมดูลเป็นไลบรารีที่แชร์ (เขียนบน C หรือ C ++)รหัสเต็ม
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()
การใช้
สำหรับ CPython3.5 (ตัดปลาย)
$ 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 (ตัดปลาย)
$ 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
- ระบบการจัดการแพ็กเกจที่ใช้ในการติดตั้งและจัดการซอฟต์แวร์แพ็กเกจที่เขียนด้วย Python และผลลัพธ์pip.get_installed_distributions()
จะส่งคืนโมดูลที่ติดตั้งพร้อมกับ pip คำตอบของฉันขึ้นอยู่กับห้องสมุดมาตรฐานของ Python และครอบคลุมโมดูลทั้งหมดที่มีเพื่อนำเข้า ข้อเสียเปรียบที่ใหญ่ที่สุดคำตอบของฉัน - ไม่รองรับ CPython 2
**truncated**
ที่ผลลัพธ์ถูกตัดทอน บางทีคุณอาจไม่ระวัง แต่ถ้ามันไม่ได้ดังนั้นเพื่อส่งข้อมูลเกี่ยวกับระบบของคุณและการใช้งาน Python ให้ฉันฉันจะทำการวิจัยเพิ่มเติมเพื่อแก้ไข
คำเตือน: Adam Matan ไม่สนับสนุนการใช้งานนี้ใน pip> 10.0 นอกจากนี้อ่านความคิดเห็นของ @ sinoroc ด้านล่าง
สิ่งนี้ได้รับแรงบันดาลใจจากคำตอบของ Adam Matan ( คำตอบที่ได้รับการยอมรับ):
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))
ซึ่งจะพิมพ์ตารางในรูปแบบของ
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
------------------------------------------- -------------- ------
sudo
ซึ่งช่วยให้คุณได้อย่างง่ายดายแล้วมองเห็นซึ่งแพคเกจที่คุณติดตั้งที่มีและไม่มี
สิ่งที่ควรทราบ: ฉันสังเกตเห็นว่าเมื่อฉันติดตั้งแพ็คเก็ตหนึ่งครั้งผ่านไปsudo
หนึ่งครั้งโดยไม่ต้องใช้สิ่งใดสิ่งหนึ่งจะมีความสำคัญเหนือกว่าเพื่อให้อีกอันหนึ่งไม่ได้อยู่ในรายการ ฉันเชื่อว่ามีเพียงรายการเดียวในไดเรกทอรีท้องถิ่นแล้ว อาจปรับปรุงได้
pip
เพียงครั้งเดียวแล้วออก ดูเหมือนจะเป็นปัญหามากกว่าที่พฤติกรรมสามารถเปลี่ยนได้
_internal
) สรุปแล้วมันใช้งานได้ดี แต่เป็นการฝึกฝนที่ไม่ดี มีทางเลือกที่ดีกว่าบางคนอยู่ในคำตอบของคำถามนี้
นอกเหนือจากการใช้pip freeze
ฉันได้ติดตั้งไข่แดงในสภาพแวดล้อมเสมือนจริงของฉัน
ในกรณีที่คุณมีการแจกจ่ายงูใหญ่งูใหญ่ติดตั้งคุณสามารถใช้
$conda list
นอกเหนือจากการแก้ปัญหาที่อธิบายไว้ข้างต้น
conda install
ก็ควรจะทำงาน :)
sys.modules
pip
) คุณอาจดูpip.get_installed_distributions()
สำหรับวัตถุประสงค์ที่สองโค้ดตัวอย่าง:
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
หรือว่ามาจากpython.orgหรือไม่ สำหรับคนก่อนหน้านี้ฉันสามารถใช้ได้sys.modules
โดยไม่มีปัญหา
system.modules
sys.modules
รันสิ่งต่อไปนี้ในเครื่องมือแก้ไข python หรือ IPython ของคุณ
import pkg_resources;
installed_packages = {d.project_name: d.version for d in pkg_resources.working_set}
print(installed_packages)
อ่านคำตอบอื่น ๆ แล้วดึงคอมโบนี้ซึ่งเร็วที่สุดและง่ายที่สุดใน Python
pip freezeทำการค้นหาแพ็คเกจทั้งหมด แต่สามารถเขียนคำสั่งต่อไปนี้เพื่อแสดงรายการเส้นทางทั้งหมดที่มีแพ็คเกจ python
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
มีหลายวิธีในการดูแลแมว
วิธีที่ง่ายที่สุดคือการใช้pydoc
ฟังก์ชั่นโดยตรงจากเปลือกด้วย:
pydoc modules
แต่สำหรับข้อมูลเพิ่มเติมให้ใช้เครื่องมือที่เรียกว่าpip-dateซึ่งจะบอกวันที่ติดตั้งให้คุณด้วย
pip install pip-date
มีความคิดมากมายตอนแรกฉันครุ่นคิดถึงสองสิ่งนี้:
จุดเล็ก ๆ
ข้อเสีย: ไม่ได้ติดตั้งเสมอ
ช่วยเหลือ (โมดูล)
ข้อเสีย: ส่งออกไปยังคอนโซล; ด้วยโมดูลที่เสียหาย (ดู ubuntu ... ) สามารถ segfault
ฉันต้องการวิธีการง่ายๆโดยใช้ไลบรารีพื้นฐานและเข้ากันได้กับ python 2.x แบบเก่า
และฉันเห็นแสง: listmodules.py
ซ่อนอยู่ในไดเรกทอรีแหล่งเอกสารใน 2.5 เป็นสคริปต์ขนาดเล็กที่แสดงรายการโมดูลที่มีอยู่ทั้งหมดสำหรับการติดตั้ง Python
ข้อดี:
ใช้เฉพาะimp, sys, os, re, time
ออกแบบมาเพื่อรันบน Python 1.5.2 และใหม่กว่า
ซอร์สโค้ดมีขนาดกะทัดรัดจริง ๆ ดังนั้นคุณสามารถแก้ไขได้ง่ายเช่นส่งรายการข้อยกเว้นของโมดูลบั๊กกี้ (อย่าพยายามนำเข้า)
ฉันต้องการค้นหาแพ็คเกจเฉพาะรุ่นที่มีอยู่ใน AWS Lambda ฉันทำอย่างนั้นกับการตอบโต้กับความคิดจากหน้านี้ ฉันกำลังแบ่งปันเพื่อลูกหลาน
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
],
}
สิ่งที่ฉันค้นพบคือห้องสมุด boto3 ที่ให้นั้นล้าสมัยและมันไม่ใช่ความผิดของฉันที่รหัสของฉันล้มเหลว ฉันต้องการเพิ่ม boto3 และ botocore ในโครงการของฉัน แต่ถ้าไม่มีสิ่งนี้ฉันก็คงจะตีหัวของฉันคิดว่ารหัสของฉันไม่ดี
{
"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
},
...
สิ่งที่ผมค้นพบก็ยังแตกต่างจากสิ่งที่พวกเขาอย่างเป็นทางการเผยแพร่ ในขณะที่เขียนนี้:
- ระบบปฏิบัติการ - Amazon Linux
- AMI - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
- เคอร์เนล Linux - 4.14.77-70.59.amzn1.x86_64
- AWS SDK สำหรับ JavaScript - 2.290.0 \
- SDK สำหรับ Python (Boto 3) - 3-1.7.74 botocore-1.10.74
การติดตั้ง
pip install pkgutil
รหัส
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
ตัวอย่างผลลัพธ์:
multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil
นี่คือวิธีการแก้ปัญหารหัสหลามที่จะกลับรายการของโมดูลที่ติดตั้ง หนึ่งสามารถแก้ไขรหัสเพื่อรวมหมายเลขรุ่นได้อย่างง่ายดาย
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)
สำหรับทุกคนที่สงสัยว่าจะโทรpip list
จากโปรแกรม Python ได้อย่างไรคุณสามารถใช้สิ่งต่อไปนี้:
import pip
pip.main(['list]) # this will print all the packages
จากเปลือก
ls site-packages
หากไม่เป็นประโยชน์คุณสามารถทำได้
import sys
import os
for p in sys.path:
print os.listdir( p )
และดูสิ่งที่ผลิต