จะแสดงรายการโมดูลที่นำเข้าได้อย่างไร


152

จะระบุโมดูลที่นำเข้าทั้งหมดได้อย่างไร

เช่นฉันต้องการได้รับ['os', 'sys']จากรหัสนี้:

import os
import sys

ฉันไม่คิดว่ามันเป็นไปได้ในภาษา Python แต่คำถามก่อนหน้านี้อาจช่วยได้: stackoverflow.com/questions/2572582/ …
parent5446

6
บางครั้ง (เช่นipython --pylab:) ตัวแปลภาษาไพ ธ อนจะเปิดตัวพร้อมกับโหลดโมดูลที่กำหนดไว้ล่วงหน้า คำถามยังคงอยู่สำหรับวิธีการทราบว่านามแฝงที่ใช้ o_O
yota

คำตอบ:


182
import sys
sys.modules.keys()

การประมาณการนำเข้าทั้งหมดสำหรับโมดูลปัจจุบันจะเป็นการตรวจสอบglobals()สำหรับโมดูลเท่านั้น:

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

from x import yนี้จะไม่กลับมานำเข้าท้องถิ่นหรือการนำเข้าที่ไม่ใช่โมดูลเช่น โปรดทราบว่าผลตอบแทนที่นี้val.__name__เพื่อให้คุณได้รับชื่อโมดูลเดิมถ้าคุณใช้import module as alias; ให้ชื่อแทนหากคุณต้องการนามแฝง


2
หรือคุณสามารถหาจุดตัดของ sys.modules กับกลมและไม่ต้องทำการทดสอบแบบเลย
Marcin

นี่เป็นทางออกเดียวที่ส่งกลับชื่อโมดูลแบบเต็มเมื่อคุณกำหนดชื่อโมดูลที่นำเข้าของคุณใหม่ ตัวอย่างเช่นถ้าคุณทำimport numpy as npนี้จะกลับมาขณะที่อีกสองข้อเสนอแนะจะกลับมาnumpy np
joelostblom

1
หากคุณต้องการทั้งชื่อโมดูลและนามแฝงด้วยเหตุผลบางประการสิ่งนี้จะพร้อมใช้งานในnameตัวแปร ดังนั้นการสร้างสตริงimport numpy as npทำสิ่งที่ต้องการ'import %s as %s' % (val.__name__, name)ที่คำสั่งผลตอบแทนในขณะนี้
André C. Andersen

38

ค้นหาจุดตัดของsys.modulesด้วยglobals:

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

1
อาจใช้frozensetที่นี่แทน - ต่อไปนี้เป็นซับของฉัน:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AT

วิธีการแก้ปัญหาข้างต้นไม่ได้แยกโมดูลที่กำลังนำเข้าโดยใช้fromคำสั่ง from scipy.stats import normสำหรับเช่นพิจารณา สิ่งนี้ไม่ได้บอกฉันว่าnormมีการนำเข้าโมดูล จะรวมเข้ากับสิ่งนี้ได้อย่างไร?
Ujjwal

@Ujjwal เอาล่ะโมดูลเหล่านั้นไม่ได้ถูกนำเข้าแค่ส่วนประกอบ หากคุณต้องการทุกสิ่งเพียงใช้ sys.modules
Marcin

28

หากคุณต้องการทำสิ่งนี้จากนอกสคริปต์:

Python 2

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

Python 3

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

สิ่งนี้จะพิมพ์โมดูลทั้งหมดที่โหลดโดย myscript.py


1
สำหรับงูหลามที่ 3 การเปลี่ยนแปลง.iteritems()ไป.items()และวงเล็บคำสั่งพิมพ์
กระวาน

หมายเหตุ: มันล้มเหลวเมื่อคุณจัดการกับเนมสเปซ: bugs.python.org/issue40350
mPrinC

ส่วนนี้มีการอ้างอิง 204 รายการในเครื่องของฉัน ... มันแปลกหรือคาดหวังไหม
Guimoute


8

สมมติว่าคุณนำเข้าคณิตศาสตร์และอีกครั้ง:

>>import math,re

ตอนนี้เพื่อดูการใช้งานเดียวกัน

>>print(dir())

หากคุณเรียกใช้ก่อนที่จะนำเข้าและหลังการนำเข้าคุณสามารถเห็นความแตกต่าง


6

มันใช้งานได้ดีกับ:

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

สิ่งนี้จะสร้างรายการที่มีชื่อโมดูลที่นำเข้าได้


ไม่ได้ตอบคำถามจริงๆ
bergercookie

4

รหัสนี้แสดงรายการโมดูลที่นำเข้าโดยโมดูลของคุณ:

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]

มันจะมีประโยชน์ถ้าคุณต้องการรู้ว่าจะติดตั้งโมดูลภายนอกใดบนระบบใหม่เพื่อเรียกใช้โค้ดของคุณโดยไม่จำเป็นต้องลองอีกครั้ง

มันจะไม่แสดงรายการsysโมดูลหรือโมดูลที่นำเข้าจากมัน


1

การขโมยจาก @Lila (ไม่สามารถแสดงความคิดเห็นได้เนื่องจากไม่มีการจัดรูปแบบ) สิ่งนี้จะแสดงโมดูล / เส้นทาง / ของเช่นกัน:

#!/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()

ซึ่งผลิต:

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
...

.. เหมาะสำหรับ grepping หรือสิ่งที่คุณมี ถูกเตือนมันยาว!


0

ฉันชอบใช้ความเข้าใจในรายการในกรณีนี้:

>>> [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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.