2016-09-03 9 views
0

나는의 distutils에 대해 다음과 같이 정의 된 setup 명령이 : 그럼distutils는 복사 할 바이너리 파일을 어떻게 결정합니까? (이 중요한 경우, 맥 OS X에 대한 py2app 사용)

... 
building 'tracking_funcs' extension 
creating build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/tracking_funcs 
/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c tracking_funcs/tracking_funcs.c -o build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/tracking_funcs/tracking_funcs.o 
... (some compiler warnings) ... 
42 warnings generated. 
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/tracking_funcs/tracking_funcs.o -o build/bdist.macosx-10.6-x86_64/lib.macosx-10.6-x86_64-2.7/tracking_funcs.so 
building '_psutil_osx' extension 
creating build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/psutil 
... (some compiler warnings) ... 
2 warnings generated. 
/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DPSUTIL_VERSION=400 -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c psutil/_psutil_common.c -o build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/psutil/_psutil_common.o 
/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DPSUTIL_VERSION=400 -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c psutil/arch/osx/process_info.c -o build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/psutil/arch/osx/process_info.o 
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/psutil/_psutil_osx.o build/bdist.macosx-10.6-x86_64/lib.macosx-10.6-x86_64-2.7/_psutil_osx.so -framework CoreFoundation -framework IOKit 
building '_psutil_posix' extension 
/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c psutil/_psutil_posix.c -o build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/psutil/_psutil_posix.o 
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/bdist.macosx-10.6-x86_64/temp.macosx-10.6-x86_64-2.7/psutil/_psutil_posix.o -o build/dist.macosx-10.6-x86_64/lib.macosx-10.6-x86_64-2.7/_psutil_posix.so 
... 

복사합니다 : 그것은 제대로 세 확장 빌드

setup(..., 
     extensions=Extension('tracking_funcs', 
          ['tracking_funcs/tracking_funcs.pyx'], 
          include_dirs=[numpyincludedirs,]), 
       Extension('_psutil_osx', 
          sources = ['psutil/_psutil_osx.c', 
             'psutil/_psutil_common.c', 
             'psutil/arch/osx/process_info.c'], 
             define_macros=[('PSUTIL_VERSION', int(get_psutilver().replace('.', '')))], 
             extra_link_args=['-framework', 'CoreFoundation', 
                 '-framework', 'IOKit']), 
       Extension('_psutil_posix', 
          sources = ['psutil/_psutil_posix.c'])], 
     ...) 

패키지 대상에 바이너리를 작성했지만 세 가지 확장자 중 두 개만 복사합니다.

... 
copying file /.../build/bdist.macosx-10.6-x86_64/lib.macosx-10.6-x86_64-2.7/tracking_funcs.so -> /.../dist/my.app/Contents/Resources/lib/python2.7/lib-dynload/tracking_funcs.so 
copying file /.../build/bdist.macosx-10.6-x86_64/lib.macosx-10.6-x86_64-2.7/_psutil_posix.so -> /.../dist/my.app/Contents/Resources/lib/python2.7/lib-dynload/_psutil_posix.so 
... 

그런 다음 내 a 런타임에 세 번째 확장을 찾을 수 없기 때문에 응용 프로그램이 충돌합니다.

어떻게 디버깅 할 수 있습니까? distutils는 의존성 트리를 어디에서 가져올 까? 내가 정의한 확장 목록이 아니라면? 아마도 버그는 distutils 자체보다는 py2app에있을 것입니까?

답변

0

Py2app usesmodulegraph 프로젝트의 모든 종속성에 대한 모든 종속성을 포함하는 소스 트리를 반복적으로 빌드합니다. debug-modulegraph 플래그가 설정 py2app를 실행하면 콘솔에 디버깅 정보의 무리를 인쇄하고 모듈 그래프의 내용을 찾아 볼 수 a breakpoint로 떨어질 것 :

$ python setup.py py2app --debug-modulegraph 
... 
(Pdb) for item in mf.flatten(): print item 

이 아마 출력에 (MissingModule) psutil._psutil_osx과 같이 표시됩니다를 이는 modulegraph가 해당 확장에 대한 가져 오기 경로를 찾을 수 없음을 의미합니다.

Modulegraph는 addPackagePath이라는 공용 함수를 제공하므로 특정 패키지의 파일을 찾는 위치에 대한 추가 힌트를 제공 할 수 있습니다. 이 경우 setup.py에 다음과 같이 추가하면 문제가 해결됩니다.

from modulegraph import modulegraph 
modulegraph.addPackagePath('psutil', 'build/bdist.macosx-10.6-x86_64/lib.macosx-10.6-x86_64-2.7/psutil/')