Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python&;Ruby扩展模块_Python_Ruby_Setuptools_Newgem - Fatal编程技术网

Python&;Ruby扩展模块

Python&;Ruby扩展模块,python,ruby,setuptools,newgem,Python,Ruby,Setuptools,Newgem,我有一个用于Python的C扩展模块,我想让Rubyists可以使用它 源代码有许多C模块,其中只有一个依赖于Python。其余部分仅依赖于彼此和标准库。我可以用python setup.py build以通常的方式构建它 我一直在尝试使用newgem添加Ruby支持,我可以使用rakegem构建一个扩展版本。但是,合并的源代码有一个丑陋的目录布局(混合了Gem样式和Setuptools样式的结构),并且构建过程是一个混乱的过程 我不能将所有源代码都保存在同一个目录中,因为mkmf会自动选择依赖

我有一个用于Python的C扩展模块,我想让Rubyists可以使用它

源代码有许多C模块,其中只有一个依赖于Python。其余部分仅依赖于彼此和标准库。我可以用
python setup.py build
以通常的方式构建它

我一直在尝试使用
newgem
添加Ruby支持,我可以使用
rakegem
构建一个扩展版本。但是,合并的源代码有一个丑陋的目录布局(混合了Gem样式和Setuptools样式的结构),并且构建过程是一个混乱的过程

我不能将所有源代码都保存在同一个目录中,因为
mkmf
会自动选择依赖于Python的模块并尝试构建该模块,用户不必安装Python来编译不使用的模块。我目前的做法是
extconf.rb
将独立于Python的源文件复制到与Ruby相关的扩展模块相同的目录中


有没有更明智的方法使代码对两种语言都可用?我应该在单独的Gem中复制独立于Python的代码吗?我是否应该将独立代码作为使用autotools构建的独立库发布?是否有一个版本的mkmf可以跳过不需要的模块?

解决方法之一是创建三个不同的项目:

  • 该库本身独立于python和ruby
  • Python绑定
  • Ruby绑定

这可能是最干净的解决方案,尽管在发布时需要做更多的工作,但它的优点是您可以发布新版本的Ruby绑定,而无需发布新的库/python绑定版本。

补充了Johan所说的,多亏了swig,我在Python中使用了几个c/c++支持库。您可以用c/c++编写代码,然后为您想要支持的每种语言创建一个中间模板。这对于Python来说相当轻松,但是对于Ruby必须考虑一些因素。。。也就是说,我不认为pthread支持对ruby有好处,反之亦然

它的学习曲线有些陡峭,因此最好找到一个示例项目,演示如何为目标语言使用包装器

这绝对是一个有用的工具,因为它使您的代码更加干净,同时还提供了到多种语言(PHP、Python、Ruby和我相信的c#)的健壮绑定