問題タブ [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 に答える
1881 参照

python - C API から Python モジュールでグローバルを定義する

C API を使用して Python 用のモジュールを開発しています。Python からグローバルと見なされる変数を作成するにはどうすればよいですか?

たとえば、モジュールが の場合、次のジョブをmodule実行する変数を作成します。g

特に、gは整数です。

Alex Martelli のソリューション

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

python - Python C API: PyObject タイプをオンにする

私は Python を C++ に接続するためのコードをいくつか持っていますが、これは正常に動作しますが、それを見るたびに、それを行うためのより良い方法があるに違いないと思います。C++ 側には、固定範囲の基本型 (int、real、string、バリアントのベクトルなど) を処理できる「バリアント」型があります。Python API を使用して、同等の Python 型から変換するコードがいくつかあります。次のようになります。

問題は、チェーンされた if-else if です。switch ステートメント、または型識別子をキーとする作成関数のテーブルまたはマップを呼び出しているようです。言い換えれば、私は次のようなものを書くことができるようにしたい:

API ドキュメントの概要に基づいて、ここで「typeID」を直接取得する最善の方法は明らかではありませんでした。私はこのようなことができると思います:

これにより、タイプ情報がすぐに得られるようですが、それを使用して、関心のある限られたタイプのセットに関連付ける最もクリーンな方法は何ですか?

0 投票する
10 に答える
92974 参照

c++ - C / C ++からPythonメソッドを呼び出し、その戻り値を抽出する

CのPythonモジュールで定義されているカスタム関数を呼び出したいのですが、それを行うための予備的なコードがいくつかありますが、出力をstdoutに出力するだけです。

mytest.py

test.cpp

戻り値をCに抽出し、Cで使用するにはどうすればよいdoubleですか?

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

python - PythonCAPIで複数のオブジェクトのタプルを返す

複数のPythonオブジェクトを返すネイティブ関数を書いています

これは正常にコンパイルされますが、Pythonプログラムから呼び出すと、エラーが発生します。

SystemError:Py_BuildValueに渡された不正な形式の文字

どうすればこれを正しく行うことができますか?

編集:次の作品

しかし、これを行うためのより短い方法はありませんか?

0 投票する
0 に答える
509 参照

python - Visual Basic 2005 から python 2.6 を使用するには?

Visual Basic 2005 から Python スクリプトを呼び出す最良の方法は何ですか?

Python で記述されたライブラリを呼び出す必要がある Visual Basic 2005 で記述されたアプリケーションがあります。ライブラリには python 2.6 が必要です。私はpython C APIを使用して、ビジュアルベーシックコードからpythonライブラリにアクセスしています(プライベート宣言関数blah lib "python26.dll"など)。Pythonライブラリが機能した後、Pythonから値を引き出したいので、このようにしています。残念ながら、C ランタイムに関するエラーが表示されます。

「R6034: アプリケーションが C ランタイム ライブラリを正しくロードしようとしました。」

MSVCR80.dll (2005 ランタイム) と MSVCR90.dll (python 26 が使用する 2008 ランタイム) の間の競合だと思います。Visual Basic コードと本質的に同じことを行う Visual C++ 2005 で作成された単純なスタブ プログラムでも、このエラーがスローされます。Visual C++ 2008 でコンパイルすると、問題なく動作します。

それで、私はそれについて何をしますか?VB から離れることも、2008 バージョンに移行することもできません。MSVC 2005 を使用して既に python 2.6 を再コンパイルしましたが、それだけでは十分ではありませんでした。ライブラリが使用するすべての python パッケージを追跡し、それらも再コンパイルする必要がありますか? もっと簡単な方法があるに違いないようです。

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

c++ - .soモジュールはPythonにインポートされません:動的モジュールはinit関数を定義しません

C関数のPythonラッパーを作成しようとしています。すべてのコードを記述してコンパイルした後、Pythonはモジュールをインポートできません。私はここに与えられた例に従っています。いくつかのタイプミスを修正した後、ここで再現します。myModule.cというファイルがあります。

私はMacportspythonを搭載したMacを使用しているので、次のようにコンパイルします。

ただし、インポートしようとするとエラーが発生します。

インポートできないのはなぜですか?

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

python - Python の C API を使用してオブジェクトを作成する

オブジェクトのレイアウトを次のように定義しているとします。

...そして私の型定義:

pyfooC 拡張内のどこかに新しいインスタンスを作成するにはどうすればよいですか?

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

c++ - Visual Studio 2010 C ++ファイルにPythonを埋め込もうとしましたが、コード1で終了します

ms visual studio c ++2010で開発しているc++アプリケーションにPythonコードを埋め込もうとしています。しかし、プログラムを実行すると、Py_initialize()を呼び出すとコード0x01で終了します。

何が悪かったのかを知る方法がわかりません。ヘルプファイルには、Py_Initializeはエラー値を返すことができず、致命的に失敗するだけであると記載されています。しかし、なぜ失敗したのでしょうか。

自己コンパイルされたpython27_d.dllを使用しています。これは、python.orgからダウンロードしたソースのmsvsプロジェクトファイルを使用して作成しました。

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

python - 距離計算を高速化する方法に関する提案

次のクラスを検討してください。

これを使用して、ベクトルの 2 つの要素間の距離を計算します。基本的に、この距離測定を使用するベクトルの次元ごとに、そのクラスの 1 つのインスタンスを作成します (他の距離測定を使用する次元があります)。プロファイリングにより、__call__このクラスの関数が私の knn 実装の実行時間の 90% を占めていることが明らかになりました (誰が考えたでしょう)。これを高速化する純粋な Python の方法はないと思いますが、C で実装した場合はどうでしょうか。

上記の式を使用してランダム値の距離を計算する単純な C プログラムを実行すると、Python より桁違いに高速になります。そこで、 ctypesを使用して、計算を行う C 関数を呼び出してみましたが、結果のコードがはるかに遅くなるため、パラメータと戻り値の変換にコストがかかるようです。

もちろん、knn 全体を C で実装してそれを呼び出すこともできますが、問題は、前述したように、ベクトルの一部の次元に対して異なる距離関数を使用しており、これらを C に変換するのは手間がかかりすぎることです。

では、私の代替手段は何ですか?Python C-APIを使用して C 関数を作成すると、オーバーヘッドがなくなりますか? この計算を高速化する他の方法はありますか?

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

c++ - c++コードでpythonstdoutをキャッチする方法

実行中にいくつかのタスクを実行するためにPythonを呼び出す必要があるプログラムがあります。pythonを呼び出し、 pythons stdoutをキャッチして、それをファイルに入れる関数が必要です。これは関数の宣言です

私の問題は、特定のコマンド(pythonInput)のすべてのPython出力をキャッチすることです。私はPythonAPIの経験がなく、これを行うための正しい手法がわかりません。私が最初に試したのは、Py_run_SimpleStringを使用してPythonのsdtoutとstderrをリダイレクトすることです。これは、私が作成したコードの例です。

これを行うためのより良い方法はありますか?さらに、何らかの理由で、PyRun_SimpleStringは数式を取得しても何もしません。たとえば、PyRun_SimpleString( "5 ** 3")は何も出力しません(python conlsulは結果を出力します:125)

多分それは重要です、私はビジュアルスタジオ2008を使用しています。ありがとう、アレックス


マークの提案に従って私が行った変更:

mainを実行した後に取得する出力:

それは私にとっては良いことですが、問題は1つだけです。

理由はわかりませんが、次のコマンドを実行した後:PythonPrinting( "1 + 5")、PyString_AsString(output)コマンドは6ではなく空の文字列(char *)を返します...:(これを失うことができない何かがありますか出力?

サックス、アレックス