我需要知道是否有方法从子模块访问父模块。如果我输入子模块:有没有办法在Python中访问父模块
from subprocess import types
我types
- 有一些Python的魔术从types
得到subprocess
模块访问?类似于().__class__.__bases__[0].__subclasses__()
的类。
我需要知道是否有方法从子模块访问父模块。如果我输入子模块:有没有办法在Python中访问父模块
from subprocess import types
我types
- 有一些Python的魔术从types
得到subprocess
模块访问?类似于().__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'>
如果你会注意到的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
可见的名称是,它仅导入其他顶层模块。
我假设你是不是子模块内部已经,你可以做
import somemodule
children = dir(somemodule)
然后,你可以检查子与检查模块的孩子: http://docs.python.org/library/inspect.html
也许getmodule方法是对你有用? http://docs.python.org/library/inspect.html#inspect.getmodule
import inspect
parent_module = inspect.getmodule(somefunction)
children = dir(parent_module)
package = parent_module.__package__
在我的机器__PACKAGE__返回空的“类型”,但它确实返回父模块作为一个字符串
@orangutancloud:但他试图假装他不知道他只是从'subprocess'中导入''''''''给定'types','subprocess'是他正在寻找的答案,而不是其他方法。 – 2011-03-12 23:24:39
@john好点,我试图编辑答案更有帮助。 python中的inspect模块是我最喜欢的语言部分之一。 – 2011-03-12 23:33:56
@orangutancloud:'inspect.getmodule(types)'与'types .__ file__'完全一样(在我的机器上:''C:\\ python27 \\ lib \\ types.pyc'')。这有什么帮助或相关的? – 2011-03-12 23:50:58
对于后人,我跑进这也并与一个衬垫上来:
import sys
parent_module = sys.modules['.'.join(__name__.split('.')[:-1]) or '__main__']
的or '__main__'
部分是以防万一你直接加载文件时,它会返回自身。
你的例子很奇怪 - 'types'实际上是标准的Python'types'模块。你的导入行将和'import types'一样,'types'在两种情况下都是完全相同的模块对象。 – 2011-03-12 23:16:49
从任何意义上来说,子过程都不是“类型”模块的“父”,对我而言,这似乎是有意义的或有用的。 ''subprocess'显然已经导入'types',就像很多其他模块导入'types'一样。你想做什么? 你想做什么? – 2011-03-13 00:40:29
我知道类型是标准模块,但当我搜索所有子模块时,我在子进程模块中找到它。 – jcubic 2011-03-14 01:48:23