2012-09-12 4 views

답변

1

samy.vilar의 답은 많은 유용한 옵션을 제공합니다. 하지만 당신은 가장 간단하고 직접적인 대답을 찾는다면 여기 주목해야 할

import imp 
import sys 

f, pathname, desc = imp.find_module('logging', sys.path[1:]) 
logging = imp.load_module('logging', f, pathname, desc) 

몇 가지 :

load_module 호출이 더는 이름을 바인드되지 않습니다에 import logging보다 reload(logging) 같은입니다 logging은 로컬 범위에 있지만 기존 모듈을 logging으로 대체합니다. 따라서이 전에 import logging을 작성했다면 그 이름은 이전 모듈이 아닌 새 모듈을 참조합니다. 그렇지 않은 경우 logging이라는 이름이 귀하의 범위에 묶여 있지 않습니다. (그 때문에 logging =이 위에 있으며 범위에 포함됩니다.)

사실 현재 모듈 디렉토리에 현재 디렉토리를 넣는 ''이 실제로는 sys.path의 첫 번째 항목인지 확실하지 않습니다. 그 문제에 관해서는, 항상 ''또는 그 문제에 대해. ''를 sys.path에 직접 삽입하는 것이 가능합니다.

f, pathname, desc = imp.find_module('logging', [path for path in sys.path if path and path[0] != '.']) 

을 또는 당신은 예를 들어, 확인 아무도 저변에서 당신을 강요하지 않습니다 수 있도록 다양한 방법으로 sys.argv[0]os.getcwd()abspath(path) 비교, 더 편집증 얻을 수 : 그래서 당신이 편집증하려는 경우, 당신이 뭔가를 할 수 있습니다 자신을 다시 가져 오십시오. 목표가 무엇인지에 달려 있습니다.

+0

감사합니다. 이것은 훨씬 더 많습니다. 나는 생각보다 복잡했다. 나는 __future__ import absolute_import 또는 무엇인가부터 할 수 있기를 바랬다. –

2

언제든지 현재 디렉토리를 sys.path에서 제거 할 수 있습니다.하지만 이는 매우 까다 롭고 안정적이지 않습니다. 테스트 후, 파일이 실행 중일 경우 (__main__과 같지만 가져올 수없는 경우 매우 신뢰할 수 없음)이 작동한다는 것을 알았습니다.

당신이 할 수있는 최선의 일은 std lib 패키지에서 사용되는 이름으로 파일 이름을 지정하지 않는 것입니다.

+0

현재 파일의 디렉토리는 항상 경로에 있습니다. 패키지 안에 얼마나 깊이 중첩되어 있는지는 중요하지 않습니다. 항상 자신을 가져올 수 있습니다. (물론 실패합니다.) –

+0

@NickRetallack 당신은 정말로 옳습니다. 나는 체크하지 않고 너무 빠르게 대답했습니다! 나는 그 때 그 비트를 제거 할 것이다! –

-1

가져온 파일은 sys.modules에 캐시되며 같은 이름의 다른 모듈을 가져 오려고하면 캐시 된 모듈 만 반환됩니다. 충돌을 해결할 방법이 없습니다.

해킹으로 sys.modules에 사전 항목을 삭제할 수 있지만 그게 얼마나 효과가 있을지 모르겠다. 경고 Emptor. 물론

del sys.modules['logging'] 

그 후 적절한 파일을 가져 가도록 (듯이) 경로를 수정하는 방법을 발견해야합니다.

나는 전반적인 상황을 완전히 막고 충돌을 피하기 위해 파일의 이름을 바꾸는 것이 좋습니다.

1

물론 imp을 사용하여 절대 경로로 모듈을로드 할 수 있습니다. 내가 이런 짓을 내 Mac에

import imp 
help(imp.load_module) 
load_module(...) 
    load_module(name, file, filename, (suffix, mode, type)) -> module 
    Load a module, given information returned by find_module(). 
    The module name must include the full package name, if any. 

: 우리가 볼 수

