問題タブ [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 投票する
1 に答える
2576 参照

python - Python C API: 参照渡しの引数で Python 関数を呼び出す

私は C で Python モジュールを書いていますが、「参照」によって渡された引数の 1 つを使用して Python 関数を呼び出す必要があります。最終的な結果として、Python 関数が引数に対して行ったことが元の C 変数に保存されます。

テストするために、tcpResumeFunc が表す Python 関数で、渡された整数を = 5 に変更しました。ただし、このコードの最後に *resume を出力すると、初期値の -1 が保持されます。API の仕組みについて誤解していることはわかっています。助言がありますか?

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

c++ - Pythonインタープリターの出力をリダイレクトして、C++プログラムの文字列でキャッチする方法は?

私はpython C++ APIを使用して、C++プログラムからpythonコマンドを実行しています。すべてのpython出力を文字列にキャッチしたいのですが、pythonのstdoutおよびstderr出力をキャッチするために、次のリダイレクトで管理しました。

しかし、pythonsインタープリターの出力もキャッチするために何をすべきかわかりません....

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

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を実行しています。

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

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 のようなものになるだろうということでした。

  1. 組み込みインタープリターの C-API により、標準出力をシステムのエンコーディングでユニコードで簡単に書き出すことができ、デフォルトの ascii エンコーディングではありません。
  2. 問題のある文字が現在のエンコーディングに存在しない場合、例外はスローされません。代わりに、デフォルトの置換文字が表示されます。
  3. システムのエンコーディングを調べるためだけに、追加のモジュール (sys など) をインポートする必要はありません。
0 投票する
3 に答える
1575 参照

python - Python Cコードからどのようにアサートできますか?

私はCでPythonクラスを書いていますが、デバッグコードにアサーションを入れたいと思っています。assert.h私にぴったりです。これはデバッグコンパイルにのみ入れられるため、Pythonコード*のユーザーに影響を与えるアサートエラーの可能性はありません。

「ライブラリ」コード(Pythonに対してリンクされたコードとは別にする必要があります)を分割して、他のCコードから使用できるようにしようとしています。したがって、私のPythonメソッドは、純粋なCコードの薄いラッパーです。

したがって、「ライブラリ」コードではこれを行うことができません。

これは私の純粋なCコードをPythonで汚染するからです。また、単純なものよりもはるかに醜いです

Distutilsコンパイラは常にを設定すると思います。つまり、デバッグビルドでもNDEBUG使用できません。assert.h

MacOSとLinux。

ヘルプ!

*Pythonから呼び出されたCコードでのアサートに対して私が聞いた1つの引数。

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

python - CからCTypesポインタを返す

メモリ内の配列へのCTypesポインターを返す必要があるPythonC拡張機能を作成していcharます(CTypesポインターを期待する別のPythonライブラリとインターフェイスする必要があります)。

CのCTypesインターフェイスの種類に関するドキュメントが見つかりません。Pythonポインターコンストラクターを呼び出すなどの回避策はありますか?

前もって感謝します。

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

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質問の ロード:

走る:

最後に、この時点でのプログラムの一般的な状態は、ファイルがTextIOWrapperRun:セクションとしてロードされることです。返されるfdは常に3であり、何らかの理由で_fdopen開くことがFILEできないため、のようなことはできませんPyRun_SimpleFile。エラー自体はのデバッグASSERTIONです_fdopen。これをすべて行うためのより良い方法はありますか?私は本当に助けに感謝します。

Python2バージョンの完全なプログラムを確認したい場合は、Githubにあります

0 投票する
4 に答える
4215 参照

python - Python では、C で実装されたモジュールが純粋な Python モジュールよりも速いのはなぜですか? また、どのように記述すればよいですか?

Python のドキュメントには、cPickle が Pickle よりも高速である理由は、前者が C で実装されていることが記載されています。それは正確にはどういう意味ですか?

Python で高度な数学のモジュールを作成していますが、一部の計算にはかなりの時間がかかります。これは、私のプログラムが C で実装されていれば、はるかに高速にできるということですか?

cPickle をインポートできるように、このモジュールを他の Python プログラムからインポートしたいと考えています。

C で Python モジュールを実装する方法を説明できますか?

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

python - Py_INCREF / DECREF:いつ

次のように述べるのは正しいですか:

  1. PythonオブジェクトがC関数で作成されたが、関数がそれを返さない場合、必要はありませんINCREFが、は必要DECREFです。

  2. [false]関数がそれを返す場合は、戻り値を受け取る関数で、する必要がありINCREFます。[/ false]

  3. C型変数をPythonオブジェクトなどの属性として割り当てる場合、doubleまたはは必要ありません。intINCREFDECREF

  4. 以下は安全に使用できますか?Pythonオブジェクトを属性として他のPythonオブジェクトに割り当てるには、次のようにします。

    /li>
  5. Pythonオブジェクトの割り当て解除はDECREF、属性として持つ他のすべてのPythonオブジェクトに対して行う必要がありますが、Cタイプの属性に対しては行う必要はありません。


編集:

「属性としてのCタイプ」に関しては、barとbazを意味します。

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

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__