<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 在 Cython 模塊之間共享聲明 > 原文: [http://docs.cython.org/en/latest/src/userguide/sharing_declarations.html](http://docs.cython.org/en/latest/src/userguide/sharing_declarations.html) 本節描述如何在一個 Cython 模塊中使 C 聲明,函數和擴展類型可用于另一個 Cython 模塊。這些工具以 Python 導入機制為模型,可以被認為是它的編譯時版本。 ## 定義和實施文件 Cython 模塊可以分為兩部分:帶有`.pxd`后綴的定義文件,包含可供其他 Cython 模塊使用的 C 聲明,以及帶有`.pyx`后綴的實現文件,其中包含其他所有內容。當模塊想要使用在另一個模塊的定義文件中聲明的內容時,它會使用 [`cimport`](#cimport) 語句導入它。 僅包含 extern 聲明的`.pxd`文件不需要與實際的`.pyx`文件或 Python 模塊相對應。這可以使它成為一個放置常見聲明的便利位置,例如來自 [外部庫](external_C_code.html#external-c-code) 的函數聲明,這些函數需要在多個模塊中使用。 ## 什么定義文件包含 定義文件可以包含: * 任何類型的 C 類型聲明。 * extern C 函數或變量聲明。 * 模塊中定義的 C 函數聲明。 * 擴展類型的定義部分(見下文)。 它不能包含任何 C 或 Python 函數的實現,也不能包含任何 Python 類定義或任何可執行語句。當想要訪問 [`cdef`](language_basics.html#cdef) 屬性和方法,或從本模塊中定義的 [`cdef`](language_basics.html#cdef) 類繼承時,需要它。 注意 您不需要(也不應該)在聲明文件 public 中聲明任何內容,以使其可供其他 Cython 模塊使用;它只是存在于定義文件中。如果要為外部 C 代碼提供某些內容,則只需要公開聲明。 ## 實現文件包含什么 實現文件可以包含任何類型的 Cython 語句,但是如果相應的定義文件也定義了該類型,則對擴展類型的實現部分有一些限制(見下文)。如果這個模塊不需要 [`cimport`](#cimport) ,那么這是唯一需要的文件。 ## cimport 聲明 [`cimport`](#cimport) 語句用于定義或實現文件中,以訪問在另一個定義文件中聲明的名稱。它的語法與普通的 Python import 語句完全相同: ```py cimport module [, module...] from module cimport name [as name] [, name [as name] ...] ``` 這是一個例子。 `dishes.pxd`是導出 C 數據類型的定義文件。 `restaurant.pyx`是一個導入并使用它的實現文件。 `dishes.pxd`: ```py cdef enum otherstuff: sausage, eggs, lettuce cdef struct spamdish: int oz_of_spam otherstuff filler ``` `restaurant.pyx`: ```py from __future__ import print_function cimport dishes from dishes cimport spamdish cdef void prepare(spamdish *d): d.oz_of_spam = 42 d.filler = dishes.sausage def serve(): cdef spamdish d prepare(&d) print(f'{d.oz_of_spam} oz spam, filler no. {d.filler}') ``` 重要的是要理解 [`cimport`](#cimport) 語句只能用于導入 C 數據類型,C 函數和變量以及擴展類型。它不能用于導入任何 Python 對象,并且(有一個例外)它并不意味著在運行時導入任何 Python。如果要引用已經 cimported 的模塊中的任何 Python 名稱,則還必須為其包含常規 import 語句。 例外情況是,當您使用 [`cimport`](#cimport) 導入擴展類型時,其類型對象將在運行時導入,并由您導入它的名稱提供。使用 [`cimport`](#cimport) 導入擴展類型將在下面詳細介紹。 如果`.pxd`文件發生變化,則可能需要重新編譯 [`cimport`](#cimport) 的所有模塊。 `Cython.Build.cythonize`實用程序可以為您解決此問題。 ### 定義文件的搜索路徑 當您 [`cimport`](#cimport) 一個名為`modulename`的模塊時,Cython 編譯器會搜索名為`modulename.pxd`的文件。它沿著包含文件的路徑搜索此文件(由`-I`命令行選項或`cythonize()`的`include_path`選項指定)以及`sys.path`。 使用`package_data`在`setup.py`腳本中安裝`.pxd`文件允許其他軟件包將模塊中的項目作為依賴項進行處理。 此外,每當編譯文件`modulename.pyx`時,首先沿著包含路徑搜索相應的定義文件`modulename.pxd`(但不是`sys.path`),如果找到,則在處理`.pyx`文件之前對其進行處理。 ### 使用 cimport 解決命名沖突 [`cimport`](#cimport) 機制提供了一種簡潔明了的方法來解決使用相同名稱的 Python 函數包裝外部 C 函數的問題。您需要做的就是將外部 C 聲明放入假想模塊的`.pxd`文件中,將 [`cimport`](#cimport) 放入該模塊。然后,您可以通過使用模塊名稱對它們進行限定來引用 C 函數。這是一個例子: `c_lunch.pxd`: ```py cdef extern from "lunch.h": void eject_tomato(float) ``` `lunch.pyx`: ```py cimport c_lunch def eject_tomato(float speed): c_lunch.eject_tomato(speed) ``` 您不需要任何`c_lunch.pyx`文件,因為`c_lunch.pxd`中定義的唯一內容是外部 C 實體。在運行時不會有任何實際的`c_lunch`模塊,但這無關緊要; `c_lunch.pxd`文件完成了在編譯時提供額外命名空間的工作。 ## 共享 C 函數 可以通過 [`cimport`](#cimport) 在`.pxd`文件中為它們添加標題,使模塊頂層定義的 C 函數可用,例如: `volume.pxd`: ```py cdef float cube(float) ``` `volume.pyx`: ```py cdef float cube(float x): return x * x * x ``` `spammery.pyx`: ```py from __future__ import print_function from volume cimport cube def menu(description, size): print(description, ":", cube(size), "cubic metres of spam") menu("Entree", 1) menu("Main course", 3) menu("Dessert", 2) ``` Note 當模塊以這種方式導出 C 函數時,對象將出現在函數名稱下的模塊字典中。但是,您不能使用 Python 中的此對象,也不能使用普通的 import 語句從 Cython 中使用它;你必須使用 [`cimport`](#cimport) 。 ## 共享擴展類型 可以通過 [`cimport`](#cimport) 將擴展類型分為兩部分,一部分在定義文件中,另一部分在相應的實現文件中。 擴展類型的定義部分只能聲明 C 屬性和 C 方法,而不能聲明 Python 方法,并且它必須聲明所有類型的 C 屬性和 C 方法。 實現部分必須實現定義部分中聲明的所有 C 方法,并且可能不會添加任何其他 C 屬性。它也可以定義 Python 方法。 以下是定義和導出擴展類型的模塊示例,以及使用它的另一個模塊: `shrubbing.pxd`: ```py cdef class Shrubbery: cdef int width cdef int length ``` `shrubbing.pyx`: ```py cdef class Shrubbery: def __cinit__(self, int w, int l): self.width = w self.length = l def standard_shrubbery(): return Shrubbery(3, 7) ``` `landscaping.pyx`: ```py cimport shrubbing import shrubbing def main(): cdef shrubbing.Shrubbery sh sh = shrubbing.standard_shrubbery() print("Shrubbery size is", sh.width, 'x', sh.length) ``` 然后,人們需要編譯這兩個模塊,例如運用 `setup.py`: ```py from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize(["landscaping.pyx", "shrubbing.pyx"])) ``` 有關此示例的一些注意事項: * `Shrubbing.pxd`和`Shrubbing.pyx`中都有 [`cdef`](language_basics.html#cdef) 類灌木聲明。編譯 Shrubbing 模塊時,這兩個聲明合并為一個。 * 在 Landscaping.pyx 中, [`cimport`](#cimport) Shrubbing 聲明允許我們將灌木類型稱為`Shrubbing.Shrubbery`。但它在運行時沒有綁定 Landscaping 模塊命名空間中的名稱 Shrubbing,因此要訪問`Shrubbing.standard_shrubbery()`我們還需要`import Shrubbing`。 * 如果您使用 setuptools 而不是 distutils,則需要注意,運行`python setup.py install`時的默認操作是創建一個壓縮的`egg`文件,當您嘗試從依賴包中使用它們時,這些文件無法與`pxd`文件一起用于`pxd`文件。為防止這種情況,請在`setup()`的參數中包含`zip_safe=False`。
                  <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>

                              哎呀哎呀视频在线观看