問題タブ [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.
python - C Python モジュールの autodoc による Sphinx ドキュメント
主にC拡張モジュールであるpycurlを文書化しようとしています。
この拡張モジュールには、C で記述されたいくつかのクラスがあります。それらにはメソッドがあります。メソッドには、docstring が定義されています。
ただし、これらのメソッドはクラス自体では定義されていません。
その結果、automethod を使用してそれらを文書化しようとすると、sphinx はこれらのメソッドが存在しないと言います:
C 拡張モジュールで定義されたメソッドから docstring を取得するように sphinx を取得するにはどうすればよいですか?
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 のインスタンスである場合、それを比較したい場合はどうすればよいですか?
ありがとう、ヴァテル
python - 構造体へのポインタに Swig typemap を使用する方法
私はC関数を持っています:
ポイントは単純な構造体です。
また、Polygon は Points のリストです。Point のインターフェイスで typemap を定義しました。
ポリゴンでそれを行うにはどうすればよいですか?
python - Python 拡張モジュールでの C++ 静的メンバーの初期化
短縮版
Python 拡張機能の静的メンバーを確実に初期化する方法がわかりません。特に、特定の依存関係が満たされるように、さまざまなコンパイル ユニットからのコードの特定の読み込み順序をどのように確保できますか?
ロングバージョン
階乗、二項など、さまざまな組み合わせ関数を何度も計算するコードがあります。これらのテーブルを一度作成してから、それらを検索する方がはるかに効率的です。また、値を取得するための優れたインターフェイスが必要なので、テーブルを静的メンバーとして使用する C++ クラスを作成します。
最も単純な例として、階乗を計算するには、次のようにします。でCombinatorics.hpp
:
でCombinatorics.cpp
:
whereFactorialTableCalculator
は、適切なベクトルを返すだけのローカル関数です。[これらoperator()
は二項式などではより複雑になるため、これらをラップするためにクラスを使用します。]
SWIG を使用してc++
コードをラップし、Python から使用します。使用している新しいクラスターでコードをコンパイルするまで、これはすべてうまくいっていました。今思えば、以前は運がよかったのだと思います。
Python モジュールを新しいクラスターにインポートするとすぐに、Python が segfault を起こします。Python は、インポート ステップから戻ることさえありませんでした。を使用してgdb
、これをコードの別の部分まで追跡し、その初期化でFactorial
ファンクターを呼び出しました。しかし、FactorialTable
まだ初期化されていなかったので、全体が鳴きました。
したがって、他のコードが計算される前に階乗が計算されるようにする必要があります。distutils に希望する順序で伝えますが、明らかに、これはこのクラスターで呼び出される順序ではありません。リンク プロセスで注意が必要な段階はありますか?
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\bin
vcvars32.bat
vcvars64.bat
vcvars86_amd64.bat
vcvarsx86_ia64.bat
vcvars64.bat
続いて、このページに従って「hello world」テスト ファイルを作成しました。
次に、このエラーが発生しました。
だから私は自分自身に考えました:まあ、Cythonはそのファイルが存在しないので見つけることができません. (ハードドライブ全体を検索しました。) そこでvcvars64.bat
、 からをコピーし...\VC\bin
て\VC
、名前を に変更しましたvcvarsall.bat
。これで vcvarsall エラーはなくなりました。そして・・・当然、新たなエラーが発生。
今、私はどのように進むべきか分かりません。私は何をすべきか?あなたの助けに感謝します。
(わかりやすくするために、コンパイラをMingw32に設定してみました。しかし、他にもエラーがあります。今のところ、VCを機能させることに焦点を当てています。)
編集:このページの指示に従って、SDK ビルド環境 CMD を使用してみました。同じエラーを受け取りました。
python - PyObjects を使用して Boost.Python C++ クラスを宣言するにはどうすればよいですか
PyObjects を使用して C++ クラスを作成し、Python からそれらにアクセスして、既存の Python オブジェクト インスタンスでそれらを参照したいと考えています。簡単に言えば、C++ クラスに Python オブジェクト インスタンスを格納/管理したいと考えています。
例えば:
Pythonでは、Boost.Pythonで可能であればこれを行いたい:
よろしくお願いします!
挨拶する
フロー
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を参照)。
python - Python Windows 拡張機能 vcvarsall.bat が正しくない Windows SDK レジストリ キー
特定のマシンで Python 拡張機能をビルドしようとすると、多くの問題が発生します。VS2008 と VS2013 の両方が、正しい C/C++ ライブラリなどと一緒にインストールされています。ほぼ同じソフトウェアを搭載した 2 台のマシンも比較しており、ファイルvcvarsall.bat
とbin\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 つの同様のエラーが発生します。INCLUDE
、LIB
およびを設定しようとしましLIBPATH
たが、それでもLINK2019
エラーが発生します。
それで、私はいくつかの質問があります:
- のレジストリ キーを
HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows
「適切な」パスに変更することはできますか? もしそうなら、これはどのような影響を及ぼしますか? - なぜこれが問題なのですか?VS2008/VS2013 を別の順序でインストールした可能性がありますが、それが問題でしょうか?