2017-11-15 5 views
0

PyBluez이 macOS에 설치되는 방식을 개선하려고합니다. Here은 변경 전의 setup.py 코드입니다.package_data를 사용하여 빌드 된 프레임 워크를 Python 패키지로 복사

즉, macOS에서는 lightblue이라는 추가 패키지가 설치되며 이는 LightAquaBlue.framework라는 프레임 워크에 따라 다릅니다. 오늘, xcodebuild를 호출하여 프레임 워크를 만들고 /Library/Frameworks에 설치했지만, 프레임 워크를 Python 패키지 내에 임베드하도록 변경하려고합니다.

는 여기에 내가 무슨 짓을했는지의 :

packages.append('lightblue') 
package_dir['lightblue'] = 'osx' 
install_requires += ['pyobjc-core>=3.1', 'pyobjc-framework-Cocoa>=3.1'] 

# Add the LightAquaBlue framework to the package data as an 'eager resource' 
# so that we can extract the whole framework at runtime 
package_data['lightblue'] = [ 'LightAquaBlue.framework' ] 
eager_resources.append('LightAquaBlue.framework') 

# FIXME: This is inelegant, how can we cover the cases? 
if 'install' in sys.argv or 'bdist' in sys.argv or 'bdist_egg' in sys.argv: 
    # Build the framework into osx/ 
    import subprocess 
    subprocess.check_call([ 
     'xcodebuild', 'install', 
     '-project', 'osx/LightAquaBlue/LightAquaBlue.xcodeproj', 
     '-scheme', 'LightAquaBlue', 
     'DSTROOT=' + os.path.join(os.getcwd(), 'osx'), 
     'INSTALL_PATH=/', 
     'DEPLOYMENT_LOCATION=YES', 
    ]) 

이합니다 (lightblue 패키지의 디렉토리입니다) osx/ 내부 LightAquaBlue.framework를 구축하고 package_data로 setuptools에 전달합니다. 내가 pip install --upgrade -v ./pybluez/ 실행할 때 그러나 LightAquaBlue.framework 복사 하지은 다음과 같습니다

creating build/lib/lightblue 
copying osx/_bluetoothsockets.py -> build/lib/lightblue 
copying osx/_LightAquaBlue.py -> build/lib/lightblue 
copying osx/_obexcommon.py -> build/lib/lightblue 
copying osx/_IOBluetoothUI.py -> build/lib/lightblue 
copying osx/__init__.py -> build/lib/lightblue 
copying osx/_IOBluetooth.py -> build/lib/lightblue 
copying osx/_obex.py -> build/lib/lightblue 
copying osx/_lightblue.py -> build/lib/lightblue 
copying osx/obex.py -> build/lib/lightblue 
copying osx/_macutil.py -> build/lib/lightblue 
copying osx/_lightbluecommon.py -> build/lib/lightblue 

내가 osx/ 내부 더미 파일을 생성하고, package_data에 추가있는 setup.py가있는 경우, 그 가 복사됩니다 않습니다. 이것은 나에게 경로를 통한 혼란이 없음을 시사합니다.

os.system('ls osx/')을 추가하면 LightAquaBlue.framework가 더미 파일과 동일한 위치에 있음을 보여줍니다.

LightAquaBlue 
--> LightAquaBlue.framework 
    DUMMY_FILE_THAT_WORKS 
    _IOBluetooth.py 
    _IOBluetoothUI.py 
    _LightAquaBlue.py 
    __init__.py 
    _bluetoothsockets.py 
    _lightblue.py 
    _lightbluecommon.py 
    _macutil.py 
    _obex.py 
    _obexcommon.py 
    obex.py 

왜 프레임 워크가 제대로 복사되지 않습니까?

답변

0

그것은 setuptools에 '문서 contradicts the implementation처럼 보인다 실제로 당신은 디렉토리 package_data에 포함 지정할 수 없습니다.

아주 우아한 아니지만, 내가 사용 :

# We can't seem to list a directory as package_data, so we will 
# recursively add all all files we find 
package_data['lightblue'] = [] 
for path, _, files in os.walk('osx/LightAquaBlue.framework'): 
    for f in files: 
     include = os.path.join(path, f)[4:] # trim off osx/ 
     package_data['lightblue'].append(include)