2011-02-02 4 views
5

나는 알고있다, 그것은 더럽다. __init__ 파이썬 모듈의 모듈을 납치하여 스스로 대체 할 수 있는지 알고 싶습니다.파이썬에서 모듈을 원숭이 패치 __init__하는 방법?

내가 장고 리브 (django lib)가 우리의 구성과 충돌하게 만드는 init 프로세스의 일부를 시작하지 못하게해야하기 때문에 묻습니다.

그리고 네, django 라이브러리를 수정하고 패치를 보내주는 것이 좋습니다. 예, 저는 그것에 대해 저자와 연락하고 있습니다. 그러나 현재로서는 빠른 수정이 필요합니다.

+4

'__init __. py'를 원하는대로 편집하는 것은 어떻습니까? 그것은 단지 평범한 텍스트입니다. –

답변

0

__init__.py 파일을 편집 할 수 있습니다. 당신을 멈추게하는 것은 아무것도 없으며 만약 당신이 그것을 올바르게한다면 나쁜 일은 일어나지 않을 것입니다.

+0

나는 대답해야한다고 대답하려고합니다. +1 –

+0

의심 스러울 때 해킹하세요! – jathanism

+0

나는 기존 파일을 백업하고 편집 할 것입니다. – XORcist

4

가져 오기 절차를 가로 챌 수있는 한 가지 방법은 원숭이 패치 전에 가져 오기 전에 가져온 다른 모듈에서 가져 오기를 수행하기 전에 언젠가 가져 오기를 시뮬레이트하는 것입니다. sys.modules에 원하는 이름을 모듈 이름을 키로 삽입하고 원래 모듈을 가져올 시간이되면 파이썬은 sys.modules에 항목을 찾아서 사용하게됩니다. 가져 오기가 일부 마법 방법으로 완료되면이 기능이 작동하지 않을 수 있습니다.

한편, 항상 원래 프로젝트를 복사하고 원하는대로 패치 할 수 있습니다.

+0

+1로 끝납니다.하지만 그 일을하지 못했습니다. 제대로 교체하는 방법을 알 수 없습니다. 모듈 dict에 항목을 설정하면 내 버전이 같은 디렉토리에 있지 않기 때문에 하위 서브 모듈을 가져올 수 없습니다. –

+0

맞아요, 당신은 서브 모듈 가져 오기에 문제가있을 거라고 생각했습니다. 당신도 수동으로 그 서브 모듈을 가져오고 가져올 수 있지만, 그렇게하는 가장 좋은 방법은 확실하지 않습니다. 마지막으로 시도 할 수있는 것은 외부 함수/전역/등을 일시적으로 원숭이 패치하는 것입니다. 문제의 모듈이 사용하는 것. 결국, 모듈이 부작용과 관련된 작업을 수행하고 있다면 아마도 외부 함수를 호출하거나 전역 변수를 수정하고있을 것입니다. 가져 오기 직전에 패치를 수행하고 직후에 원숭이 패치를 다시 설정하면됩니다. –

관련 문제