問題タブ [python-extensions]

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.

0 投票する
1 に答える
789 参照

python - Cythonで構築された拡張機能がデータ型と関数のエクスポートに失敗する

Cythonを使用して既存のCライブラリを呼び出し、Python用の最初のC拡張機能を構築することができました。

データ型と関数を論理コンポーネントに宣言して定義し(Cライブラリの論理構造に従って)、それらを1つのpyxファイルに結合しました-ファイルを個別に追加しようとしたときにエラーが発生した後(IIRC何かエラーが発生しました)すでに定義されているinitの線に沿って-そしてGoogleで問題を調査した後、すべてのpyxファイルと1つのpyxファイルを組み合わせる必要があることがわかりました)-このリンクを参照してください。

これは私のfoo.pyxファイルの内容のコピーです:

これは私のセットアップファイルのコピーです:

拡張機能はfoo.soに正常に組み込まれるので、PythonCLIで「importfoo」と入力できます。それも機能します。ただし、myarray.pxd、myarray.pyxなどで宣言/定義したクラスのいずれかにアクセスしようとすると、次のエラーメッセージが表示されます。

次に、dir()を試して、fooモジュールが何をエクスポートしているかを確認しました。驚いたことに、これはそれがリストしたものです:

Cythonが宣言および定義した構造体、クラス、関数のエクスポートに失敗するのはなぜですか?私が言ったように、それは正常にコンパイルされ、共有lib(python拡張)が生成されるので、私のpxdファイルとpyxファイルに何も問題はないと思います。

UbuntuでCython0.15.1とPython2.6.5を使用しています

0 投票する
1 に答える
5899 参照

python - free 関数の Cython コンパイル エラー (Python オブジェクト引数を 'FooBar *' 型に変換できません)

Cython (0.15.2) を使用して Python (2.6.5) の拡張機能を作成しています。pxd ファイルと pyx ファイルを作成しました。私のpyxファイルの内容は次のとおりです。

フリー (つまり非メンバー) 関数定義ステートメントをコメント アウトすると、コードは正しくコンパイルされ、拡張機能が生成されます。ただし、コメントを外してファイルをコンパイルしようとすると、次のエラー メッセージが表示されます。

cafuncs.pyx:64:23: Python オブジェクトの引数を 'FooBar *' 型に変換できません

これの原因は何ですか?どうすれば修正できますか?

0 投票する
3 に答える
1048 参照

python - CライブラリをPythonにインターフェースするSWIG(SWIGで生成されたクラスは使用が面倒です)

SWIGを使用して、CライブラリへのPython言語バインディングを生成しています。バインディングを構築し、データ構造をエクスポートすることができましたが、ライブラリを使用するときにいくつかのフープを飛び越える必要があります。

たとえば、Cヘッダーには次のようなデータ型と関数プロトタイプがあります。

SWIGインターフェイスファイルで、関数とMyStructデータ型の両方をエクスポートしています。私のPython拡張モジュールがfoobarと呼ばれていると仮定すると、次のようなPythonスクリプトを記述できます。

