我需要知道是否有办法从子模块访问父模块.如果我导入子模块:
from subprocess import types
我有类型 – 是否有一些Python魔法可以从类型访问子进程模块?类似于类().__ class __.__ bases __ [0] .__ subclasses __().
解决方法
如果您访问过模块,通常可以从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'>
如果您注意到子进程模块中存在的类型只是其中的import 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','CalledProcessError']
您可以看到子进程中可见的大多数名称只是它导入的其他顶级模块.