問題タブ [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.

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

python - C apiを使用してフルパスでファイルをインポートするにはどうすればよいですか?

代わりにフルファイルパスとモジュール名を指定するにはどうすればよいですか?

のようにPyImport_SomeFunction(const char *path_to_script, const char *name)

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

python - Python C API を使用してジェネレーター/イテレーターを作成するには?

次の Python コードを Python C API で複製するにはどうすればよいですか?

これまでのところ、私はこれを持っています:

しかし、次にどこに行けばよいかわかりません。誰でもいくつかの提案を提供できますか?

編集

これで私が抱えている主な問題は、yieldステートメントをシミュレートすることだと思います。私が理解しているように、これは非常に単純に見えますが、実際には複雑なステートメントです。これは、独自のジェネレーターと、自動的に呼び出されるメソッドを作成し__iter__()ますnext()。ドキュメントを検索すると、PyGenObjectに関連付けられているようです。ただし、このオブジェクトの新しいインスタンスを作成する方法は不明です。PyGen_New()引数として a を取りますPyFrameObject。私が見つけることができる唯一の参照はPyEval_GetFrame()、私が望むものではないようです (または私は間違っていますか?)。誰かがこれを共有できる経験がありますか?

さらに編集

Python が舞台裏で行っていたことを (本質的に) 拡張すると、これがより明確になることがわかりました。

技術的には、シーケンスは 1 つずれていますが、アイデアは得られます。

これに関する唯一の問題は、ジェネレーターが必要になるたびに新しいオブジェクトを作成するのが非常に面倒なことです。Python では、C よりもさらに面倒です。これは、新しい型の定義に伴う怪物が必要になるためです。またyield、C にはクロージャがないため、C にはステートメントが存在しません。代わりに (Python API で見つけられなかったので — 既に存在する場合は標準オブジェクトを教えてください!)、単純で汎用的なジェネレーター オブジェクト クラスを作成しました。next()メソッド呼び出し。ここにあります (これは完全ではないため、まだコンパイルを試みていないことに注意してください。以下を参照してください)。

しかし、残念ながら、私はまだ終わっていません。StopIteration私が残した唯一の質問は、C API で例外を発生させるにはどうすればよいかということです。Standard Exceptionsにリストされているのが見つからないようです。また、おそらくもっと重要なのは、これはこの問題に取り組む正しい方法ですか?

まだこれをフォローしている人に感謝します。

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

python - Python C API で名前付きパラメーター?

Python C API を使用して次の Python 関数をシミュレートするにはどうすればよいですか?

(つまり、次の方法で呼び出すことができるようにします。

)

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

python - CのPythonインスタンスメソッド

次のPython(3.x)コードについて考えてみます。

同じ機能をCで書く方法は?

つまり、Cのメソッドを使用してオブジェクトを作成するにはどうすればよいですか?そして、それからインスタンスを作成しますか?

編集:ああ、ごめんなさい!私はPythonCAPIを介して同じ機能を意味しました。C APIを介してPythonメソッドを作成するにはどうすればよいですか?何かのようなもの:

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

python - Pythonでstderrをリダイレクトするには? Python C API 経由ですか?

これは私の最近の 2 つの質問の組み合わせです:
[1] C での Python インスタンス メソッド
[2] Python で stderr をリダイレクトする方法は?

Python スクリプトから stdout と stderr の両方の出力をログに記録したいと思います。

私が聞きたいのは、[1] に従って新しい型を作成するのはかなり複雑に思えるということです。新しい型を Python に公開する必要がない場合、つまり C にのみ存在する場合、物事は単純になりますか?

つまり、Python が何かを出力すると、"Objects/fileobject.c" に移動し、"PyFile_WriteObject" でその引数に書き込むことができるかどうかをチェックします。

また、次のように stdout と stderr を取得することもできます。

私の質問は、上記の 'PyObject_GetAttrString(f, "write")' を満たし、呼び出し可能であるため、次のように書くことができる必要な PyObject を構築することは何とか可能ですか?

http://docs.python.org/c-api/sys.html?highlight=pysys_setobject#PySys_SetObject

このようにすると、新しい「ライター タイプ」を Python スクリプトの残りの部分に公開する必要がなくなるので、コードを書くのが少し簡単になるのではないかと思いました...?

0 投票する
5 に答える
695 参照

python - Python の拡張: C モジュールをプリロードする

私が書いたいくつかの C 関数で Python インタープリターを拡張しようとしています。ドキュメントを読んでから、これらの機能を公開するには、ユーザーは機能を含むモジュールをインポートする必要があります。

ユーザーが入力する必要がないように、C API を介してモジュールをプリロードまたはプリインポートすることは可能import <mymodule>ですか? またはさらに良いfrom <mymodule> import <function>ですか?

編集: PyRun_SimpleString("from mymodule import myfunction") を Py_Initialize(); の直後に実行できます。- これを行う別の方法があるかどうか疑問に思っていました..?

編集 2:つまり、Python インタープリターを組み込んだ C で記述されたアプリケーションがあります。そのアプリケーションは、ユーザーがアプリ用の簡単な Python スクリプトを記述できるように、ユーザーに公開したいいくつかの機能を提供します。私が望むのは、from mymodule import myfunction1, myfunction2非常に特殊なアプリであり、とにかくアプリなしではスクリプトが機能しないため、書く必要をなくすことimport ...だけです。常に要求するのは意味がありません。

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

python - Python C-API len(...) を拡張クラスで動作させる

Python でクラスを作成する場合、def __len__(self):メソッドを作成するだけlen(InstanceOfMyClass)で機能しますが、C-API を介して拡張クラスでこれを行う方法がわかりません。

__len__メソッドを追加しようとしましたが、うまくいかないようです

Python テスト コード:

TestClass のコード

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

python - Python C-API モジュール終了ハンドラー - atexit と同等ですか?

私はPythonバージョン2.6.4を使用しています

拡張モジュールを終了/アンロードするときに、C ライブラリから呼び出さなければならない関数があります。C拡張モジュールのatexitに相当するものは何ですか?

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

python - CからPyBufferのコンテンツにアクセスする

私は次のようにPythonでバッファオブジェクトを作成しました:

byte_streamSWIGを介してC関数にパラメーターとして渡しています。次のようなデータを変換するためのタイプマップがあります。

バグがbyte_streamの実際のコンテンツ/値に到達できないいくつかの異なることを試しました。byte_streamC APIを使用してコンテンツを変換またはアクセスするにはどうすればよいですか?Cデータをバッファに変換する方法はたくさんありますが、逆の方法で見つけることはできません。このオブジェクトをgcbで調べてみましたが、どちらも、またはデータが含まれていることを示す値もありません。

(ファイルからデータを読み取るときにデータを文字列に変換するオーバーヘッドを回避したいので、バッファーを使用しています)Linuxでpython2.6を使用しています。

--ありがとうPavel

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

python - Python C APIで複数のモジュール/タイプを使用していますか?

2つの異なるPython拡張モジュールがあります。それらをAとBと呼びましょう。モジュールAには、クラスメソッドの戻り型としてモジュールB内で使用したいcontainerというストレージクラス型が含まれています。

これを行う方法についてのドキュメントが見つからないようです。モジュール/クラスを作成するために、この記事に大まかに従いました。ただし、すべてのメソッドを静的として宣言しなかったため、アクセス可能でした:http: //nedbatchelder.com/text/whirlext.html

私の質問は、モジュールBのクラスメソッドのPyObject *戻り値として返すことができるコンテナのインスタンスを作成するにはどうすればよいですか?コンテナ定義は次のようになります。

問題のメソッド内で次のことを簡単に実行してみました。container_initは、コンテナークラスのtp_initとして登録したメソッドです。

ただし、Pythonインタープリターによると、メソッドを呼び出したクラスが返されます。(つまり、myclassinstance.mymethod()はmyclassinstanceを返します)。

私は明らかにこれを間違った方法で行っていますが、正しい方法が何であるかわかりません。助言がありますか?それを示唆する人を断ち切るためだけに-いいえ、SWIGやBoost::Pythonの使用には興味がありません。私はすでにそれを試しましたが、コンテナの基礎となるストレージクラスはどちらともうまく機能しませんでした(SWIGはそれを解析することさえできませんでした)。これまでのところ、自分で拡張機能を実行するのはかなり苦痛がありませんでしたが、私はこれに困惑しています。