問題タブ [ctypes]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - コンパイル前の Python コードによるプロトタイピング
私はしばらくの間、ピーク フィッティング ライブラリの作成について熟考してきました。私は Python をかなりよく知っており、最初はすべてを Python で実装する予定ですが、最終的にはコンパイル済み言語でいくつかのコア ルーチンを再実装する必要があるかもしれないと考えています。
IIRC は、Python の元の任務の 1 つで、プロトタイピング言語でした。ただし、Python は、関数、ファンクター、オブジェクトを関数やメソッドに渡すことを許可する点でかなり自由ですが、C や Fortran については同じことが当てはまらないのではないかと思います。
コンパイルされた言語にインターフェースする必要があると予想される関数/クラスの設計について何を知っておくべきですか? また、これらの潜在的な問題のうち、cTypes、bgen、 SWIG、Boost.Python、Cython、Python SIPなどのライブラリによってどの程度対処されているのでしょうか?
この特定のユース ケース (フィッティング ライブラリ) では、ユーザーが数学関数 (Guassian、Lorentzian など) を Python 関数として定義し、コンパイルされたコード フィッティング ライブラリによって解釈されて渡されるようにすることを想像します。配列の受け渡しも不可欠です。
python - Python:SWIGとctypes
Pythonでは、共有ライブラリのエントリポイントを呼び出すために、どのような状況でSWIGがctypesよりも優れた選択肢ですか?SWIGインターフェイスファイルがまだない場合を考えてみましょう。
2つのパフォーマンスメトリックは何ですか?
python - Python ctypes と関数呼び出し
私の友人は、x86 で動作する小さな概念実証アセンブラーを作成しました。x86_64 にも移植することにしましたが、すぐに問題が発生しました。
私は C で小さなプログラムを書き、そのコードをコンパイルして objdump しました。その後、それを Python スクリプトに挿入したため、x86_64 コードは正しいです。
では、このスクリプトを実行するたびにセグメンテーション違反が発生し続けるのはなぜですか?
mprotect と実行フラグがないことについてまだ質問があります。バッファ オーバーランなどのほとんどの基本的なセキュリティ エクスプロイトから保護すると言われています。しかし、それが使用されている本当の理由は何ですか? .text に到達するまで書き続けてから、素敵な PROT_EXEC エリアに命令を挿入することができます。もちろん、.text で書き込み保護を使用しない限り
しかし、なぜその PROT_EXEC がいたるところにあるのでしょうか。.text セクションが書き込み保護されていると、非常に役立ちませんか?
python - Python: DLL で使用するために IP アドレスを ctype.c_ulong() としてパックする
次のコードが与えられた場合:
これを c_ulong データ型として期待する DLL に正しくパックするにはどうすればよいですか?
私は使用してみました:
ただし、このc_ulong()
メソッドは整数を必要とするため、エラーを返します。
struct.pack
これを達成するために使用する方法はありますか?
python - Python: ctypes.c_void_p() で使用するための文字列の変換
与えられた文字列:
ctypes.c_void_p()
これをデータ型として定義するにはどうすればよいですか?
次のコードでは、「ポインターに変換できません」という例外が発生します。
data
void*
DLL に渡されるため、C では型である必要があります。
パッケージを使用して文字列をパック/アンパックする方法があるとstruct
思いますが、残念ながら私はこのプロセスにあまり慣れていません。
python - Python で ctypes を使用して DLL をアンロードするにはどうすればよいですか?
ctypes を使用して Python で DLL をロードしています。これはうまくいきます。
ここで、実行時にその DLL をリロードできるようにしたいと考えています。
1. DLL をアンロードする 2. DLL をロードする
残念ながら、DLL をアンロードする正しい方法がわかりません。
_ctypes.FreeLibrary は利用可能ですが、非公開です。
DLL をアンロードする他の方法はありますか?
python - Python の ctypes を使用して、「struct_name *** param_name」として宣言されたパラメーターを渡したり読み取ったりしますか?
Python の ctypes ライブラリを使用して、スキャン ライブラリSANEのいくつかのメソッドにアクセスしようとしています。これは ctypes の私の最初の経験であり、1 年以上にわたって C データ型を扱わなければならなかったのは初めてなので、ここにはかなりの学習曲線がありますが、この特定の宣言がなくても、この特定の宣言は面倒だと思います:
まず、SANE_Status
(enum) とSANE_Bool
(typedef to c_int
) の処理に成功しました。どちらもシンプルでした。一方、その最初のパラメーターは、私にあらゆる種類の悲しみを引き起こしています. そもそも" " 表記に慣れていない***
ため、これまでのトレーサー弾はガベージ データしか生成しませんでした。Python 構造オブジェクトのリストを読み戻せるように、この関数への入力をフォーマットするにはどうすればよいですか? 参考までに、参照されている C 構造体は次のとおりです。
どこSANE_String_Const
で として定義されていc_char_p
ます。
このオブジェクトの私の Python/ctypes バージョンは次のとおりです。
これから期待される動作(構造オブジェクトのリスト)を取得できるように、何を渡す必要があるかについての提案はありますか?すべての回答に感謝します。
更新 1:
以下を使用して、正しい SANE_Device Python 構造を取得できました。
ただし、1) うーん、2) 結果が 1 つしかない場合にのみ機能するようです。devices.contents.contents
またはで len() を実行できませんdevices.contents.contents.contents
。結果の数を決定するにはどうすればよいですか? SANE のドキュメントでは、「関数が正常に実行された場合、*device_list 内の SANE_Device 構造へのポインタの NULL 終了配列へのポインタを格納する」と指定されています。提案?
更新 2:
10 項目の配列を渡し、次を使用して最初の要素にアクセスできました。
ただし、10 は明らかに恣意的な数であり、実際の結果の数を決定する方法はありません。devices.contents.contents.contents[1].name
デバイスが 1 つしか接続されていないときにアクセスしようとすると、セグメンテーション フォールトが発生します。ctypes では、このような可変長構造を処理する適切な方法が必要です。
python - Python でエクスポートされていない .dll 関数を実行する
これは奇妙な質問のように思えるかもしれませんが、メモリの「署名」から .dll で関数を実行する方法を知りたいです。それが実際にどのように機能するかについてはあまり理解していませんが、私はそれをひどく必要としていました. メモリ署名とそのアドレスがわかっている場合、.dll 内からエクスポートされていない関数を実行する方法です。たとえば、私はこれらを持っています:
そして、かなり気の利いた C++ コードを使用すると、これを使用して .dll 内から関数を実行できます。
これについては、よく説明された記事があります: http://wiki.alliedmods.net/Signature_Scanning
それで、Ctypesまたは他の方法を使用してPython内でこれを行うことは可能ですか?
python - long double リターンと ctypes
私は a を返す ac 関数を持っていますlong double
。ctypes を使用して Python からこの関数を呼び出したいのですが、ほとんどの場合は機能します。設定so.func.restype = c_longdouble
はトリックを行います-pythonのfloat型がc_double
そうであることを除いて、戻り値がdoubleよりも大きいが、長いdoubleの範囲内にある場合、pythonは戻り値としてinfを取得します。私は 64 ビット プロセッサを使用しており、sizeof(long double)
16 歳です。
C コードを変更せずにこれを回避する方法 (たとえば、decimal クラスまたは numpy を使用) に関するアイデアはありますか?
python - ctypes を使用して、ライブラリの extern 関数ポインタを Python コールバック関数に設定するにはどうすればよいですか?
一部の C ライブラリは、ライブラリのユーザーがその関数ポインタを独自の関数のアドレスに設定してフックまたはコールバックを実装するように、関数ポインタをエクスポートします。
このライブラリliblibrary.so
の例では、ctypes を使用して library_hook を Python 関数に設定するにはどうすればよいですか?
ライブラリ.h: