2011-03-12 56 views
4

我需要知道是否有方法从子模块访问父模块。如果我输入子模块:有没有办法在Python中访问父模块

from subprocess import types 

types - 有一些Python的魔术从types得到subprocess模块访问?类似于().__class__.__bases__[0].__subclasses__()的类。

+4

你的例子很奇怪 - 'types'实际上是标准的Python'types'模块。你的导入行将和'import types'一样,'types'在两种情况下都是完全相同的模块对象。 – 2011-03-12 23:16:49

+1

从任何意义上来说,子过程都不是“类型”模块的“父”,对我而言,这似乎是有意义的或有用的。 ''subprocess'显然已经导入'types',就像很多其他模块导入'types'一样。你想做什么? 你想做什么? – 2011-03-13 00:40:29

+0

我知道类型是标准模块,但当我搜索所有子模块时,我在子进程模块中找到它。 – jcubic 2011-03-14 01:48:23

回答

6

如果你访问的模块可以为我自己的模块更有用您通常可以从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'> 

如果你会注意到的typessubprocess模块中的存在仅仅是在它的声明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可见的名称是,它仅导入其他顶层模块。

-1

我假设你是不是子模块内部已经,你可以做

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__返回空的“类型”,但它确实返回父模块作为一个字符串

+1

@orangutancloud:但他试图假装他不知道他只是从'subprocess'中导入''''''''给定'types','subprocess'是他正在寻找的答案,而不是其他方法。 – 2011-03-12 23:24:39

+0

@john好点,我试图编辑答案更有帮助。 python中的inspect模块是我最喜欢的语言部分之一。 – 2011-03-12 23:33:56

+0

@orangutancloud:'inspect.getmodule(types)'与'types .__ file__'完全一样(在我的机器上:''C:\\ python27 \\ lib \\ types.pyc'')。这有什么帮助或相关的? – 2011-03-12 23:50:58

0

对于后人,我跑进这也并与一个衬垫上来:

import sys 
parent_module = sys.modules['.'.join(__name__.split('.')[:-1]) or '__main__'] 

or '__main__'部分是以防万一你直接加载文件时,它会返回自身。

相关问题