2011-03-12 2 views
4

하위 모듈에서 상위 모듈에 액세스하는 방법이 있는지 알아야합니다. 내가 서브 모듈 가져 오는 경우 :Python에서 상위 모듈에 액세스하는 방법이 있습니까

from subprocess import types 

을 나는 types이 - types에서 subprocess 모듈에 대한 액세스를 얻을 수있는 몇 가지 파이썬 마법이? ().__class__.__bases__[0].__subclasses__() 클래스의 경우 이와 비슷한 것입니다. 아마 getmodule 방법이 될 것 http://docs.python.org/library/inspect.html

:

+4

예가 이상합니다.'types'는 실제로 표준 파이썬'types' 모듈입니다. import 라인은'import types'와 똑같이 할 것이고,'types'는 두 경우 모두 정확히 같은 모듈 객체가 될 것입니다. –

+1

서브 프로세스는 어떤 의미에서든 의미가 있거나 유용하다고 여겨지는'types' 모듈의 "부모"가 아닙니다. 'subprocess'는 분명히 다른 타입의 import 모듈과 마찬가지로'types'을 가져 왔습니다. 너 뭐하려고? 무엇을하려하십니까? –

+0

그 유형이 표준 모듈이라는 것을 알고 있지만 모든 서브 모듈을 검색 할 때 서브 프로세스 모듈에서 그 유형을 발견했습니다. – jcubic

답변

6

으로 부모 모듈을 돌려처럼 내 자신의 모듈에 대한 더 유용 할 수 있습니다 __package__ 내 컴퓨터에 http://docs.python.org/library/inspect.html#inspect.getmodule

import inspect 
parent_module = inspect.getmodule(somefunction) 
children = dir(parent_module) 
package = parent_module.__package__ 

당신은 일반적으로 sys.modules 사전에서 그것을 얻을 수 있습니다. 파이썬은 특히 관계가 일대일 관계가 아니기 때문에 이름에 "부모 포인터"를 유지하지 않습니다. 예를 들어, 예를 사용 : 당신이 subprocess 모듈 types의 존재를 알게 될 것이다 경우

>>> 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 문 단지 유물이다. 해당 모듈이 필요한 경우 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) 

는 그런 다음 검사 모듈과 서브 프로세스의 아이들을 검사 할 수 할 수있는, 이미 서브 프로세스 모듈 내부에없는 가정 너에게 도움이 되니? '유형'빈 반환하지만 그것은 당신이 모듈을 액세스 한 경우 문자열

+1

@orangutancloud :하지만 그는 '서브 프로세스'에서'유형 '을 가져 왔다는 것을 모른 척하려고합니다.'유형'이 주어지면,'서브 프로세스 '는 그가 찾고있는 대답이고, 다른 방법은 아닙니다. –

+0

@john 좋은 지적, 나는 더 도움이 될 답변을 편집하려했습니다. Python의 inspect 모듈은 언어에 대한 가장 좋아하는 부분 중 하나입니다. –

+0

@orangutancloud :'inspect.getmodule (types)'은'types .__ file__' (내 컴퓨터에서는''C : \\ python27 \\ lib \\ types.pyc '')와 정확히 똑같은 것을 생성합니다. 얼마나 도움이되었거나 관련이 있습니까? –

0

는 후세를 위해, 나는이로 실행하고, 하나의 라이너를 내놓았다 :

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

or '__main__' 부분은 직접 파일을로드 그 자체를 반환합니다 경우에 대비한다.

관련 문제