사내에서 urlimport 를 perforce 와 연계해서 사용하고 있는 중 입니다.

문제는 프로그래머가 아닌 사용자가 urlimport 랑 p4python 을 설치하는 것은 꽤나 귀찮은 일이더군요.

urlimport 의 경우는 python site-packages 디렉토리를 찾아 복사해줘야 하고
p4python 은  커맨드라인에서 setup.py install 을 실행해야하는데...;
... orz;;

가만히 생각해보니 파이썬 모듈들은 전부 msi 로 배포된다는 사실이 떠오르더군요.

게다가 촌스러운 모양도 거의 동일하기 때문에;
아무래도 파이썬에서 제공해주는 기능이 아닐까 생각되더라구요.

열심히 검색해 본 결과!

setup.py bdist_wininst


이렇게 실행하면 윈도우즈용 인스톨러가 만들어지더군요 -ㅁ-; 오오오;




이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/04/14 17:58 2010/04/14 17:58
파이썬 모듈에는 바이너리 설치(.msi) 모듈외에 소스 설치(setup.py) 모듈이 존재한다.

지금까지 바이너리 설치 모듈은 잘 사용해왔지만, 소스 설치 모듈은 써본적이 없었는데
불행히도 클라이언트 인증 암호화 프로토타입 구현을 위해 찾아낸 pycrypto
소스 설치 모듈이었다 -_-

소스 설치 모듈 사용법은 간단했지만...

setup.py install

문제는 확장 모듈 빌드에 실패했다는 것이다.

running build_ext
building 'Crypto.Hash.MD2' extension
error: Unable to find vcvarsall.bat
vcvarsall.bat 는 vc2005 설치시
C:\Program Files (x86)\Microsoft Visual Studio 8\VC 위치에 설치되는 배치파일이다.

그냥 path 지정이 안되어서 그런걸까? 라는 생각도 해봤지만...
내가 distutils 모듈를 제작한다고 생각해보면...
vc 설치 경로 찾는 것정도는 별일아닌데 설마 안했을까 라는 생각에...
소스를 뒤져보았다.

해당 에러는 msvc9compiler.py 에서 발생했다.


def query_vcvarsall(version, arch="x86"):
"""Launch vcvarsall.bat and read the settings from its environment
"""
vcvarsall = find_vcvarsall(version)
interesting = set(("include", "lib", "libpath", "path"))
result = {}

if vcvarsall is None:
raise DistutilsPlatformError("Unable to find vcvarsall.bat")


msvc9 으로 처리하다 실패했다는 것인데
하지만 내가 설치한 vc 는 vc2005 (msvc8)이라는 것이었다.

그래서 저 함수를 호출한 곳을 찾아보니 아래와 같았다

추적1

def query_vcvarsall(version, arch="x86"):
"""Launch vcvarsall.bat and read the settings from its environment
"""
vcvarsall = find_vcvarsall(version)


추적2

class MSVCCompiler(CCompiler) :
...
vc_env = query_vcvarsall(VERSION, plat_spec)
...


추적3

VERSION = get_build_version()
if VERSION < 8.0:
raise DistutilsPlatformError("VC %0.1f is not supported by this module" % VERSION)


문제의 원인은 바로 get_build_version 이었다.


def get_build_version():
...
prefix = "MSC v."
i = sys.version.find(prefix)
...


현재 python 을 빌드했던 버전으로 컴파일 시도했던 것이었다.

추적3 의
VERSION = get_build_version() 부분을
VERSION = 8.0 으로 바꾸면 해결~

ps.
위의 방법은 python 배포본을 수정해야하기 때문에 좀더 현실적인 해결책을 만들어보았습니다


from distutils import msvc9compiler
msvc9compiler.VERSION = 8.0


햐햐 >ㅁ<)/
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/11/30 15:21 2009/11/30 15:21