2016-07-28 1 views
1

내가 수행하려고하는 것을 설명하기 위해 에있는 모듈 testmod이 있다고 가정 해 봅시다. 이 모듈의 전체 내용은 내가 성공적으로 importlib에서 사용할 수 또는 라이브러리에 내장 된 다른 도구 중 하나를 사용하여, 파이썬에이 모듈을 가져올 수 있도록하고 싶습니다가져 오기 네임 스페이스에 변수 삽입

x = test 

입니다.

명백히 현재 디렉토리에서 import testmod 문을 실행하면 오류가 발생합니다 : NameError: name 'test' is not defined.

나는 어쩌면 __import__에 하나 globals 또는 locals을 통과하는 것은 제대로 스크립트 실행되고 내부의 환경을 수정할 것이라고 생각하지만 그렇지 않습니다 :

>>> testmod = __import__('testmod', globals={'test': 'globals'}, locals={'test': 'locals'}) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/jfoxrabi/testmod.py", line 1, in <module> 
    x = test 
NameError: name 'test' is not defined 

내가 볼 수 있도록 나는 다른 시험의 값을 설정했다 이것이 작동하면 testmod.x이 온다.

이들 중 어느 것도 작동하지 않는 것으로 보아서, 저는 붙어 있습니다. 내가하려는 일을 성취 할 수 있습니까? Sparta가 아닌 Python이기 때문에 그렇습니다.

저는 아나콘다에서 파이썬 3.5를 사용하고 있습니다. 나는 외부 라이브러리를 사용하지 않는 것을 선호한다.

업데이트 : 왜 구성 파일로 내 프로그램에 모듈을 수입하고

. JSON 또는 INI를 사용하지 않는 이유는 Python의 인터프리터 전체를 사용하여 표현식에서 구성의 값을 계산할 수 있기를 원하기 때문입니다. 계산에 사용할 수있는 프로그램에서 미리 계산 한 특정 값을 갖고 싶습니다.

eval (내 프로그램에서도 마찬가지 임)을 호출하는 것만 큼 나쁘다는 것을 알고 있지만 당분간 보안 측면에 관심이 없습니다. 그러나 저는 이것이 실제로 XY의 사례로 밝혀지면 더 나은 해결책을 기꺼이 받아 들일 의지가 있습니다.

+0

무엇 module.testmod 수입 x'에서'간단한에 대한 자신의에'textmod' 포장 후 빈'__init __. py' 파일을 사용하여 모듈을 수정 하시겠습니까? – albert

+3

당신은 무엇을 성취하려고합니까? 즉, 왜 이것을 필요로합니까? 그냥 [XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) 문제를 정리하려고합니다. – tzaman

+0

@ tzaman. 공정하다. 나는 편집을 추가했다. –

답변

1

내가 this answerimportlib docs 기반으로하는 솔루션 함께했다. 이 프로그램의 다른 부분에 의도하지 않은 결과를 초래할 수있는, builtins을 수정하는 것보다 조금 더

from importlib.util import spec_from_file_location, module_from_spec 
from os.path import splitext, basename 

def loadConfig(fileName): 
    test = 'This is a test' 
    name = splitext(basename(fileName))[0] 
    spec = spec_from_file_location(name, fileName) 
    config = module_from_spec(spec) 
    config.test = test 
    spec.loader.exec_module(config) 
    return config 

testmod = loadConfig('./testmod.py') 

:이 importlib에 전화의 올바른 순서를 사용하여로드하기 전에 기본적으로, 모듈 개체에 액세스 할 수 또한 모듈에 전달할 수있는 이름을 제한 할 수도 있습니다.

모든 구성 항목을로드 할 때 액세스 할 수있는 단일 필드에 넣기로 결정했습니다. 이름은 config입니다.이것은 testmod에서 다음을 수행 할 날 수 있습니다 :

if 'test' in config: 
    x = config['test'] 

로더는 이제 다음과 같습니다

from importlib.util import spec_from_file_location, module_from_spec 
from os.path import splitext, basename 

def loadConfig(fileName, **kwargs): 
    name = splitext(basename(fileName))[0] 
    spec = spec_from_file_location(name, fileName) 
    config = module_from_spec(spec) 
    config.config = kwargs 
    spec.loader.exec_module(config) 
    return config 

testmod = loadConfig('./testmod.py', test='This is a test') 
1

당신은 당신의 자신의 가짜 내장 test 변수 주입하는 파이썬의 내장 명령과 함께 나사 수 :

import builtins # __builtin__, no s, in Python 2 

builtins.test = 5 # or whatever other placeholder value 

import testmod 

del builtins.test # clean up after ourselves 
+0

영리하지만 나는 덜 해킹 된 것을 기대하고있었습니다. 예를 들어, builtins 모듈에 이미있는 이름을 영구적으로 clobbering하거나 광범위한 백업을하지 않고 정의 할 수있는 것이 있습니다. 며칠 내에 다른 것이 생기지 않는다면 나는 물론 당신의 대답을 받아 들일 것입니다. –

+0

@MadPhysicist : 글쎄, 당신이하려는 변수 주입 일은 해커 야. 그것을하는 방법이 너무 익숙하지 않은 것은 놀랍지 않습니다. – user2357112

+0

아주 좋은 지적입니다. –