2011-03-12 54 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__'部分是以防萬一你直接加載文件時,它會返回自身。

相關問題