Kadang-kadang (ex: with ipython --pylab) python interpreter diluncurkan dengan modul yang telah ditentukan dimuat. Masih ada pertanyaan, bagaimana cara mengetahui alias yang digunakan o_O
yota
Jawaban:
182
import sys
sys.modules.keys()
Perkiraan mendapatkan semua impor untuk modul saat ini hanya akan memeriksa globals()modul:
import types
def imports():for name, val in globals().items():if isinstance(val, types.ModuleType):yield val.__name__
Ini tidak akan mengembalikan impor lokal, atau impor non-modul suka from x import y. Perhatikan bahwa ini mengembalikan val.__name__sehingga Anda mendapatkan nama modul asli jika Anda menggunakan import module as alias; ganti nama jika Anda ingin alias.
Atau Anda bisa menemukan persimpangan sys.modules dengan global, dan tidak melakukan pengujian tipe sama sekali.
Marcin
Ini adalah satu-satunya solusi yang mengembalikan nama modul lengkap ketika Anda mendefinisikan kembali nama modul yang diimpor. Misalnya, jika Anda melakukannya import numpy as np, ini akan kembali numpysementara dua saran lainnya akan kembali np.
joelostblom
1
Jika Anda karena suatu alasan memerlukan nama modul dan alias, ini tersedia dalam namevariabel. Jadi untuk menghasilkan string import numpy as nplakukan sesuatu seperti di 'import %s as %s' % (val.__name__, name)mana pernyataan hasil sekarang.
André C. Andersen
38
Temukan persimpangan sys.modulesdengan globals:
import sys
modulenames = set(sys.modules)& set(globals())
allmodules =[sys.modules[name]for name in modulenames]
Mungkin menggunakan di frozensetsini saja? - Ini 1-liner saya:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
PADA
Solusi di atas tidak mengekstrak modul yang sedang diimpor menggunakan fromperintah. Sebagai contoh pertimbangkan from scipy.stats import norm. Ini tidak memberi tahu saya bahwa normmodul diimpor. Bagaimana itu bisa dimasukkan ke dalam ini?
Ujjwal
@ Ujjwal Yah, modul-modul itu tidak diimpor, hanya komponen-komponennya. Jika Anda membutuhkan semuanya, gunakan saja sys.modules.
Marcin
28
Jika Anda ingin melakukan ini dari luar skrip:
Python 2
from modulefinder importModuleFinder
finder =ModuleFinder()
finder.run_script("myscript.py")for name, mod in finder.modules.iteritems():print name
Python 3
from modulefinder importModuleFinder
finder =ModuleFinder()
finder.run_script("myscript.py")for name, mod in finder.modules.items():print(name)
Ini akan mencetak semua modul yang dimuat oleh myscript.py.
Kode ini mencantumkan modul yang diimpor oleh modul Anda:
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 ifnot m in before]
Ini harus bermanfaat jika Anda ingin tahu modul eksternal apa yang harus diinstal pada sistem baru untuk menjalankan kode Anda, tanpa perlu mencoba lagi dan lagi.
Itu tidak akan mencantumkan sysmodul atau modul yang diimpor darinya.
Mencuri dari @Lila (tidak dapat memberikan komentar karena tidak ada format), ini menunjukkan modul / path /, juga:
#!/usr/bin/env pythonimport sys
from modulefinder importModuleFinder
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()
yang menghasilkan:
NameFile--------...
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
...
.. cocok untuk grepping atau apa saja. Diperingatkan, ini panjang!
Saya suka menggunakan pemahaman daftar dalam hal ini:
>>>[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)
ipython --pylab
) python interpreter diluncurkan dengan modul yang telah ditentukan dimuat. Masih ada pertanyaan, bagaimana cara mengetahui alias yang digunakan o_OJawaban:
Perkiraan mendapatkan semua impor untuk modul saat ini hanya akan memeriksa
globals()
modul:Ini tidak akan mengembalikan impor lokal, atau impor non-modul suka
from x import y
. Perhatikan bahwa ini mengembalikanval.__name__
sehingga Anda mendapatkan nama modul asli jika Anda menggunakanimport module as alias
; ganti nama jika Anda ingin alias.sumber
import numpy as np
, ini akan kembalinumpy
sementara dua saran lainnya akan kembalinp
.name
variabel. Jadi untuk menghasilkan stringimport numpy as np
lakukan sesuatu seperti di'import %s as %s' % (val.__name__, name)
mana pernyataan hasil sekarang.Temukan persimpangan
sys.modules
denganglobals
:sumber
frozenset
sini saja? - Ini 1-liner saya:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
from
perintah. Sebagai contoh pertimbangkanfrom scipy.stats import norm
. Ini tidak memberi tahu saya bahwanorm
modul diimpor. Bagaimana itu bisa dimasukkan ke dalam ini?Jika Anda ingin melakukan ini dari luar skrip:
Python 2
Python 3
Ini akan mencetak semua modul yang dimuat oleh myscript.py.
sumber
.iteritems()
ke.items()
dan kurung untuk pernyataan cetaksumber
katakanlah Anda telah mengimpor matematika dan ulang:
sekarang untuk melihat penggunaan yang sama
Jika Anda menjalankannya sebelum impor dan setelah impor, orang dapat melihat perbedaannya.
sumber
Ini sebenarnya bekerja cukup baik dengan:
Ini akan membuat daftar dengan nama modul yang dapat diimpor .
sumber
Kode ini mencantumkan modul yang diimpor oleh modul Anda:
Ini harus bermanfaat jika Anda ingin tahu modul eksternal apa yang harus diinstal pada sistem baru untuk menjalankan kode Anda, tanpa perlu mencoba lagi dan lagi.
Itu tidak akan mencantumkan
sys
modul atau modul yang diimpor darinya.sumber
Mencuri dari @Lila (tidak dapat memberikan komentar karena tidak ada format), ini menunjukkan modul / path /, juga:
yang menghasilkan:
.. cocok untuk grepping atau apa saja. Diperingatkan, ini panjang!
sumber
Saya suka menggunakan pemahaman daftar dalam hal ini:
sumber