2008-09-29 4 views
16

는 모듈 이름의 문자열을 감안할 때, 당신은 모듈에 모든 것을 가져 어떻게 당신은 전화 한 것처럼 :Python의 __import__ 함수를 사용하여 "import * from module"과 동등한 작업을 수행하는 방법은 무엇입니까?

from module import * 

즉, 주어진 문자열 S = "모듈", 하나는 다음에 해당하는 나올까요 방법 :

__import__(S, fromlist="*") 

예상대로 작동하지 않는 것 같습니다 (아무 것도 가져 오지 않음).

답변

30

다시 생각해주십시오. import *보다 나쁜 유일한 것은 마술import *입니다.

당신이 정말로 원하는 경우에 :

m = __import__ (S) 
try: 
    attrlist = m.__all__ 
except AttributeError: 
    attrlist = dir (m) 
for attr in attrlist: 
    globals()[attr] = getattr (m, attr) 
+0

어쩌면 더 나은 : all__ .__ m에서 ATTR에 대한 ? –

+0

@Sergei : 모듈에서 __all__을 정의한다는 보장은 없습니다. –

+1

@ John Millikin : 모듈에서 __all__을 정의하면이를 준수해야합니다. –

0

근본적인 문제는 내가하지만, (동료) 둘 이상의 호스트, 다른 설정 모두에 약간의 장고를 개발하고 있다는 점이다.

from platform import node 

settings_files = { 'BMH.lan': 'settings_bmh.py", ... } 

__import__(settings_files[ node() ]) 

그것은 간단한 솔루션 (따라서 우아한)를 보였다, 그러나 나는 그것에 냄새가 동의하지 않았다 및 단순성이 꺼집니다 : 나는 프로젝트/settings.py 파일에서이 같은 뭔가를 기대했다 John Millikin이 게시 한 것과 같은 로직을 사용해야 할 때 루프 (감사). 기본적으로 내가 함께 갔던 해결책은 다음과 같습니다.

from platform import node 

from settings_global import * 

n = node() 

if n == 'BMH.lan': 
    from settings_bmh import * 
# add your own, here... 
else: 
    raise Exception("No host settings for '%s'. See settings.py." % node()) 

우리의 목적에 잘 맞습니다.

-2

나는 그래서 당신이 또한에 모듈의 사전에 dict.update()을 사용할 수 있다는 표시 http://www.djangosnippets.org/snippets/600/

try: 
    import socket 
    hostname = socket.gethostname().replace('.','_') 
    exec "from host_settings.%s import *" % hostname 
except ImportError, e: 
    raise e 
+3

이 코드의 출처를 알 수 있지만 exec에 대한 호출이 내 뒤에서 떨리는 것을 보냅니다. 나는이 사건에서 그것이 큰일이냐고 정말로 모른다. 그러나 나는이 같은 것들에 대해 내 본능을 신뢰하는 법을 배웠다. –

+0

이것은 함수 내부에서 불법이며 실제로 끔찍한 것처럼 보입니다. –

1

에서 간단하지만 추한 방법을했다 할 수있는 좋은 방법을 찾을 수 없습니다 귀하의 경우 :

config = [__import__(name) for name in names_list] 

options = {} 
for conf in config: 
    options.update(conf.__dict__) 

업데이트 :

,536 : 나는 그것의 짧은 "기능"버전이 있다고 생각
options = reduce(dict.update, map(__import__, names_list)) 
+0

ilya의 답변이 잘못 되었습니까? 아니면 왜 downvoted 되었습니까? – akaihola

5

다음은 Django 용 로컬 설정 파일의 동적 이름 지정에 대한 나의 해결책입니다. 아래 체크 박스에는 가져온 파일의 '__'이 포함 된 속성이 포함되지 않습니다. 로컬 설정 파일의 모듈 이름으로 __name__ 전역이 덮어 써 져서 manage.py에서 사용 된 setup_environ()에 문제가 발생했습니다.

try: 
    import socket 
    HOSTNAME = socket.gethostname().replace('.','_') 
    # See http://docs.python.org/library/functions.html#__import__ 
    m = __import__(name="settings_%s" % HOSTNAME, globals=globals(), locals=locals(), fromlist="*") 
    try: 
     attrlist = m.__all__ 
    except AttributeError: 
     attrlist = dir(m)   
    for attr in [a for a in attrlist if '__' not in a]: 
     globals()[attr] = getattr(m, attr) 

except ImportError, e: 
    sys.stderr.write('Unable to read settings_%s.py\n' % HOSTNAME) 
    sys.exit(1) 
관련 문제