我需要知道是否有方法從子模塊訪問父模塊。如果我輸入子模塊:有沒有辦法在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