2017-06-19 4 views
0

私は小さなベンチマークスイートを用意しています。これは主にCythonを説明する目的で、単純なおもちゃのPythonコードの作成と実行のさまざまなアプローチを比較しています。distutilsを使用して出力のない名前のプレーンCコードをコンパイルする

私が以前持っていたアプローチの1つは、純粋なCでテスト関数を作成し、Cコンパイラでコンパイルして(distutilsを見つけてコンパイラを呼び出して)、ctypesでPythonにライブラリをロードし、その関数を実行します。

distutilsが生成するファイルの名前にpythonのバージョンとプラットフォームを埋め込むまで、これはうまくいきました。過去に私はCのソースファイルをコンパイルするのdistutilsを誘導する可能性があり

は、作業ディレクトリにC.soと呼ばれるライブラリにC.cと呼ばれる:distutilsの最近のバージョンでは正確に応じて、フォームbuild/temp.linux-x86_64-3.6または(の何かに出力名をマングリングを主張します私が使っているdistutilsの機能は何か)、そのテーマのいくつかのバリエーション。

distutilsの現在のバージョンを現在の作業ディレクトリの出力C.soと呼ぶように説得する方法はありますか? (代わりに、Distutilsのによって生成ライブラリが存在する場所を確実かつ容易にctypesを伝えるためにいくつかの方法がありますか?)

[ボーナス:?このアイデアは、Linux、OS XとWindowsの間で高い移植性表現することができる方法]

= ========================================== ==============

編集:完全を期すために、ここで私は、過去に首尾よくそれを行うために使用される方法です:

pure_C_setup.py

from distutils.core import setup, Extension 

setup(name="ctypes-test", 
     ext_modules = [Extension("C", ["C.c"])]) 

上記のセットアップファイルでは、コマンドpython pure_C_setup.py install --install-lib=.に使用すると、作業ディレクトリにC.soが生成されます。今日はそれを生成しますbuild/lib.linux-x86_64-3.6/C.cpython-36m-x86_64-linux-gnu.so

+0

私が何をやろうとしていることは可能であるかどうかわからないです。私は間違っているかもしれません。 – SRC

答えて

0

プラットフォームではなく、コンパイラにも依存しませんが、エクステンションのextra_link_argsを使用して必要なものを実現することができます。 VCPP 2015年

:ditutils.core.Extensionのドキュメントから

setup(name="ctypes-test", 
     ext_modules = [Extension("C", ["C.c"], extra_link_args="/OUT:C.pyd")]) 
関連する問題