2017-03-07 21 views
1

코드가 pybind11swig으로 포장되어 있지만, 필자는 pip install 패키지를 올바르게 얻을 수있는 방법에 관한 문서를 찾지 못하는 것 같습니다.swyp/pybind11 C++ 프로젝트를 파이핑에 넣는 방법

Pybind.

내가 원하는 것은 리눅스 용 이진 휠 & OSX를 빌드하는 것이라고 생각하지만, 이에 대한 많은 문서를 찾을 수는 없다. Some people do this via travis and scripting 내 생각 엔? 모든 배포판에 바퀴를 달 수있는 플러그 앤 플레이 방식이 있습니까?

답변

1

정보를 찾지 못한 것은 이상한 일입니다. distutuis 및 그 더 큰 형 setuptools은 설치하기 전에 이진 Python-C 확장 모듈을 빌드 할 수있는 Extension 클래스를 제공하며 비 파이썬 파일은 MANIFEST.in 파일을 통해 배포판에 포함될 수 있습니다. Pybind11은 header-only 라이브러리이므로, 그것에 의존하는 모듈을 만드는 데 어려움이 없어야합니다. 그러나, distutils/setuptools는 바이너리 모듈에 대한 사전 빌드 종속성을 지원하지 않기 때문에 배포본에 Pybind11 헤더를 포함하는 것이 더 좋습니다 (대략 1236 개 정도되지 않습니다).

헤더 파일 (Pybind11 포함)이 include dir이고 소스 파일이 src dir이라고 가정 해 봅시다. 그런 다음 setup.py 파일은 다음과 같이한다 : 당신은 매크로 정의 등과 같은 다른 매개 변수를 추가 할 수 있습니다

import os 
from setuptools import setup 
from setuptools.extension import Extension 

this_dir = os.path.dirname(os.path.abspath(__file__)) 

foo = Extension(
    name='foo', 
    include_dirs=[os.path.join(this_dir, 'include')], 
    sources=[ 
     os.path.join(this_dir, 'src', 'foo.cpp'), 
     os.path.join(this_dir, 'src', 'bar.cpp') 
    ] 
) 

setup(
    name='foo', 
    version='0.0.1', 
    author='John Doe', 
    description='foo module', 
    long_description='blah, blah, blah...', 
    url='http://example.com', 
    classifiers=[ 
     # The list of PyPI classifiers 
    ], 
    ext_modules=[foo], 
    zip_safe=False, 
    include_package_data=True, 
) 

. 귀하의 MANIFEST.in은 다음과 같아야합니다

recursive-include src *.cpp 
recursive-include include *.h 

이제 패키지를 게시 할 수 있습니다 여기에 설명 된대로 : 만 twine 사용에 대한 자신의 추천은 가난한 HTTPS 지원 고대 파이썬 배포판에 대한 유효 함을주의 할 수 https://packaging.python.org.

이제 모든 사용자는 pip install foo을 입력하여 해당 환경에 패키지를 설치할 수 있습니다 (Python 버전과 호환되는 C/C++ 컴파일러가 설치되어있는 경우). 이것은 일반적으로 리눅스 (나는 Mac에 대한 지식이 없다)에서 문제가되지 않지만 Windows에서는 PITA 일 수 있습니다. 따라서 설치를 단순화하기 위해 위 패키지 가이드에 설명 된대로 사전 컴파일 된 휠을 소스 배포에 추가 할 수 있습니다. Travis 또는 Appveyor (Windows 기반 CI)와 같은 CI를 사용하여 바퀴 컴파일을 자동화하고 PyPI에 게시 할 수 있습니다. PyPI가 대상 플랫폼을위한 바퀴를 가지고 있다면, 그것은 단순히 사용자의 환경으로 풀립니다. 그렇지 않으면 모듈은 소스에서 컴파일됩니다 (호환 가능한 컴파일러가 사용 가능한 경우 다시 컴파일 또는 설치가 실패합니다).

SWIG에 익숙하지 않지만 documentation에 나와 있듯이 컴파일하는 동안 SWIG 래퍼를 C 코드로 변환하는 것은 기본적으로 setuptools에서 지원됩니다. SWIG 래퍼 파일은 MANIFEST.in을 통해 포함됩니다.

바이너리 파이썬 모듈이 Boost 나 OpenSSL과 같은 일부 외부 사전 빌드 라이브러리에 의존적이면 상황이 복잡합니다. 앞서 말했듯이 setuptools는 사전 빌드 종속성을 지원하지 않으며 Windows의 경우 바이너리 라이브러리에 대한 중앙 저장소가 없습니다 (예 : vcpkg을 작성하여 상황을 수정하려고 시도 함). 이 경우 패키지에 모든 것을 포함 시키거나 가능한 한 많은 플랫폼에 대해 정적으로 컴파일 된 휠을 제공하거나 pip- 바이너리 모듈을 설치하기 전에 예비 사용자에게 몇 가지 필수 구성 요소를 설치해야한다고 경고하십시오.

+0

안녕하세요, 이 위대한 답변에 감사드립니다. distutils/setuptools는 바이너리 모듈의 사전 빌드 종속성을 지원하지 않습니다. 이것은 정확하게 내가 겪고있는 문제 일 수 있습니다. –

+0

pip는 후드에서'setuptools'를 사용하고 패키지 소스를 다운로드 한 후에 (단순히 바퀴가 프로세스가 약간 다릅니다)'python setup.py build install'을 실행합니다. 순수 Python 배포판의 경우'build'는'/ build/lib/'디렉토리에 모든 것을 복사하는 것을 의미하지만, 이진 모듈의 경우'build' 단계는 컴파일러로 실제 빌드를 의미합니다. 그래서'install_requires ='는'install' 단계에서만 작동하고, 제가 아는 한 ** build ** 의존성을 지정할 수있는'build_requires' 매개 변수는 없습니다. –

+0

사실, 내가 사용하고있는 [setuptools] (http://setuptools.readthedocs.io/en/latest/setuptools.html)에는 * setup_requires가 있습니다. 나는 아직도 내가 [이 오류] (https://travis-ci.org/fraenkel-lab/pcst_fast/jobs/219742904)를 얻고있다. 나는 광산 이외의 다른 플랫폼에서 바퀴를 만들려고하는데, 나는 그것에 대해 모른다. –