파이썬 패키지에 포함된 모든 모듈을 나열하시겠습니까?
파이썬 패키지에 포함된 모든 모듈을 쉽게 찾을 수 있는 방법이 있습니까?저는 이 오래된 논의를 발견했는데, 이것은 정말로 결정적이지는 않지만, os.listdir()를 기반으로 한 자체 솔루션을 출시하기 전에 확실한 답변을 듣고 싶습니다.
네, 당신은 당신이 원하는 것은pkgutil
또는 유사합니다. 이렇게 하면 모든 패키지가 계란 또는 지퍼에 들어 있는지 여부에 관계없이 모두 동일하게 취급할 수 있습니다(os.listdir는 도움이 되지 않습니다).
import pkgutil
# this is the package we are inspecting -- for example 'email' from stdlib
import email
package = email
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
print "Found submodule %s (is a package: %s)" % (modname, ispkg)
수입하는 방법도?그냥 쓰시면 됩니다.__import__
정상적으로:
import pkgutil
# this is the package we are inspecting -- for example 'email' from stdlib
import email
package = email
prefix = package.__name__ + "."
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix):
print "Found submodule %s (is a package: %s)" % (modname, ispkg)
module = __import__(modname, fromlist="dummy")
print "Imported", module
이 일에 적합한 도구는 pkgutil입니다.산책 packages
시스템의 모든 모듈을 나열하려면:
import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None):
print(modname)
walk_packages는 하위 모듈이 아닌 모든 하위 패키지를 가져옵니다.
특정 패키지의 모든 하위 모듈을 나열하려면 다음과 같은 것을 사용할 수 있습니다.
import pkgutil
import scipy
package=scipy
for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__,
prefix=package.__name__+'.',
onerror=lambda x: None):
print(modname)
iter_modules는 한 단계 깊은 모듈만 나열합니다. walk_packages는 모든 하위 모듈을 가져옵니다.예를 들어 sky의 경우 walk_packages가 반환됩니다.
scipy.stats.stats
iter_modules만 반환되는 동안
scipy.stats
pkgutil(http://docs.python.org/library/pkgutil.html) 의 설명서에는 /usr/lib/ python2.6/pkgutil.py 에 정의된 모든 흥미로운 기능이 나열되어 있지 않습니다.
아마도 이는 기능이 "공용" 인터페이스의 일부가 아니며 변경될 수 있음을 의미합니다.
그러나 적어도 파이썬 2.6 (그리고 아마도 이전 버전?)에서 pkgutil은 사용 가능한 모든 모듈을 재귀적으로 걸어 다니는 walk_packages 메서드와 함께 제공됩니다.
이것은 저에게 효과가 있습니다.
import types
for key, obj in nltk.__dict__.iteritems():
if type(obj) is types.ModuleType:
print key
패키지에서 라이브로 편집하는 모든 서브모듈을 다시 로드하는 방법을 찾고 있었습니다.위의 답변/댓글을 종합한 것이라 댓글보다는 답변으로 여기에 게시하기로 했습니다.
package=yourPackageName
import importlib
import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__, prefix=package.__name__+'.', onerror=lambda x: None):
try:
modulesource = importlib.import_module(modname)
reload(modulesource)
print("reloaded: {}".format(modname))
except Exception as e:
print('Could not load {} {}'.format(modname, e))
한가지 방법이 있습니다. 머리속에서.
>>> import os
>>> filter(lambda i: type(i) == type(os), [getattr(os, j) for j in dir(os)])
[<module 'UserDict' from '/usr/lib/python2.5/UserDict.pyc'>, <module 'copy_reg' from '/usr/lib/python2.5/copy_reg.pyc'>, <module 'errno' (built-in)>, <module 'posixpath' from '/usr/lib/python2.5/posixpath.pyc'>, <module 'sys' (built-in)>]
그것은 확실히 정리되고 개선될 수 있습니다.
편집: 조금 더 좋은 버전이 있습니다.
>>> [m[1] for m in filter(lambda a: type(a[1]) == type(os), os.__dict__.items())]
[<module 'copy_reg' from '/usr/lib/python2.5/copy_reg.pyc'>, <module 'UserDict' from '/usr/lib/python2.5/UserDict.pyc'>, <module 'posixpath' from '/usr/lib/python2.5/posixpath.pyc'>, <module 'errno' (built-in)>, <module 'sys' (built-in)>]
>>> [m[0] for m in filter(lambda a: type(a[1]) == type(os), os.__dict__.items())]
['_copy_reg', 'UserDict', 'path', 'errno', 'sys']
참고: 패키지에서 풀인할 경우 패키지의 하위 디렉터리에 반드시 있을 필요가 없는 모듈도 찾을 수 있습니다.__init__.py
파일, 즉 패키지의 "부분"을 의미하는 바에 따라 달라집니다.
언급URL : https://stackoverflow.com/questions/1707709/list-all-the-modules-that-are-part-of-a-python-package
'sourcecode' 카테고리의 다른 글
부동 소수점 값 27개 집합에서 중위수를 선택하는 가장 빠른 코드 C/C++ (0) | 2023.10.10 |
---|---|
Angularjs에서 $compile을 지시 외에 사용하려면 어떻게 해야 합니까? (0) | 2023.10.10 |
많은 수의 DOM 요소를 변환/이동하는 가장 성능적인 방법 (0) | 2023.10.10 |
이 두 구조 선언의 차이점은 무엇입니까? (0) | 2023.10.05 |
SQL 개발자 사용자 지정 연결 문자열 (0) | 2023.10.05 |