問題タブ [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.
python - C apiを使用してフルパスでファイルをインポートするにはどうすればよいですか?
代わりにフルファイルパスとモジュール名を指定するにはどうすればよいですか?
のようにPyImport_SomeFunction(const char *path_to_script, const char *name)
。
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にリストされているのが見つからないようです。また、おそらくもっと重要なのは、これはこの問題に取り組む正しい方法ですか?
まだこれをフォローしている人に感謝します。
python - Python C API で名前付きパラメーター?
Python C API を使用して次の Python 関数をシミュレートするにはどうすればよいですか?
(つまり、次の方法で呼び出すことができるようにします。
)
python - CのPythonインスタンスメソッド
次のPython(3.x)コードについて考えてみます。
同じ機能をCで書く方法は?
つまり、Cのメソッドを使用してオブジェクトを作成するにはどうすればよいですか?そして、それからインスタンスを作成しますか?
編集:ああ、ごめんなさい!私はPythonCAPIを介して同じ機能を意味しました。C APIを介してPythonメソッドを作成するにはどうすればよいですか?何かのようなもの:
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 スクリプトの残りの部分に公開する必要がなくなるので、コードを書くのが少し簡単になるのではないかと思いました...?
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 ...
だけです。常に要求するのは意味がありません。
python - Python C-API len(...) を拡張クラスで動作させる
Python でクラスを作成する場合、def __len__(self):
メソッドを作成するだけlen(InstanceOfMyClass)
で機能しますが、C-API を介して拡張クラスでこれを行う方法がわかりません。
__len__
メソッドを追加しようとしましたが、うまくいかないようです
Python テスト コード:
TestClass のコード
python - Python C-API モジュール終了ハンドラー - atexit と同等ですか?
私はPythonバージョン2.6.4を使用しています
拡張モジュールを終了/アンロードするときに、C ライブラリから呼び出さなければならない関数があります。C拡張モジュールのatexitに相当するものは何ですか?
python - CからPyBufferのコンテンツにアクセスする
私は次のようにPythonでバッファオブジェクトを作成しました:
byte_stream
SWIGを介してC関数にパラメーターとして渡しています。次のようなデータを変換するためのタイプマップがあります。
バグがbyte_streamの実際のコンテンツ/値に到達できないいくつかの異なることを試しました。byte_stream
C APIを使用してコンテンツを変換またはアクセスするにはどうすればよいですか?Cデータをバッファに変換する方法はたくさんありますが、逆の方法で見つけることはできません。このオブジェクトをgcbで調べてみましたが、どちらも、またはデータが含まれていることを示す値もありません。
(ファイルからデータを読み取るときにデータを文字列に変換するオーバーヘッドを回避したいので、バッファーを使用しています)Linuxでpython2.6を使用しています。
--ありがとうPavel
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はそれを解析することさえできませんでした)。これまでのところ、自分で拡張機能を実行するのはかなり苦痛がありませんでしたが、私はこれに困惑しています。