패키지에 Python 모듈의 이름을 나열하는 표준 방법이 있습니까?
문제
사용하지 않고 모든 모듈의 이름을 패키지에 나열하는 간단한 방법이 있습니까? __all__
?
예를 들어이 패키지가 주어지면 :
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
다음과 같은 작업을 수행 할 수있는 표준 또는 내장 방법이 있는지 궁금합니다.
>>> package_contents("testpkg")
['modulea', 'moduleb']
수동 접근법은 패키지의 디렉토리를 찾기 위해 모듈 검색 경로를 반복하는 것입니다. 그런 다음 해당 디렉토리에 모든 파일을 나열하고 독창적 인 PY/PYC/PYO 파일을 필터링하고 확장자를 벗기고 해당 목록을 반환 할 수 있습니다. 그러나 이것은 모듈 가져 오기 메커니즘이 이미 내부적으로 수행하고있는 것에 대한 상당한 양의 작업처럼 보입니다. 그 기능이 어디에나 노출됩니까?
해결책
어쩌면 이것이 당신이 찾고있는 일을 할 것입니까?
import imp
import os
MODULE_EXTENSIONS = ('.py', '.pyc', '.pyo')
def package_contents(package_name):
file, pathname, description = imp.find_module(package_name)
if file:
raise ImportError('Not a package: %r', package_name)
# Use a set because some may be both source and compiled.
return set([os.path.splitext(module)[0]
for module in os.listdir(pathname)
if module.endswith(MODULE_EXTENSIONS)])
다른 팁
사용 Python2.3 이상, 당신은 또한 사용할 수 있습니다 pkgutil
기준 치수:
>>> import pkgutil
>>> [name for _, name, _ in pkgutil.iter_modules(['testpkg'])]
['modulea', 'moduleb']
편집하다: 매개 변수는 모듈 목록이 아니라 경로 목록이므로 다음과 같은 작업을 수행 할 수 있습니다.
>>> import os.path, pkgutil
>>> import testpkg
>>> pkgpath = os.path.dirname(testpkg.__file__)
>>> print [name for _, name, _ in pkgutil.iter_modules([pkgpath])]
import module
help(module)
내가 무언가를 간과하고 있는지 또는 대답이 방금 구제되었는지 모르겠지만;
user815423426에서 언급 한 바와 같이 이것은 라이브 객체에만 작동하며 나열된 모듈은 이전에 가져온 모듈 만입니다.
패키지의 목록 모듈은 정말 사용하기 쉬운 것 같습니다 검사:
>>> import inspect, testpkg
>>> inspect.getmembers(testpkg, inspect.ismodule)
['modulea', 'moduleb']
Python 3.6 이상에서 작동하는 재귀 버전입니다.
import importlib.util
from pathlib import Path
import os
MODULE_EXTENSIONS = '.py'
def package_contents(package_name):
spec = importlib.util.find_spec(package_name)
if spec is None:
return set()
pathname = Path(spec.origin).parent
ret = set()
with os.scandir(pathname) as entries:
for entry in entries:
if entry.name.startswith('__'):
continue
current = '.'.join((package_name, entry.name.partition('.')[0]))
if entry.is_file():
if entry.name.endswith(MODULE_EXTENSIONS):
ret.add(current)
elif entry.is_dir():
ret.add(current)
ret |= package_contents(current)
return ret
이것은 모듈을 나열해야합니다.
help("modules")
Python 코드 외부의 패키지에 대한 정보를 보려면 (명령 프롬프트에서) Pydoc을 사용할 수 있습니다.
# get a full list of packages that you have installed on you machine
$ python -m pydoc modules
# get information about a specific package
$ python -m pydoc <your package>
PYDOC와 동일한 결과를 얻을 수 있지만 도움을 사용하는 통역사 내부
>>> import <my package>
>>> help(<my package>)
Cdleary의 예를 바탕으로 모든 하위 모듈에 대한 재귀 버전 목록 경로는 다음과 같습니다.
import imp, os
def iter_submodules(package):
file, pathname, description = imp.find_module(package)
for dirpath, _, filenames in os.walk(pathname):
for filename in filenames:
if os.path.splitext(filename)[1] == ".py":
yield os.path.join(dirpath, filename)
인쇄 DIR (모듈)
def package_contents(package_name):
package = __import__(package_name)
return [module_name for module_name in dir(package) if not module_name.startswith("__")]