2011-09-16 3 views
2

python 스크립트에서 동적으로 가져온 모듈을 얻는 방법 (위치 파악)은 무엇입니까?어떻게 정적으로 동적으로로드 된 모듈을 찾으십니까

내 이해에서 파이썬 동적으로 (런타임)로드 모듈 수 있습니다. 이 _ 오기 _ (모듈 이름)을 을 사용하거나 "X 수입 Y에서의"간부를 사용하거나 ("모듈 이름")imp.find_module를 사용 다음 imp.load_module (PARAM1, PARAM2 , param3, param4).

파이썬 파일의 모든 종속성을 얻고 싶다는 것을 알고 있습니다. 여기에는 동적으로로드 된 모듈 (하드 코드 된 문자열 객체를 사용하여로드 된 모듈 또는 함수/메소드에서 반환 된 모듈)을로드하는 모듈이 포함됩니다.

정상 수입 모듈 이름를 들어

X 가져 오기 Y에서 당신은 코드의 수동 검사 중 하나를 수행하거나 module_finder를 사용할 수 있습니다.

파이썬 스크립트와 모든 종속성 (동적으로로드 된 사용자 정의 모듈 포함)을 복사하려면 어떻게해야합니까?

답변

3

당신은 할 수 없다. 프로그래밍의 본질 (어떤 언어로든)은 실제로 실행하지 않고 어떤 코드가 실행되는지 예측할 수 없다는 것을 의미합니다. 따라서 어떤 모듈을 포함시킬 수 있는지 알 길이 없습니다.

이것은 사용자 입력에 의해 혼란 스럽습니다. __import__(sys.argv[1]).

일반적으로 Halting problem으로 설명되는 첫 번째 문제에 대한 이론적 인 정보가 많이 있습니다. 두 번째 문제는 분명히 수행 할 수 없습니다.

2

이론적 인 관점에서 보면 모듈을 어디서/어디에서 가져 오는지 정확히 알 수 없습니다. 실제적인 관점에서 모듈이 어디에 있는지 알고 싶으면 module.__file__ 속성을 확인하거나 python -v 아래에서 스크립트를 실행하여 모듈이로드 될 때 파일을 찾으십시오. 이것은로드 될 수있는 모든 모듈을 제공하지는 않을 것이지만, 대부분의 모듈은 대부분 정상적인 코드로 얻을 것입니다.

은 참조 : 꽤 질문의의 How do I find the location of Python module sources?

0

합니다.

정적 분석은 가능한 모든 런타임 실행 경로를 예측하고 특정 입력에 대해 프로그램이 중지되는지 확인하는 것입니다.

이는 Halting Problem과 동일하며 불행히도 일반적인 해결책이 없습니다.

동적 종속성을 해결할 수있는 유일한 방법은 코드를 실행하는 것입니다.

1

그냥 생각 나는 그것이 작동하는지 모르겠어요 :

당신은 __builtin__.__import__에 대한 래퍼를 포함하는 모듈을 작성할 수 있습니다.이 래퍼는 이전 __import__에 대한 참조를 저장하고 다음 않는 __builtin__.__import__에 기능을 할당합니다 :

라고 할 때마다
  1. , 현재의 스택 트레이스를 얻을 수 및 호출 기능을 작동합니다. 어쩌면 __import__에 대한 globals 매개 변수의 정보로 충분할 수 있습니다.
  2. 는 호출 기능의 모듈을 얻을이 모듈의 이름을 저장하고 무엇
  3. 이 전화 당신이 python -m magic_module yourapp.py와 응용 프로그램을 호출 할 수 있습니다 이런 짓을 한 후 실제 __import__

리디렉션 수입 얻을 것이다. 마법 모듈은 정보를 나중에 검색 할 수있는 곳에 저장해야합니다.

+0

이와 비슷한 기능이 작동합니다. "실제로 코드를 실행하여 코드를 실행하는 것과 동등한 작업을 수행하지 않으면 코드가 무엇을하는지 알 수 없습니다." 그러나 그것은 여전히 ​​당신에게 오직 하나의 특정 모듈에 ** 가져온 모듈을 가져옵니다. 가져올 필요가있는 모든 것이 아닙니다. 합리적으로 정적 인 import가있는 Python 모듈에서는 충분할 것입니다. 그러나 정적 import가 적당하다면 "import"에 대한 grepping만으로도 충분할 것입니다. – Ben

관련 문제