2012-07-16 143 views
12

我有幾個Python模塊(組織到包),這互相依賴。例如如何使用cython編譯和鏈接多個python模塊(或包)?

  • 模塊1
  • 單詞數:進口模塊1
  • 單詞數
  • 單詞數:進口單詞數,模塊2,模塊1

假設相關的接口來開發應用程序是在單詞數和我想要生成一個Module4.so使用cython。 如果我繼續幼稚的方式,我得到一個擴展Module4.so,我可以導入但是擴展依賴於Module1,Module2,Module3的python源代碼

有沒有辦法編譯,以便模塊1,模塊2,模塊3是編譯和鏈接到Module4?我想避免手動做所有事情,例如首先編譯Module1.so然後改變進口報關的單詞數,從而導入Module1.so而非Module1.py,然後編譯單詞數爲Module2.so等等....

謝謝!

回答

9

編輯。前兩個選項是指Cython特定的代碼,我錯過的是關於純Python模塊的問題,所以選項3是解決方案。

有幾個選項:

1. 請參閱本「如何創建一個層次上的模塊封裝」: https://github.com/cython/cython/wiki/PackageHierarchy

2. 我更喜歡「包含」聲明: http://docs.cython.org/src/userguide/language_basics.html#the-include-statement 我有很多.pyx文件,它們都包含在main.pyx,這一切都在一個命名空間。結果是一個大模塊:http://code.google.com/p/cefpython/source/browse/cefpython.pyx

3. 您可以通過添加多個「擴展」編譯一次使用設置您的所有模塊:

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = [Extension("example", sourcefiles), Extension("example2", sourcefiles2), Extension("example3", sourcefiles3)] 
) 

4. 一個比較有效的編譯 - 見here

setup (
    name = 'MyProject', 
    ext_modules = cythonize(["*.pyx"]), 
) 
+0

謝謝,所以選項3會小心自動導入Module3.so而不是Module3.py(我指的是上面的例子)? – Mannaggia 2012-07-16 15:56:36

+0

@Mannaggia,啊,現在我明白了,你不使用用Cython特定功能(「PYX」文件),你只需要編譯使用用Cython正常Python模塊。是的,聲明中「導入模塊1」作品導入「Module1.py」或「Module1.so」 - 只是不要把兩個文件在同一目錄,因爲我不知道哪個模塊將被然後導入做。沒有任何變化,.so在導入時被視爲.py文件。 – 2012-07-16 23:29:45

+1

@Mannaggia,沒有什麼變化,導入時,.so被視爲.py文件。將.py模塊編譯爲.so之後,所有內容都應該可以正常工作。 – 2012-07-16 23:36:16