2009-02-04 95 views
7

我有一個Python的C擴展模塊,我想讓它可用於Rubyists。組合Python和Ruby擴展模塊

這個源代碼有很多C模塊,只有一個是Python依賴的。其餘的只依賴彼此和標準庫。我可以用通常的方式用python setup.py build來構建它。

我一直在嘗試使用newgem添加Ruby支持,我可以用rake gem構建擴展版本。然而,合併後的源代碼有一個醜陋的目錄佈局(混合Gem風格和Setuptools風格的結構),構建過程是一個混亂。

我不能只保留在同一目錄中的所有來源,因爲mkmf會自動選取Python依賴模塊並嘗試構建它,並且用戶不應該必須安裝Python來編譯不會使用。我目前的做法是爲extconf.rb將獨立於Python的源文件複製到與Ruby相關的擴展模塊所在的目錄中。

有沒有更好的方法讓代碼對兩種語言都可用?我應該在獨立的Gem中複製獨立於Python的代碼嗎?我應該將獨立代碼作爲獨立的自由工具構建嗎?是否有可以跳過不需要的模塊的mkmf版本?

回答

5

一個解決這個問題的方法是創建三個不同的項目:

  • 庫本身,獨立於蟒蛇&紅寶石
  • Python綁定
  • Ruby綁定

這可能是最乾淨的解決方案,儘管在發佈版本時需要更多的工作,但它的優點是您可以發佈新版本的Ruby綁定,而無需必須發佈一個新的庫/ python綁定版本。

0

作爲Johan說的補充,由於swig的原因,我在Python中使用了一對c/C++支持庫。你用c/C++編寫你的代碼,然後爲你想要支持的每種語言製作一箇中介模板。它對於Python來說是相當痛苦的,但是對於Ruby來說必須考慮一些問題......也就是說我不認爲pthread支持是爲了滿足ruby或反之亦然。

http://www.swig.org/ 它有一個陡峭的學習曲線,所以它可能是最好找到一個示例項目,演示如何使用您的目標語言的包裝。

這絕對是一個有用的工具,因爲它使您的代碼更加清潔,同時仍然提供對多種語言(PHP,Python,Ruby和我相信c#)的可靠綁​​定。