2016-04-11 34 views
2

私はOpenCVを使用するPythonプログラムを持っています。プログラムは現時点では期待どおりに実行されます。今私はPythonコードをCコードにコンパイルするためにCythonを使いたいと思っています。私はまだ他のpythonプログラムをimport my_programにできるようにしたいので、Cでプログラム全体を書き直すのではなく、これをやっています。Pythonコードをcythonに変換する

私はこれまでCythonを使ったことがありませんでしたが、それについてのブログ記事はほとんど読んでいません。誰かが私に何を準備すべきか、どんなに上手な仕事であろうと教えてもらえますか?私の現在のpythonプログラムは~200 LoCです。

+0

200行スクリプトでは、私は先に試してみて、私が遭遇する問題があればそれを見てください。この質問に対する答えは一般的には役に立たないと言っているわけではありません。 –

+0

@Anthonyこれを行うことで何を達成することを望んでいますか? Cythonを使用してPythonコードをコンパイルすることはおそらく可能です(ほとんど変更はありません)が、実際にはそれほど多くは得られませんでした。 – DavidW

+0

@DavidW私がこれをやっている唯一の理由は、Pythonが許さないコードを難読化することです。私は誰かがまだそれをリバースエンジニアリングできることを理解しますが、私の目標はリバースエンジニアリングを難しくすることです。私はこの答えからこのアイデアを得ました。http://stackoverflow.com/a/7347168/44286 – Anthony

答えて

1

コメントに基づいて、既存のコードを「そのまま」実行して、ソースの提供を避け、Cython固有の機能を大幅に変更するのではなく、そのことを念頭に置いて、大きな努力をしなくてもうまくいくと思っています。考慮すべき簡単な代替案は、pycバイトコードファイルを提供することだけです。

私が知っているマイナーな落書きのリスト(大雑把に重要な順)が続きます。他にはin the documentationと記載されています。これらのほとんどはかなりマイナーなので、あなたはそれらを満たすことが不運になるでしょう。

  1. は、あなたはおそらく、すべてのプラットフォームで、32ビットと64ビット、複数の異なるコンパイラで使用され、そしておそらくWindows上のPythonのすべての(主要な、例えば3.4、3.5)バージョンのためにあなたのモジュールを再コンパイルする必要があります。

  2. __file__をモジュールレベルで使用することはできません。これは、コードと同じ場所に格納されている静的リソースのパスを見つけるときに問題になることがあります。

  3. いくつかのレシピのために、たとえば、ブレーク文字列フォーマット(see for exampleからsome of sympyとおそらくいくつかのショートカットを(それらを呼ばれる関数で定義されているどのような変数を参照するために)、スタックを検査することにより、巧妙な事をやろういくつかその

  4. (これはCythonによって生成されないので)関数のバイトコードを見るものは何でも。 Numbaはおそらく数値Pythonで最も一般的に使用されている例ですが、少なくとも1つ(保持されていない)MATLAB/Python wrapperが、呼び出し元の関数のバイトコードを検査して返される引数の数を調べようとしています。

  5. You must have an __init__.py file to make a folder into a module - it won't recognise a compiled __init__.so file on its own

  6. String concatenation can go through a fast path in Python that Cython doesn't manage。とにかくこれをあなたのコードで行うのはあまり大したことではありませんが、あなたがそれに頼ると大きなパフォーマンスの違いが見られるかもしれません。

関連する問題