問題タブ [python-c-api]
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.
c++ - 実行時に PYTHONPATH を変更することは可能ですか?
Python インタープリターに動的にリンクされた C++ アプリケーションがあります。特定のディレクトリから python モジュールをインポートできるようにしたいと考えています。PYTHONPATH に追加したパスが sys.path に含まれるように、プロセスの PYTHONPATH を変更したいと考えています。このドキュメントによると、それが機能する方法のようです:
http://docs.python.org/c-api/intro.html#embedding-python
ただし、Python-land から sys.path を出力すると、設定した内容ではなく、PYTHONPATH の元の内容が含まれます。これが私がやっていることの例です(Boost.Pythonを使用):
PS - 私の目標を達成する他の方法があることは知っていますが、それは私が求めているものではありません. sys.path を設定するときに Py_Initialize() が PYTHONPATH の現在の値を使用しないのはなぜでしょうか。それとも、それがどのように機能するかを誤解していますか?
python - ファイルform.pyがCに読み込まれません
メインからフロートxがあるとしましょう
問題は、CプログラムのfloatxがPythonから3番ではなく0を受け取っていることです。
python - PyObjects C タイプのチェック
Python 3.2 と C++ を使用しています。
現在 PyObject に格納されている C 型の種類を抽出する必要があります。私はドキュメントをチェックしてグーグルで検索しましたが、他の誰もこれを行う必要がないようです。
だから私は PyObject を持っていて、C 値を抽出しようとしています。オブジェクトから実際に値を抽出するために必要な関数のリストがありますが、最初に知る必要があるのは、正しい関数を呼び出すためにオブジェクト自体に格納されているものです。
これが理解に役立つ場合に備えて、ここに私が試みているコードの例を示します。
うまくいけば、私はこのようなものを手に入れることができます
この質問が長すぎたり、情報が多すぎたりして申し訳ありません。初めての投稿で、役立つ可能性のあるものを残したくありませんでした。この問題について私に与えることができる助けや洞察をありがとう.
python - PyTuple_SetItem の制限
別のオブジェクトの属性としてタプルを作成し、タプルに項目を設定する Python 拡張モジュールがあります。このモジュールを Python で実行すると、常にエラーが発生します。SystemError: bad argument to internal function
のドキュメントを読みPyTuple
、プログラムを数時間デバッグした後でも、一体何が起こっているのか理解できませんでした。デバッガーを介してプログラムを実行すると、Python インタープリター内のライブラリー呼び出し内で問題が発生していることが示されました。というわけで、ようやくPythonのソースコードを見て、ようやく問題に気づきました。関数には、PyTuple_SetItem
私が知らなかった興味深い制限があり、明示的に文書化されていません。
Python ソースの重要な関数を次に示します (わかりやすくするために編集しています)。
ここで重要な行は条件op->ob_refcnt != 1です。ここに問題があります: Tuple の ref-count が 1 でない限り、呼び出すことさえできませPyTuple_SetItem
ん。結局のところ、タプルは不変であるはずなので、これは理にかなっていると思います。したがって、この制限は、C コードを Python 型システムの抽象化とより一致させるのに役立ちます。 PyTuple_SetItem
PyTuple_New()
ただし、この制限はどこにも文書化されていません。関連するドキュメントはhereとhereにあるようですが、どちらもこの制限を指定していません。ドキュメントでは基本的に、 を呼び出すとPyTuple_New(X)
、タプル内のすべての項目が に初期化されると書かれていますNULL
。は有効な Python 値ではないためNULL
、Tuple をインタープリターに返す前に、Tuple 内のすべてのスロットに適切な Python 値が入力されていることを確認するのは、拡張モジュール プログラマの責任です。しかし、Tuple オブジェクトの参照カウントが 1 のときにこれを行う必要があるとはどこにも述べていません。
さて、問題は、この (文書化されていない?) 制限を認識していなかったため、基本的に自分自身をコーナーにコーディングしたことですPyTuple_SetItem
。私のコードは、タプル自体が別のオブジェクトの属性になるまで項目をタプルに挿入するのが非常に不便なように構造化されています。そのため、タプルにアイテムを入力するときが来ると、タプルはすでにより高い参照カウントを持っています。
おそらくコードを再構築する必要がありますが、Tuple の参照カウントを一時的に 1 に設定し、アイテムを挿入してから、元の参照カウントを復元することを真剣に検討していました。もちろん、これは恐ろしいハックであり、恒久的な解決策ではありません。とにかく、タプルの参照カウントに関する要件がどこかに文書化されているかどうかを知りたいです。それは単なる CPython の実装の詳細ですか、それとも API ユーザーが期待される動作として信頼できるものですか?
python - Python C API:PyRun_Stringが単純な条件式を評価しないのはなぜですか?
PyErr_Print()の出力でエラーを返します。
私は何が間違っているのですか?ありがとうございました。
python - Python C API:インポートされたモジュールを使用するために Py_eval_input で PyRun_String を取得する方法は?
次のエラーを返します。
コードの前半で、次のことを行いました。
これはそれを機能させる方法ではないと思います。正しい方法は何ですか?ありがとうございました!
python - PyImportModule でインポートが失敗した理由を調べるにはどうすればよいですか?
Python (2.7.1) を組み込んだ C アプリケーションにこのコードがあります。
PyImport_ImportModuleが失敗すると、NULL を返します。インポートに失敗した理由を確認するにはどうすればよいですか? (たとえば、モジュールをインポートするときは、埋め込みの外側で検索します)。
(コードはpy-exim-localscan の一部であり、まれに発生するエラーに関する情報を追加したいと考えています)。
python - C拡張でカスタムPython例外タイプを作成するには?
C で Python モジュールを作成しています。組み込みの Python 例外では説明できないエラーを報告する必要があります。したがって、私は自分のタイプの例外をスローしたいと考えています。問題は、Python のポリシーが BaseException クラスからすべての例外を派生させることです。派生型オブジェクトの作成方法(tp_baseメンバーへの代入)は知っていますが、BaseException型オブジェクトへの参照の取得方法がわかりません。PyExc_BaseException は PyObject への参照であり、型オブジェクトではなくクラスを表します。
C コードからカスタム Python 例外をスローするにはどうすればよいですか?
c++ - Python にプリコンパイル済み共有ファイルの読み取りを認識させるにはどうすればよいですか?
C++ で作成したパッケージがあり、既に共有ライブラリにコンパイルしています。
独自のメイン関数とリンクすると、初期化関数 initfoo を直接呼び出してパッケージを初期化でき、すべて正常に動作します。
Python に共有ライブラリをパッケージとして認識させるにはどうすればよいので、次のように入力するだけです。
通常のpythonインタープリターから実行していますか?
コンパイルは通常の cmake ビルド システムの一部である必要があるため、distutils を使用してファイルをコンパイルすることに興味はありません。共有ライブラリをロードするために必要なパッケージ ファイルを作成するだけです。
更新:私は今それが働いています。この問題は、共有ライブラリ名の lib プレフィックスをデフォルトにする cmake にありました。これを修正するには
および Mac OS X の場合