問題タブ [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 投票する
0 に答える
519 参照

python - C Python モジュールの autodoc による Sphinx ドキュメント

主にC拡張モジュールであるpycurlを文書化しようとしています。

この拡張モジュールには、C で記述されたいくつかのクラスがあります。それらにはメソッドがあります。メソッドには、docstring が定義されています。

ただし、これらのメソッドはクラス自体では定義されていません。

その結果、automethod を使用してそれらを文書化しようとすると、sphinx はこれらのメソッドが存在しないと言います:

C 拡張モジュールで定義されたメソッドから docstring を取得するように sphinx を取得するにはどうすればよいですか?

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

python - サンプル コードで PyObject_IsInstance が常に 0 を返す理由

Python を学習するためにサンプルを書いていますが、PyObject_IsInstance を呼び出すと、この関数は常に 0 を返します。これが私の c コード ReadBuf.c です。

以下は私のpythonコード client.py です

pyTest のインスタンスである b を C に渡し、PyArg_ParseTuple によって pyTest にパースされます。PyObject_IsInstance を実行すると、結果は常に 0 になります。これは、pyTest が Test のインスタンスではないことを意味します。私の質問: Python から C にパラメーターを渡す場合、型は変更されますか? pyTest が Test のインスタンスである場合、それを比較したい場合はどうすればよいですか?

ありがとう、ヴァテル

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

python - 構造体へのポインタに Swig typemap を使用する方法

私はC関数を持っています:

ポイントは単純な構造体です。

また、Polygon は Points のリストです。Point のインターフェイスで typemap を定義しました。

ポリゴンでそれを行うにはどうすればよいですか?

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

python - Python 拡張モジュールでの C++ 静的メンバーの初期化

短縮版

Python 拡張機能の静的メンバーを確実に初期化する方法がわかりません。特に、特定の依存関係が満たされるように、さまざまなコンパイル ユニットからのコードの特定の読み込み順序をどのように確保できますか?

ロングバージョン

階乗、二項など、さまざまな組み合わせ関数を何度も計算するコードがあります。これらのテーブルを一度作成してから、それらを検索する方がはるかに効率的です。また、値を取得するための優れたインターフェイスが必要なので、テーブルを静的メンバーとして使用する C++ クラスを作成します。

最も単純な例として、階乗を計算するには、次のようにします。でCombinatorics.hpp

Combinatorics.cpp

whereFactorialTableCalculatorは、適切なベクトルを返すだけのローカル関数です。[これらoperator()は二項式などではより複雑になるため、これらをラップするためにクラスを使用します。]

SWIG を使用してc++コードをラップし、Python から使用します。使用している新しいクラスターでコードをコンパイルするまで、これはすべてうまくいっていました。今思えば、以前は運がよかったのだと思います。

Python モジュールを新しいクラスターにインポートするとすぐに、Python が segfault を起こします。Python は、インポート ステップから戻ることさえありませんでした。を使用してgdb、これをコードの別の部分まで追跡し、その初期化でFactorialファンクターを呼び出しました。しかし、FactorialTableまだ初期化されていなかったので、全体が鳴きました。

したがって、他のコードが計算される前に階乗が計算されるようにする必要があります。distutils に希望する順序で伝えますが、明らかに、これはこのクラスターで呼び出される順序ではありません。リンク プロセスで注意が必要な段階はありますか?

本当にやる気がある場合は、ここここでコードを閲覧できます

0 投票する
6 に答える
64167 参照

python - Windows x64 での Cython の実行 - 致命的なエラー C1083: インクルード ファイルを開けません: 'basetsd.h': そのようなファイルまたはディレクトリはありません

Windows 7 システムに Cython for Python 2.7 をインストールしようとしています。特に、私はすべて 64 ビットを好みます。(ご参考までに言うと、Cython は特殊な数値解析用の別のパッケージに必要なコンポーネントの 1 つであるため、Cython が必要です。また、x64 は大規模なデータ セットの保存に有利になる可能性があります。)

そこで、公式サイトから x64 Python 2.7 をダウンロードしました。Christoph Gohlkeから Cython を入手しました。もちろん、Python 2.7 の amd64 バージョンです。インストールする前に、 Joe DF の回答 here.regにあるファイルを使用して Python 2.7 をレジストリに追加しました。その後、Visual C++ コンパイラをhere (動作するとは思わない) とhere (ただし、動作するはずです) からインストールしました。この時点で、私のディレクトリには、、、、のすべてがあります。実行しましたが、エラーメッセージはありませんでした。C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\binvcvars32.batvcvars64.batvcvars86_amd64.batvcvarsx86_ia64.batvcvars64.bat

続いて、このページに従って「hello world」テスト ファイルを作成しました。

次に、このエラーが発生しました。

だから私は自分自身に考えました:まあ、Cythonはそのファイルが存在しないので見つけることができません. (ハードドライブ全体を検索しました。) そこでvcvars64.bat、 からをコピーし...\VC\bin\VC、名前を に変更しましたvcvarsall.bat。これで vcvarsall エラーはなくなりました。そして・・・当然、新たなエラーが発生。

今、私はどのように進むべきか分かりません。私は何をすべきか?あなたの助けに感謝します。

(わかりやすくするために、コンパイラをMingw32に設定してみました。しかし、他にもエラーがあります。今のところ、VCを機能させることに焦点を当てています。)


編集:このページの指示に従って、SDK ビルド環境 CMD を使用してみました。同じエラーを受け取りました。

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

python - PyObjects を使用して Boost.Python C++ クラスを宣言するにはどうすればよいですか

PyObjects を使用して C++ クラスを作成し、Python からそれらにアクセスして、既存の Python オブジェクト インスタンスでそれらを参照したいと考えています。簡単に言えば、C++ クラスに Python オブジェクト インスタンスを格納/管理したいと考えています。

例えば:

Pythonでは、Boost.Pythonで可能であればこれを行いたい:

よろしくお願いします!

挨拶する

フロー

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

python - Python C 拡張 OpenMP

独自の OpenMP C++ 拡張によって返される変数にアクセスしようとすると、Python インタープリターでセグメンテーション違反が発生します。

私が見つけたすべての解決策は、ctypesまたはcython(使用できません)のいずれかを使用しています。http://snatverk.blogspot.de/2012/03/c-parallel-modules-for-python.htmlは、OpenMP 対応の Python 拡張機能の小さな例を示しています。例のように for ループを実装しようとしましたが、まだ機能しません。

My Code 拡張コード関数は次のようになります。

関数 matcher_match() は、names と namesB の 2 つのリストを受け取ります。関数 test_pair_ij() によって示される特定の条件について、names と namesB (それらの float 属性) のすべての組み合わせをチェックします。この関数は、Python にコールバックしない純粋な C(++) 実装です。

C 拡張機能は次のように呼び出されます。

リスト名と名前 B がかなり小さい場合、コードは正常に実行されています。しかし、より大きなリストでは、Python コードで matchResult にアクセスできなくなりました。しようとすると、セグメンテーション違反が発生します(これはPythonインタープリターの内部にあると思います)。openmp を使用せずに C 拡張機能を再コンパイルしたところ、リストが大きくても問題なく動作しました。

問題は、拡張機能からアクセスする python 変数のメモリ内の混乱だと思います。これは GIL に関係している可能性がありますが、私はそれをリリースして取得しています。この場合、さらに変数をプライベートにする必要がありますか? これに関する他のアイデアはありますか?

EDIT : 関数 test_pair_ij の呼び出し引数を修正しました。

EDIT 2 : matchIdcs を保存するコードを修正

答え:

コードは GIL とPyList_SetItem(matchIdcs, i, matchVal);の呼び出しを解放していました。許可されていない python 構造を変更していました ( http://docs.cython.org/src/userguide/external_C_code.html#release-the-gilを参照)。

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

python - Python Windows 拡張機能 vcvarsall.bat が正しくない Windows SDK レジストリ キー

特定のマシンで Python 拡張機能をビルドしようとすると、多くの問題が発生します。VS2008 と VS2013 の両方が、正しい C/C++ ライブラリなどと一緒にインストールされています。ほぼ同じソフトウェアを搭載した 2 台のマシンも比較しており、ファイルvcvarsall.batbin\amd64\vcvarsamd64.batファイルは同じです。

私が気付いた違いの 1 つは、2 つのマシンの from の値が異なること:GetWindowsSdkDirHelperですbin\amd64\vcvarsamd64.bat

  • 良い:C:\Program Files\\Microsoft SDKs\Windows\v6.0A\
  • "悪い":C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\

vcvarsall.bat によって設定されたさまざまな環境変数に基づいて、私が試したこと:

  • SET LIB=C:\Program Files\\Microsoft SDKs\Windows\v6.0A\lib\x64. これにより 1 つのエラーが削除されますが、error LINK2019: unresolved external symbol __imp_QueryPerformanceCounterさらに 6 つの同様のエラーが発生します。
  • INCLUDELIBおよびを設定しようとしましLIBPATHたが、それでもLINK2019エラーが発生します。

それで、私はいくつかの質問があります:

  1. のレジストリ キーをHKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows「適切な」パスに変更することはできますか? もしそうなら、これはどのような影響を及ぼしますか?
  2. なぜこれが問題なのですか?VS2008/VS2013 を別の順序でインストールした可能性がありますが、それが問題でしょうか?