Если вы получили доступ к модулю, вы можете получить его из словаря sys.modules
. Python не хранит «родительские указатели» с именами, особенно потому, что отношения не однозначные. Например, используя ваш пример:
>>> from subprocess import types
>>> types
<module 'types' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/types.pyc'>
>>> import sys
>>> sys.modules['subprocess']
<module 'subprocess' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.pyc'>
Если вы заметите наличие types
в модуле subprocess
, это просто артефакт оператора import types
в нем. Вы просто import types
, если вам нужен этот модуль.
Фактически, будущая версия subprocess
может больше не импортировать types
, и ваш код сломается. Вы должны импортировать только имена, которые появляются в списке __all__
модуля; рассмотреть другие имена как детали реализации.
Так, например:
>>> import subprocess
>>> dir(subprocess)
['CalledProcessError', 'MAXFD', 'PIPE', 'Popen', 'STDOUT', '_PIPE_BUF', '__all__', '__builtins__', '__doc__',
'__file__', '__name__', '__package__', '_active', '_cleanup', '_demo_posix', '_demo_windows', '_eintr_retry_call',
'_has_poll', 'call', 'check_call', 'check_output', 'errno', 'fcntl', 'gc', 'list2cmdline', 'mswindows', 'os',
'pickle', 'select', 'signal', 'sys', 'traceback', 'types']
>>> subprocess.__all__
['Popen', 'PIPE', 'STDOUT', 'call', 'check_call', 'check_output', 'CalledProcessError']
Вы можете видеть, что большинство имен, видимых в subprocess
, являются просто другими модулями верхнего уровня, которые он импортирует.