オブジェクトを宣言し、それを使用する前にオブジェクトへのポインタを割り当てるのは非常に面倒です(そしてエラーが発生しやすくなります)。SWIGで生成されたクラスを使用するより良い方法はありますか?オブジェクトの作成と破棄を自動的に処理するために(またはMYSTRUCT_Func1()のようないくつかのOBVIOUSメンバー関数を提供するために、より高いレベルのクラスをラップする(またはSWIGで生成されたクラスをサブクラス化する)ことを考えていました。

ただし、SWIGで生成されたクラスをラップ/サブクラス化すると、C構造体へのポインターを期待するCAPI関数に新しいクラスを渡すことができるかどうかわかりません。SWIGで生成されたクラスを直接変更することはできません(または少なくとも変更すべきではありません)-明らかな理由から。

この問題を解決するための最良の方法は何ですか?オブジェクトを作成/破棄すると同時に、公開されたC関数に直接ポインターを渡すことができる、よりPython的な方法ですか?

0 投票する
0 に答える
405 参照

c++ - SWIG C++ から Python: プリミティブ型へのポインターを受け入れる型マップとメソッド

既存のライブラリの Python 拡張機能を作成しています。一部の関数はプリミティブへのポインターを受け入れるため、arg を出力として使用できます。

これはあまり Pythonic ではないので、関数が代わりにタプルを返すように、SWIG ドキュメントhereで説明されているようにタイプマップを使用したいと考えています。

ここに私のSWIGインターフェースファイルのスニペットがあります(この質問に関連する部分のみが示されています)

SWIG doc は、上記の方法で複数の OUTPUT (マクロ?) を使用できるかどうかを明確にしていないようです - これは安全ですか?

0 投票する
1 に答える
6331 参照

c++ - C++ で Python 辞書を効率的に作成する方法

パフォーマンス上の理由から、Python プログラムの一部を C++ に移植したいので、プログラムの簡単な拡張機能を作成しようとしています。C++ 部分は辞書を作成し、それを Python プログラムに配信する必要があります。

私が見つけた 1 つの方法は、C++ で dict のようなオブジェクト (例: a ) を作成し、Python dict を生成できる[1]メソッドboost::unordered_mapを使用して Python に変換することです。しかし、コンテナを文字列表現に変換して戻すことを含むこの方法は、最もパフォーマンスの高いソリューションであるには「すぐに」多すぎるように思えます!?Py_BuildValue

私の質問は次のとおりです。C++ で Python 辞書を作成する最も効率的な方法は何ですか? ブーストには、C++ と Python の間のコンテナーのマッピングをサポートする Python ライブラリがあることがわかりましたが、これまでのドキュメントで必要なものが正確に見つかりませんでした。そのような方法がある場合は、C++ で Python dict を直接ビルドすることをお勧めします。そのため、コピーなどは必要ありません。しかし、これを行うための最もパフォーマンスの高い方法が別の方法である場合、私はそれも得意です。

これは、.dll/.pyd にコンパイルした (簡略化された) C++ コードです。

これは、次のように Python で使用したいです。

ディクショナリは文字列を整数にマップします。助けてくれてありがとう!

0 投票する
2 に答える
10112 参照

python - Python C拡張モジュールの戻り値のないメソッド

パラレル ポート経由でデータを送信するスクリプトを Python で作成しようとしています。C言語で独自のモジュールを作成しています。

問題は、モジュールを実行しようとすると、python がクラッシュすることです。エラーもデータも何もありません。それは単に閉じます。

これは私のモジュールです:

(すべての python 混乱なしで動作します) distutils を介してコンパイルし、ターミナルで (xubuntu を使用して)、次のように入力します。

そして、ここでは、python から出て、「markmb@...」と入力します。

前もって感謝します!

0 投票する
1 に答える
1155 参照

python - Python 拡張機能がサブパッケージにインストールされない

Python 拡張機能をビルドして distutils を使用してパッケージ化しようとしていますが、どのように名前を付けても、拡張機能はルート パッケージにインストールされます。私のディレクトリレイアウトは次のようになります。

setup.pyはこのように見えます:

を設定してvirtualenv実行します

次に、私のPythonシェルで:

最初の import ステートメントが機能し、2 番目の import ステートメントが失敗するようにするには、何を変更できますか?

0 投票する
0 に答える
172 参照

python-3.x - ESX 4.0 の SFCB、Python バインディング レイヤー、および Python プロバイダーに関する問題

Python で SFCB プロバイダーを作成しています。SFCB は C++ プロバイダーとのみ通信するため、必要に応じて SFCB と通信してプロバイダーを開始できる中間層 (cmpi-bindings、python 拡張モジュール) が必要です。

同じ cmpi レイヤーは、ESX 4.1 で実行すると完全に正常に動作します (つまり、SFCB 呼び出しを読み取ってから Python プロバイダーを実行します) が、ESX 4.0 では Python モジュールのインポートに失敗します。

いくつかのデバッグの後、日時モジュールのインポートが未解決のシンボル (PyExc_IOError) エラーで失敗していることがわかりました。-XLinker --exportdynamic を使用してこれらのモジュールをビルドしようとしたため、アプリケーションに埋め込まれた Python インタープリターがネイティブ モジュールのロードに失敗する で提案されている未解決のシンボルを探しましたが、無駄でした。

次に試すことができるオプションは何ですか。(同じコードベースが 4.1 では機能しますが、4.0 では機能しないため)。どんなポインタも役に立ちます

0 投票する
3 に答える
820 参照

c++ - C ++ Python拡張機能での散発的なセグメンテーション違反

HTTP経由でテキストにアクセスしてダウンロードするpythonオブジェクトがあります。この python オブジェクトを実行し、c++ コードを使用してそのテキストを処理しています。いえ

ほとんどの URL は正常に動作します。C++ コードは適切な文字列を取得し、処理できます。すべて問題なく動作します。ブラウザー上で (基本的に) 他の URL と同じように見えるいくつかの特定の URL は、PyString_AsString() メソッドで segfault を引き起こします。

Python メソッド (上記の疑似コードの「dataStr」) によって返される文字列を出力すると、問題ないように見えます。何がこの問題を引き起こしているのかわかりません---続行する方法についてのヒントをいただければ幸いです! ありがとう

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解決:

私が使用していたテンプレートコードには呼び出しがありました

電話する前に

特定の関数呼び出しで割り当てが解除された理由はわかりません。「Gecco」が以下のコメントで述べているように、

PyString_AsString のドキュメントには次のように書かれています。「ポインタは、コピーではなく、文字列の内部バッファを参照します。文字列が PyString_FromStringAndSize(NULL, size) を使用して作成されたばかりでない限り、データを変更してはなりません。割り当てを解除してはなりません。 " '