2009-08-07 40 views
11

Tôi sử dụng CMake để xây dựng ứng dụng của mình. Làm thế nào tôi có thể tìm thấy thư mục python site-packages nằm ở đâu? Tôi cần đường dẫn để biên dịch một phần mở rộng cho python.Tìm thư mục gói trang python với CMake

CMake phải có khả năng tìm đường dẫn trên cả ba hệ điều hành chính khi tôi định triển khai ứng dụng của mình trên Linux, Mac và Windows.

tôi đã cố gắng sử dụng

include(FindPythonLibs) 
find_path(PYTHON_SITE_PACKAGES site-packages ${PYTHON_INCLUDE_PATH}/..) 

tuy nhiên điều đó không làm việc.

Tôi cũng có thể có được con đường bằng cách chạy

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" 

trên vỏ, nhưng làm thế nào tôi sẽ gọi mà từ CMake?

GIẢI PHÁP:

Cảm ơn, Alex. Vì vậy, các lệnh đó mang lại cho tôi những dir trang web gói là:

execute_process (COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE) 

Lệnh OUTPUT_STRIP_TRAILING_WHITESPACE là cần thiết để loại bỏ các dòng mới trailing.

+2

Chỉ để tham khảo trong tương lai; Tôi đã tìm thấy gói tuyệt vời này: https://github.com/lyricat/Hotot/tree/master/cmake/modules – dashesy

Trả lời

6

Bạn có thể thực hiện các quy trình bên ngoài bằng cmake với execute_process (và nhận đầu ra thành một biến nếu cần, vì nó sẽ ở đây).

+2

Điều này trông giống như một hack. Đây có phải là (sau sáu năm) con đường để đi? –

+1

@TorstenBronger Tại sao đây lại là hack? CMake cần lấy thông tin từ đâu đó, vậy tại sao không hỏi ai biết rõ nhất là Python trực tiếp? – kynan

+0

FWIW, ý định sử dụng CMake của tôi là sử dụng nó để trừu tượng hóa những thứ như vậy. –

1

Tôi khuyên bạn nên sử dụng get_python_lib(True) nếu bạn đang thực hiện tiện ích mở rộng này làm thư viện động. Tham số đầu tiên này nên là sự thật nếu bạn cần các vị trí cụ thể nền tảng (trong các máy linux 64bit, đây có thể /usr/lib64 thay vì /usr/lib)

2

phiên bản cập nhật Hơi mà tôi sử dụng cho lcm:

execute_process(
    COMMAND "${PYTHON_EXECUTABLE}" -c "if True: 
    from distutils import sysconfig as sc 
    print(sc.get_python_lib(prefix='', plat_specific=True))" 
    OUTPUT_VARIABLE PYTHON_SITE 
    OUTPUT_STRIP_TRAILING_WHITESPACE) 

này đặt PYTHON_SITE vào đường dẫn tương đối tiền tố thích hợp, thích hợp để sử dụng như:

install(
    FILES ${mypackage_python_files} 
    DESTINATION ${PYTHON_SITE}/mypackage) 

(Vui lòng không cài đặt vào đường dẫn tuyệt đối! Hãy bỏ qua đường đi) CMAKE_INSTALL_PREFIX.)

+1

Điểm của 'nếu Đúng:' là gì? Chỉ để cho phép bạn thụt lề 2 dòng còn lại? – kynan

+1

Chính xác là: để tập lệnh nội tuyến không đột nhập vào mã thụt lề của mã CMake xung quanh. – Matthew

Các vấn đề liên quan