কীভাবে আমদানি করা মডিউলগুলি তালিকাভুক্ত করবেন?


152

সমস্ত আমদানি করা মডিউলগুলি কীভাবে গণনা করবেন?

যেমন আমি ['os', 'sys']এই কোডটি পেতে চাই :

import os
import sys

আমি মনে করি না এটা নেটিভ পাইথন সম্ভব, কিন্তু এই পূর্ববর্তী জিজ্ঞাসাবাদ করে সাহায্য: stackoverflow.com/questions/2572582/...
parent5446

6
কখনও কখনও (প্রাক্তন: সহ ipython --pylab) পাইথন ইন্টারপ্রেটারটি পূর্বনির্ধারিত মডিউলগুলি লোড করে চালু করা হয়। প্রশ্নটি রয়ে গেছে, কীভাবে
উপন্যাসটি

উত্তর:


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 এর ছেদটি খুঁজে পেতে পারেন এবং কোনও প্রকারের পরীক্ষাও করবেন না।
মার্সিন

আপনি যখন আমদানি করা মডিউলটির নামটি পুনরায় সংজ্ঞা দেন তখন এটিই একমাত্র সমাধান যা সম্পূর্ণ মডিউলটির নাম দেয় returns উদাহরণস্বরূপ আপনি যদি এটি করেন তবে এটি import numpy as npফিরে আসবে numpyএবং অন্য দুটি পরামর্শ ফিরে আসবে np
joelostblom

1
আপনার যদি কোনও কারণে মডিউলের নাম এবং উপন্যাস উভয়ই প্রয়োজন হয় তবে এটি চলকটিতে উপলব্ধ name। স্ট্রিং উত্পন্ন করার জন্য যেমন ফলন বিবৃতি এখন যেখানে import numpy as npdo 'import %s as %s' % (val.__name__, name)
আন্দ্রে সি। অ্যান্ডারসন

38

এর sys.modulesসাথে ছেদটি সন্ধান করুন globals:

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

1
frozensetপরিবর্তে এখানে একটি ব্যবহার করতে পারেন ? - এখানে আমার 1-লাইনার:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))

উপরের সমাধানটি fromকমান্ডটি ব্যবহার করে আমদানি করা মডিউলগুলি বের করে না । উদাহরণস্বরূপ বিবেচনা করুন from scipy.stats import norm। এটি আমাকে জানায় না যে normমডিউলটি আমদানি করা হয়েছে। কীভাবে এটি এতে যুক্ত করা যায়?
উজ্জ্বল

@ উজ্জ্বল ভাল, এই মডিউলগুলি কেবল তাদের উপাদানগুলি আমদানি করা হচ্ছে না। আপনার যদি সমস্ত কিছু প্রয়োজন হয় তবে কেবল sys.modules ব্যবহার করুন।
মার্সিন

28

আপনি যদি স্ক্রিপ্টের বাইরে থেকে এটি করতে চান:

পাইথন 2

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

পাইথন ঘ

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()এবং বন্ধনীগুলি
এলাচ

দ্রষ্টব্য: আপনি যখন নেমস্পেস নিয়ে কাজ করছেন তখন এটি ক্র্যাশ হয়: বাগসপিথথন.অর্গ
বিএসইউ

এই স্নিপডে নিজেই আমার মেশিনে 204 নির্ভরতা রয়েছে ... এটি কি অদ্ভুত বা প্রত্যাশিত?
গুইমোট


8

যাক আপনি গণিত এবং পুনরায় আমদানি করেছেন:

>>import math,re

এখন একই ব্যবহার দেখতে

>>print(dir())

আপনি যদি এটি আমদানির আগে এবং আমদানির পরে চালনা করেন তবে কেউ পার্থক্য দেখতে পাবে।


6

এটি আসলে এর সাথে বেশ ভাল কাজ করছে:

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

এটি আমদানিযোগ্য মডিউল নাম সহ একটি তালিকা তৈরি করবে ।


এটি আসলে প্রশ্নের উত্তর দেয় না।
begercookie

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

@ লীলা থেকে চুরি করা (কোনও বিন্যাসের কারণে কোনও মন্তব্য করতে পারেনি), এটি মডিউলটির / পথ / এছাড়াও দেখায়:

#!/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
...

.. গ্রেপিংয়ের জন্য উপযুক্ত বা আপনার কী আছে। সতর্ক হোন, এটা দীর্ঘ!


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.