Làm thế nào để liệt kê các mô-đun nhập khẩu?


152

Làm thế nào để liệt kê tất cả các mô-đun nhập khẩu?

Ví dụ, tôi muốn lấy ['os', 'sys']từ mã này:

import os
import sys

Tôi không nghĩ rằng có thể bằng Python bản xứ, nhưng điều này trước sự giúp đỡ câu hỏi sức: stackoverflow.com/questions/2572582/...
parent5446

6
Đôi khi (ví dụ: với ipython --pylab) trình thông dịch python được khởi chạy với các mô-đun được xác định trước được tải. Câu hỏi vẫn còn, làm thế nào để biết bí danh được sử dụng o_O
yota

Câu trả lời:


182
import sys
sys.modules.keys()

Một xấp xỉ nhận được tất cả nhập khẩu cho mô-đun hiện tại sẽ chỉ để kiểm tra globals()các mô-đun:

import types
def imports():
    for name, val in globals().items():
        if isinstance(val, types.ModuleType):
            yield val.__name__

Điều này sẽ không trả lại hàng nhập khẩu nội địa, hoặc nhập khẩu không theo mô-đun như from x import y. Lưu ý rằng điều này trả về val.__name__để bạn có được tên mô-đun ban đầu nếu bạn đã sử dụng import module as alias; tên sản lượng thay vì nếu bạn muốn bí danh.


2
Hoặc bạn có thể tìm thấy giao điểm của sys.modules với toàn cầu và không thực hiện kiểm tra loại nào cả.
Marcin

Đây là giải pháp duy nhất trả về tên mô-đun đầy đủ khi bạn xác định lại tên của mô-đun đã nhập. Ví dụ: nếu bạn làm như vậy import numpy as np, điều này sẽ trở lại numpytrong khi hai đề xuất khác sẽ trở lại np.
joelostblom

1
Nếu bạn vì một lý do nào đó cần cả tên mô-đun và bí danh, thì điều này có sẵn trong namebiến. Do đó, để tạo ra chuỗi, import numpy as nphãy làm một cái gì đó giống như 'import %s as %s' % (val.__name__, name)câu lệnh lãi suất hiện tại.
André C. Andersen

38

Tìm giao điểm của sys.modulesvới globals:

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]

1
Có thể sử dụng một frozensetở đây để thay thế? - Đây là lớp lót 1 của tôi:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AT

Giải pháp trên không trích xuất các mô-đun đang được nhập bằng fromlệnh. Ví dụ như xem xét from scipy.stats import norm. Điều này không cho tôi biết rằng normmô-đun được nhập khẩu. Làm thế nào mà có thể được kết hợp vào đây?
Ujjwal

@Ujjwal Chà, những mô-đun đó không được nhập, chỉ là các thành phần của chúng. Nếu bạn cần mọi thứ, chỉ cần sử dụng sys.modules.
Marcin

28

Nếu bạn muốn làm điều này từ bên ngoài kịch bản:

Con trăn 2

from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script("myscript.py")
for name, mod in finder.modules.iteritems():
    print name

Con trăn 3

from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script("myscript.py")
for name, mod in finder.modules.items():
    print(name)

Điều này sẽ in tất cả các mô-đun được tải bởi myscript.py.


1
Đối với Python 3, thay đổi .iteritems()thành .items()và ngoặc cho câu lệnh in
thảo quả

Lưu ý: Nó gặp sự cố khi bạn đang xử lý không gian tên: bug.python.org/su40350
mPrinC

Bản thân snipped này có 204 phụ thuộc vào máy của tôi ... Điều đó có lạ hay không?
Hướng dẫn

12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]

8

giả sử bạn đã nhập toán và re:

>>import math,re

Bây giờ để xem sử dụng tương tự

>>print(dir())

Nếu bạn chạy nó trước khi nhập và sau khi nhập, người ta có thể thấy sự khác biệt.


6

Nó thực sự hoạt động khá tốt với:

import sys
mods = [m.__name__ for m in sys.modules.values() if m]

Điều này sẽ tạo ra một danh sách với các tên mô-đun nhập khẩu .


Điều đó không thực sự trả lời câu hỏi.
bergercookie

4

Mã này liệt kê các mô-đun được nhập bởi mô-đun của bạn:

import sys
before = [str(m) for m in sys.modules]
import my_module
after = [str(m) for m in sys.modules]
print [m for m in after if not m in before]

Sẽ hữu ích nếu bạn muốn biết những mô-đun bên ngoài nào sẽ được cài đặt trên một hệ thống mới để chạy mã của bạn mà không cần phải thử lại nhiều lần.

Nó sẽ không liệt kê các sysmô-đun hoặc mô-đun được nhập từ nó.


1

Ăn cắp từ @Lila (không thể đưa ra nhận xét vì không có định dạng), điều này cũng cho thấy / path / của mô-đun:

#!/usr/bin/env python
import sys
from modulefinder import ModuleFinder
finder = ModuleFinder()
# Pass the name of the python file of interest
finder.run_script(sys.argv[1])
# This is what's different from @Lila's script
finder.report()

sản xuất:

Name                      File
----                      ----

...
m token                     /opt/rh/rh-python35/root/usr/lib64/python3.5/token.py
m tokenize                  /opt/rh/rh-python35/root/usr/lib64/python3.5/tokenize.py
m traceback                 /opt/rh/rh-python35/root/usr/lib64/python3.5/traceback.py
...

.. thích hợp để grepping hoặc những gì có bạn. Được cảnh báo, nó dài!


0

Tôi thích sử dụng một sự hiểu biết danh sách trong trường hợp này:

>>> [w for w in dir() if w == 'datetime' or w == 'sqlite3']
['datetime', 'sqlite3']

# To count modules of interest...
>>> count = [w for w in dir() if w == 'datetime' or w == 'sqlite3']
>>> len(count)
2

# To count all installed modules...
>>> count = dir()
>>> len(count)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.