問題タブ [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 - Python C API: 参照渡しの引数で Python 関数を呼び出す
私は C で Python モジュールを書いていますが、「参照」によって渡された引数の 1 つを使用して Python 関数を呼び出す必要があります。最終的な結果として、Python 関数が引数に対して行ったことが元の C 変数に保存されます。
テストするために、tcpResumeFunc が表す Python 関数で、渡された整数を = 5 に変更しました。ただし、このコードの最後に *resume を出力すると、初期値の -1 が保持されます。API の仕組みについて誤解していることはわかっています。助言がありますか?
c++ - Pythonインタープリターの出力をリダイレクトして、C++プログラムの文字列でキャッチする方法は?
私はpython C++ APIを使用して、C++プログラムからpythonコマンドを実行しています。すべてのpython出力を文字列にキャッチしたいのですが、pythonのstdoutおよびstderr出力をキャッチするために、次のリダイレクトで管理しました。
しかし、pythonsインタープリターの出力もキャッチするために何をすべきかわかりません....
python - 複数のスレッドから NumPy の C API 関数を呼び出すことの意味は何ですか?
これはリスクの高いビジネスであり、Global Interpreter Lock が並列処理の恐るべき敵であることを理解しています。ただし、NumPy の C API (具体的PyArray_DATA
には NumPy 配列のマクロ) を使用している場合、複数の同時スレッドから呼び出すと、潜在的な結果はありますか?
私は引き続き GIL を所有し、NumPy のスレッド サポートでリリースしないことに注意してください。また、NumPy がスレッド セーフを保証していなくてもPyArray_DATA
、実際にはスレッド セーフであっても、それで十分です。
LinuxでNumPy 1.3.0を使用してPython 2.6.6を実行しています。
python - システムエンコーディングを使用してC-APIでPython 2.6書き込み文字列
Python 2.6 のプロジェクトがあり、システム エンコーディングを使用して utf-8 メッセージを stdout に書き込みたいと考えています。ただし、そのような関数は Python 3.2 まで存在しないようです。
PySys_FormatStdout
http://docs.python.org/dev/c-api/sys.html
Python 2.6 からこれを行う方法はありますか?
明確にするために、Py_Initialize() の後、メイン インタープリターが実行される前に出力する必要があるバナーがあります。文字列は、"\n and Copyright \xC2\xA9" を含む c-literal です。
ここで、\xC2\xA9 は utf-8 著作権記号です。著作権記号が正しくエンコードされていることを gdb で確認しました。
更新: このような悲しみは必要ないと判断したので、スタートアップ バナーから問題のあるキャラクターを削除します。これには問題が多すぎて、ドキュメントが不足しています。私の期待は、これが Tcl のようなものになるだろうということでした。
- 組み込みインタープリターの C-API により、標準出力をシステムのエンコーディングでユニコードで簡単に書き出すことができ、デフォルトの ascii エンコーディングではありません。
- 問題のある文字が現在のエンコーディングに存在しない場合、例外はスローされません。代わりに、デフォルトの置換文字が表示されます。
- システムのエンコーディングを調べるためだけに、追加のモジュール (sys など) をインポートする必要はありません。
python - Python Cコードからどのようにアサートできますか?
私はCでPythonクラスを書いていますが、デバッグコードにアサーションを入れたいと思っています。assert.h
私にぴったりです。これはデバッグコンパイルにのみ入れられるため、Pythonコード*のユーザーに影響を与えるアサートエラーの可能性はありません。
「ライブラリ」コード(Pythonに対してリンクされたコードとは別にする必要があります)を分割して、他のCコードから使用できるようにしようとしています。したがって、私のPythonメソッドは、純粋なCコードの薄いラッパーです。
したがって、「ライブラリ」コードではこれを行うことができません。
これは私の純粋なCコードをPythonで汚染するからです。また、単純なものよりもはるかに醜いです
Distutilsコンパイラは常にを設定すると思います。つまり、デバッグビルドでもNDEBUG
使用できません。assert.h
MacOSとLinux。
ヘルプ!
*Pythonから呼び出されたCコードでのアサートに対して私が聞いた1つの引数。
python - CからCTypesポインタを返す
メモリ内の配列へのCTypesポインターを返す必要があるPythonC拡張機能を作成していchar
ます(CTypesポインターを期待する別のPythonライブラリとインターフェイスする必要があります)。
CのCTypesインターフェイスの種類に関するドキュメントが見つかりません。Pythonポインターコンストラクターを呼び出すなどの回避策はありますか?
前もって感謝します。
python-3.x - Python 3C-APIIOとファイルの実行
Python2ベースのC++エンジンをPython3で動作させるのに深刻な問題があります。IOスタック全体が変更されたことは知っていますが、私が試しているように見えるものはすべて失敗に終わってしまいます。以下は、プリコード(Python2)とポストコード(Python3)です。誰かが私が間違っていることを理解するのを手伝ってくれることを願っています。私boost::python
は参照を制御するためにも使用しています。
プログラムは、マップを介してPythonオブジェクトをメモリにロードし、run関数を使用すると、メモリにロードされたファイルを見つけて実行することになっています。delta3d python managerの例に基づいてコードを作成しました。ここでは、ファイルを読み込んですぐに実行します。Python3で同等のものを見たことがありません。
Python2コードはここから始まります:
次に、std :: mapからファイルをロードし、実行を試みます。
Python3コードはここから始まります:これは私がここでいくつかの提案に基づいてこれまでに持っているものです... SO質問の ロード:
走る:
最後に、この時点でのプログラムの一般的な状態は、ファイルがTextIOWrapper
Run:セクションとしてロードされることです。返されるfdは常に3であり、何らかの理由で_fdopen
開くことがFILE
できないため、のようなことはできませんPyRun_SimpleFile
。エラー自体はのデバッグASSERTION
です_fdopen
。これをすべて行うためのより良い方法はありますか?私は本当に助けに感謝します。
Python2バージョンの完全なプログラムを確認したい場合は、Githubにあります
python - Python では、C で実装されたモジュールが純粋な Python モジュールよりも速いのはなぜですか? また、どのように記述すればよいですか?
Python のドキュメントには、cPickle が Pickle よりも高速である理由は、前者が C で実装されていることが記載されています。それは正確にはどういう意味ですか?
Python で高度な数学のモジュールを作成していますが、一部の計算にはかなりの時間がかかります。これは、私のプログラムが C で実装されていれば、はるかに高速にできるということですか?
cPickle をインポートできるように、このモジュールを他の Python プログラムからインポートしたいと考えています。
C で Python モジュールを実装する方法を説明できますか?
python - Py_INCREF / DECREF:いつ
次のように述べるのは正しいですか:
PythonオブジェクトがC関数で作成されたが、関数がそれを返さない場合、必要はありません
INCREF
が、は必要DECREF
です。[false]関数がそれを返す場合は、戻り値を受け取る関数で、する必要があり
INCREF
ます。[/ false]C型変数をPythonオブジェクトなどの属性として割り当てる場合、
double
またはは必要ありません。int
INCREF
DECREF
以下は安全に使用できますか?Pythonオブジェクトを属性として他のPythonオブジェクトに割り当てるには、次のようにします。
/li>Pythonオブジェクトの割り当て解除は
DECREF
、属性として持つ他のすべてのPythonオブジェクトに対して行う必要がありますが、Cタイプの属性に対しては行う必要はありません。
編集:
「属性としてのCタイプ」に関しては、barとbazを意味します。
python - Python(およびPython C API):__new__対__init__
私が尋ねようとしている質問は、Pythonでの__new__と__init__の使用の複製のようです。、しかし、それにもかかわらず、との実際的な違いが正確に何であるかはまだ私にはわかりませ__new__
ん__init__
。
__new__
これはオブジェクトの作成用であり、オブジェクトの初期化用であると急いで言う前に__init__
、はっきりさせておきます。わかりました。 実際、私はC ++の経験があり、オブジェクトの割り当てと初期化を同様に分離する 新しい配置を使用しているため、この区別は非常に自然です。
Python C APIチュートリアルでは、次のように説明しています。
新しいメンバーは、そのタイプのオブジェクトを(初期化するのではなく)作成する責任があります。メソッドとしてPythonで公開されてい
__new__()
ます。... 新しいメソッドを実装する理由の1つは、インスタンス変数の初期値を保証することです。
だから、ええ-私は何をするのかわかります__new__
が、それにもかかわらず、Pythonでなぜそれが役立つのかまだわかりません。与えられた例は、__new__
「インスタンス変数の初期値を保証したい」場合に役立つかもしれないと言っています。まあ、それは正確に何__init__
をするのではないですか?
__new__
C APIチュートリアルでは、新しいタイプ(「Noddy」と呼ばれる)が作成され、タイプの関数が定義されている例が示されています。Noddyタイプには、という文字列メンバーが含まれておりfirst
、この文字列メンバーは次のように空の文字列に初期化されます。
__new__
ここで定義されたメソッドがなければPyType_GenericNew
、すべてのインスタンス変数メンバーをNULLに初期化するだけのを使用する必要があることに注意してください。したがって、このメソッドの唯一の利点は__new__
、インスタンス変数がNULLではなく空の文字列として開始されることです。 しかし、インスタンス変数がデフォルト値に初期化されていることを確認する必要がある場合は、メソッドでそれを実行できたはずなので、これが便利なのはなぜですか?__init__