import imp 
py_logging = imp.load_module('logging', None, '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/logging', ('', '', 5)) 
dir(py_logging) 
['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR', 'FATAL', 'FileHandler', 'Filter', 'Filterer', 'Formatter', 'Handler', 'INFO', 'LogRecord', 'Logger', 'LoggerAdapter', 'Manager', 'NOTSET', 'PlaceHolder', 'RootLogger', 'StreamHandler', 'WARN', 'WARNING', '__all__', '__author__', '__builtins__', '__date__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__status__', '__version__', '_acquireLock', '_defaultFormatter', '_handlerList', '_handlers', '_levelNames', '_lock', '_loggerClass', '_releaseLock', '_srcfile', '_startTime', 'addLevelName', 'atexit', 'basicConfig', 'cStringIO', 'codecs', 'critical', 'currentframe', 'debug', 'disable', 'error', 'exception', 'fatal', 'getLevelName', 'getLogger', 'getLoggerClass', 'info', 'log', 'logProcesses', 'logThreads', 'makeLogRecord', 'os', 'raiseExceptions', 'root', 'setLoggerClass', 'shutdown', 'string', 'sys', 'thread', 'threading', 'time', 'traceback', 'types', 'warn', 'warning'] 

dir(logging) 
['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR', 'FATAL', 'FileHandler', 'Filter', 'Filterer', 'Formatter', 'Handler', 'INFO', 'LogRecord', 'Logger', 'LoggerAdapter', 'Manager', 'NOTSET', 'PlaceHolder', 'RootLogger', 'StreamHandler', 'WARN', 'WARNING', '__all__', '__author__', '__builtins__', '__date__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__status__', '__version__', '_acquireLock', '_defaultFormatter', '_handlerList', '_handlers', '_levelNames', '_lock', '_loggerClass', '_releaseLock', '_srcfile', '_startTime', 'addLevelName', 'atexit', 'basicConfig', 'cStringIO', 'codecs', 'critical', 'currentframe', 'debug', 'disable', 'error', 'exception', 'fatal', 'getLevelName', 'getLogger', 'getLoggerClass', 'info', 'log', 'logProcesses', 'logThreads', 'makeLogRecord', 'os', 'raiseExceptions', 'root', 'setLoggerClass', 'shutdown', 'string', 'sys', 'thread', 'threading', 'time', 'traceback', 'types', 'warn', 'warning'] 

우리는 구성 요소의 세트 같은 있습니다.

이 당신이

>>> import logging 
>>> logging.__file__ 
'/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/logging/__init__.pyc' 

또는하여 확인할 수 있습니다, 당신이있는 기본 시스템을 기반으로 로깅 모듈의 위치를 ​​업데이트 할 필요가 의미 매우 건조 아니라는 것을 명심 마지막 주 임 따라 사용자 정의 logging.py 찾을 수없는 디렉토리에 imp.find_modulefp, pathname, description = imp.find_module('logging') ...

를 사용해야합니다 당신은 내가 여전히 갈등 않을 것 다른 것을 추천 할 것입니다 모듈 logging.py 명명에 대한 이유가있다.

+1

절대 경로를 지정하는 대신 실제로이 작업을 수행하려는 경우 sys.path : if path :'(시작시 '를 건너 뛰고'catch/try ')에서'for path'를 반복 할 수 있습니다. imp.load_module ..., os.path.join (경로, 'logging.py')'성공할 때까지 – abarnert

+0

흥미로운 점, 여전히'logging'은 여러 파일들로 구성된 모듈이므로'dir = os.path.join (경로, '로깅')'그것은 우리의 경로 내에 다른 충돌이 있는지 알지 못하기 때문에 약간 위험 할 것입니다 ... –

+0

좋습니다, 예, 당신은'logging '보다는'logging'에 대해 옳습니다. 그러나 "조금 위험하다"... OP가 원하는 것은 본질적으로 위험하거나 모호하다. "표준 모듈"에 대한 정의가 없으므로 "sys.path에있는 모듈 로컬 경로 "는 당신이 얻는 것만큼이나 합리적입니다. 그러나 편집증에 빠지기를 원하면 아래에서 제 대답을보십시오 – abarnert

관련 문제