2009-08-23 7 views
7

CtypesがPythonとWindowsでクラッシュ(またはエラーを停止)する可能性があると聞きました。私は彼らの使用から離れなければなりませんか?どこで聞いた?ウィンドウズ、オートメーション、そのようなことのさまざまな側面を制御しようとしたときに戻ってきました。Ctypes proとcon

私はswigについて聞いていますが、私はCtypesがより頻繁に表示されます。ここに危険がある?もしそうなら、私は何を気にするべきですか?

私はctype pro con pythonを検索しました。

+0

それほど多くの良い答え、私はこれについて考える必要があり、それぞれの答えについてもっとコメントする必要があります。私はこのサイトが大好きです。 – phreaki

答えて

13

堅牢性の点では、swigはctypesよりいくらか優れていると私は思っています。なぜなら、Cコンパイラがもっと徹底的にチェックするようにすることができるからです。しかしこれはすでに触れられています(以前のctypesのバージョンではより大きくなっていますが)。既に触れられているargtypesの機能のおかげです。しかし、ランタイムオーバーヘッドがswig(およびsipとboostのpythonや他の "ラッピング"アプローチ)よりもctypの方がはるかに重要であることは間違いありません。したがって、私はctypesをいくつかの関数パフォーマンスの重大な状況でPythonが大きなCライブラリを利用できるようにするのではなく、キーのボトルネックの外側で呼び出しが行われるときのDLLです。

swig(& c)の実行時のパフォーマンスとctypesの便利さの中間的な良い方法として、Python構文のサブセットを使用することができるコードをさらに追加することができます-codeの速度も考慮します。Cython - Pythonに似た言語で、Python呼び出し可能な拡張機能を記述し、Cライブラリをラップすることに特化しています(DLLではなく静的ライブラリとしてしか利用できないものも含みます:ctypes wouldn 'あなたはでそれらを ;-)と遊ばせます。

5

ctypesは、正しく使用すると安全なモジュールです。

いくつかのライブラリは、物事へのより低いレベルのアクセスを提供しますが、一部のモジュールでは足で自分を撮影することができます。だから当然ながら、いくつかのモジュールは他よりも危険です。これはあなたがそれらを使用してはならないという意味ではありません!

#Crash python interpreter 
from ctypes import * 
def crashme(): 
    c = c_char('x') 
    p = pointer(c) 
    i = 0 
    while True: 
      p[i] = 'x' 
      i += 1 

Pythonインタプリタがクラッシュ自体は実行時エラーでアウトerroringだけでPythonコードとは異なります:

は、おそらくこのような何かを参照誰かを聞きました。例えば、デフォルトの再帰制限が設定された無限再帰では、実行時エラーが発生しますが、Pythonインタプリタはその後も有効です。

もう1つの良い例は、sysモジュールです。しかし、Pythonインタプリタをクラッシュさせる可能性があるので、sysモジュールの使用をやめることはありません。

import sys 
sys.setrecursionlimit(2**30) 
def f(x): 
    f(x+1) 

#This will cause no more resources left and then crash the python interpreter 
f(1) 

低レベルのアクセスを提供する多くのライブラリもあります。たとえば、The gcモジュールを操作して、部分的に構築されたオブジェクトにアクセスし、そのフィールドにアクセスするとクラッシュする可能性があります。 Cライブラリには、あなたができるすでに原因のクラッシュを使用している場合、実際にクラッシュを引き起こす可能性がありますCrashing Python

+1

私は通常、物事をかなり壊しているので、これは私が知らなかったctypesの良い概観です。 – phreaki

3

​​:

リファレンスやアイデアから取ら。

どちらかといえば、​​あなたが​​を使用してC関数にthe argtypes propertyと実行時の型の安全性を強化することができますので、クラッシュを軽減することができます。

あなたのCライブラリがすでに安定でテスト済みの場合は、CとPythonを一緒に持っていく上で必要なものを実行するのであれば、​​を使用しない理由は絶対にありません。

+0

もちろん、私がそれを使うことができるのは私のCコードではありません。これは、私が知っている以上に多くを学ぶ理由を私に与えるかもしれません。 – phreaki

2

私は非常にあなたがこの本を読んでに見てお勧め:ctypesのライブラリの中に、詳細なチュートリアルとして、本機能

Gray Hat Python: Python Programming for Hackers and Reverse Engineers

、とあなたは信じられないほど低レベルのコード

を実行する方法を示しています
+0

理由を説明してください。私はあなた(そして私はこの本を所有している)を疑っているわけではありませんが、あなたの理由を知ることは役に立つでしょう。 –

+0

も同様です。私はここで何かをハッキングしたり逆転させたりすることはあまりありません。私は、Pythonが見ていないマシンの一部にアクセスしたいと思っていました。 – phreaki

+0

ハッカーやリバースエンジニアが目的に応じて知りたいことと同じ種類のことを学ぶならば、それらのテクニックを「Pythonでは見られないマシンの部分にアクセスする」方法にも習得します。 –