<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 3.2 檢測Python庫 **NOTE**:*此示例代碼可以在 https://github.com/devcafe/cmake-cookbook/tree/v1.0/chapter-03/recipe-02 中找到,有一個C示例。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 可以使用Python工具來分析和操作程序的輸出。然而,還有更強大的方法可以將解釋語言(如Python)與編譯語言(如C或C++)組合在一起使用。一種是擴展Python,通過編譯成共享庫的C或C++模塊在這些類型上提供新類型和新功能,這是第9章的主題。另一種是將Python解釋器嵌入到C或C++程序中。兩種方法都需要下列條件: * Python解釋器的工作版本 * Python頭文件Python.h的可用性 * Python運行時庫libpython 三個組件所使用的Python版本必須相同。我們已經演示了如何找到Python解釋器;本示例中,我們將展示另外兩種方式。 ## 準備工作 我們將一個簡單的Python代碼,嵌入到C程序中,可以在Python文檔頁面上找到。源文件稱為`hello-embedded-python.c`: ```c #include <Python.h> int main(int argc, char *argv[]) { Py_SetProgramName(argv[0]); /* optional but recommended */ Py_Initialize(); PyRun_SimpleString("from time import time,ctime\n" "print 'Today is',ctime(time())\n"); Py_Finalize(); return 0; } ``` 此代碼將在程序中初始化Python解釋器的實例,并使用Python的`time`模塊,打印日期。 **NOTE**:*嵌入代碼可以在Python文檔頁面的 https://docs.python.org/2/extending/embedding.html 和 https://docs.python.org/3/extending/embedding.html 中找到。* ## 具體實施 以下是`CMakeLists.txt`中的步驟: 1. 包含CMake最低版本、項目名稱和所需語言: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-02 LANGUAGES C) ``` 2. 制使用C99標準,這不嚴格要求與Python鏈接,但有時你可能需要對Python進行連接: ```cmake set(CMAKE_C_STANDARD 99) set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_C_STANDARD_REQUIRED ON) ``` 3. 找到Python解釋器。這是一個`REQUIRED`依賴: ```cmake find_package(PythonInterp REQUIRED) ``` 4. 找到Python頭文件和庫的模塊,稱為`FindPythonLibs.cmake`: ```cmake find_package(PythonLibs ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED) ``` 5. 使用`hello-embedded-python.c`源文件,添加一個可執行目標: ```cmake add_executable(hello-embedded-python hello-embedded-python.c) ``` 6. 可執行文件包含`Python.h`頭文件。因此,這個目標的`include`目錄必須包含Python的`include`目錄,可以通過`PYTHON_INCLUDE_DIRS`變量進行指定: ```cmake target_include_directories(hello-embedded-python PRIVATE ${PYTHON_INCLUDE_DIRS} ) ``` 7. 最后,將可執行文件鏈接到Python庫,通過`PYTHON_LIBRARIES`變量訪問: ```cmake target_link_libraries(hello-embedded-python PRIVATE ${PYTHON_LIBRARIES} ) ``` 8. 現在,進行構建: ```shell $ mkdir -p build $ cd build $ cmake .. ... -- Found PythonInterp: /usr/bin/python (found version "3.6.5") -- Found PythonLibs: /usr/lib/libpython3.6m.so (found suitable exact version "3.6.5") ``` 9. 最后,執行構建,并運行可執行文件: ```shell $ cmake --build . $ ./hello-embedded-python Today is Thu Jun 7 22:26:02 2018 ``` ## 工作原理 `FindPythonLibs.cmake`模塊將查找Python頭文件和庫的標準位置。由于,我們的項目需要這些依賴項,如果沒有找到這些依賴項,將停止配置,并報出錯誤。 注意,我們顯式地要求CMake檢測安裝的Python可執行文件。這是為了確保可執行文件、頭文件和庫都有一個匹配的版本。這對于不同版本,可能在運行時導致崩潰。我們通過`FindPythonInterp.cmake`中定義的`PYTHON_VERSION_MAJOR`和`PYTHON_VERSION_MINOR`來實現: ```cmake find_package(PythonInterp REQUIRED) find_package(PythonLibs ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} EXACT REQUIRED) ``` 使用`EXACT`關鍵字,限制CMake檢測特定的版本,在本例中是匹配的相應Python版本的包括文件和庫。我們可以使用`PYTHON_VERSION_STRING`變量,進行更接近的匹配: ```cmake find_package(PythonInterp REQUIRED) find_package(PythonLibs ${PYTHON_VERSION_STRING} EXACT REQUIRED) ``` ## 更多信息 當Python不在標準安裝目錄中,我們如何確定Python頭文件和庫的位置是正確的?對于Python解釋器,可以通過CLI的`-D`選項傳遞`PYTHON_LIBRARY`和`PYTHON_INCLUDE_DIR`選項來強制CMake查找特定的目錄。這些選項指定了以下內容: * **PYTHON_LIBRARY**:指向Python庫的路徑 * **PYTHON_INCLUDE_DIR**:Python.h所在的路徑 這樣,就能獲得所需的Python版本。 **TIPS**:*有時需要將`-D PYTHON_EXECUTABLE`、`-D PYTHON_LIBRARY`和`-D PYTHON_INCLUDE_DIR`傳遞給CMake CLI,以便找到及定位相應的版本的組件。* 要將Python解釋器及其開發組件匹配為完全相同的版本可能非常困難,對于那些將它們安裝在非標準位置或系統上安裝了多個版本的情況尤其如此。CMake 3.12版本中增加了新的Python檢測模塊,旨在解決這個棘手的問題。我們`CMakeLists.txt`的檢測部分也將簡化為: `find_package(Python COMPONENTS Interpreter Development REQUIRED)` 我們建議您閱讀新模塊的文檔,地址是: https://cmake.org/cmake/help/v3.12/module/FindPython.html
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看