問題タブ [python-c-extension]
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 拡張機能 - 状態の維持
次の目的で使用する Python 拡張機能を C で作成する必要があります。
- ファイルに対して CPU 集中型の初期化を実行します。
- 初期化されたデータに依存して結果を返す複数の関数呼び出しを行います。と
- 完了したらメモリを解放する
1 つの解決策は、Python で「ステート ホルダー」クラスを実装することです。C で初期化を呼び出すと、初期化されたデータが返され、Python 状態オブジェクトに格納されます。次に、ステップ (2) を実行する必要があるたびに、それを C 関数に渡します。しかし、これは Python 側と C 側の間で発生するすべてのデータ シャトル/インターフェースを考えると、非常に非効率的です。
できればC側の状態オブジェクトを使って状態を維持したい。Python 側からの初期化呼び出しは、初期化されたすべてのデータを返すのではなく、ID のみを返すため、後続の呼び出しで必要なときに C 状態オブジェクトを参照できます。
C側で状態を維持するにはどうすればよいですか?
xcode - Python C 拡張機能と Xcode 4.5
Xcode デバッガーを使用できるように、XCode 4.5.2 を使用して Python C 拡張機能を作成したいと考えています。拡張機能では、C ファイルを .so ファイルとしてリンクする必要があります。xcodeで.soファイルを作成できず、dylibファイルのみを作成できました。
私は次のように試しました: 1. C/C++ ライブラリ テンプレートを使用し、動的ライブラリを指定しました 2. Mach-O タイプをバンドルに変更しました 3. それでも .so を作成できなかったので、ラッパー拡張子を .so に変更しましたが、うまくいきませんでした.
以下の投稿リンクは、拡張子を手動で変更できると言っているようです。これはうまくいきませんでしたが、別の間違いを犯した可能性があります。
私の問題について何か考えはありますか?
compilation - 再コンパイルは実行中のプログラムに影響しますか?
実行中のプログラムを再コンパイルすると、プログラムは再コンパイル前の元のプログラムとして実行されますか?
Is it safe to recompile an executable while it's running?からいくつかの回答を見つけました。、しかし、私はより複雑な状況にあります:
私は C 拡張子を持つ python パッケージに取り組んでいます。
その C 拡張で共有オブジェクトだけを再コンパイルすることがあります。
「qsub」でキューに送信する必要があります...
ありがとう!
python - Python2.7からCモジュールにバイナリデータを取得する適切な方法は何ですか
Pythonのファイルからバイナリデータを読み取り、そのデータをACモジュールに送信しようとしています。Pythonでは、データは次のように読み取られます
可能であれば、データをバッファーへのポインターとして、長さをcで指定する必要があります。PyArg_ParseTupleを使用してcモジュールのパラメーターを取得しています。Python 3+には、バイナリデータ用のay / y * / y#形式指定子があることに気づきましたが、Python2.7でそれを行うのと同等の方法が必要です。
ありがとう
python - PyEval_InitThreads はいつ呼び出されることになっていますか?
いつ電話するべきか少し混乱していますPyEval_InitThreads
。PyEval_InitThreads
一般に、 Python 以外のスレッド (つまり、拡張モジュール内で生成されるスレッド) が使用されるたびに、 を呼び出す必要があることを理解しています。
PyEval_InitThreads
しかし、それが Python インタープリターを組み込んだ C プログラムなのか、C 拡張モジュールをインポートする Python プログラムなのか、あるいはその両方なのか、私は混乱しています。
では、内部でスレッドを起動する C 拡張モジュールを作成したPyEval_InitThreads
場合、モジュールの初期化時に呼び出す必要がありますか?
また、PyEval_InitThreads
暗黙的に Global Interpreter Lock を取得します。したがって、 を呼び出した後PyEval_InitThreads
、おそらく GIL を解放する必要があります。そうしないと、デッドロックが発生します。では、ロックを解除するにはどうすればよいでしょうか。ドキュメントを読んだ後PyEval_ReleaseLock()
、GIL をリリースする方法のようです。ただし、実際には、C 拡張モジュールで次のコードを使用すると:
...その後、実行時にPythonは次のように中止します:
では、GIL を取得した後、どのように GIL を解放しますPyEval_InitThreads
か?
python - Python 拡張モジュールで stdin をワイド文字方向に設定する
C Python 拡張モジュールでは、fwide(stdin,1)
. これは、Python コードでEOFError
呼び出したときに発生しています。input()
モジュールの C コードで回避fwide(stdin,1)
すると、Python コードは正常に動作します。
問題は、Python をワイド char で動作させることは可能ですか、それとも Python のナロー文字モードのstdin
ままにしておく必要があるかということです。stdin
これは Python のバグですか?
これは Python 3 です。Python 2 が同じ動作をするかどうかはわかりません。
python - Python の C 拡張: wchar 文字列を Python 値に変換する
Python の C 拡張では、次のPy_BuildValue()
ように char 文字列を Python 値に変換するために使用できますPy_BuildValue("s", str)
。ただし、文字列が wchar 配列の場合はPy_BuildValue("s", str)
使用できません。
次のように PyUnicode を使用できると思います。
しかし、うまくいきません。wchar文字列をPython値に変換するにはどうすればよいですか?
python - cinvokepythonを使用してPy_Initializeを参照することはできません
acプログラムを使用してPythonプログラムを呼び出したいのですが、
os:ubuntu 12.10 x64 python2.7.3
Cコード:
シェルをコンパイルします。
python - Python C-ext名前空間が通常のpythonサブモジュールと混在していますか?
この質問は、次のものと似ています。
少しひねるだけです。ここでは、2 つの C-ext を混在させようとしているのではなく、代わりに 1 つの C-ext と通常の python サブモジュールを混在させようとしています。
C拡張がシンボル「module.so」とサブモジュールに存在するものとの間でモジュールの名前空間を共有する方法はありますか?
私のモジュール構造は次のようになります。
階層から「utils」を削除すると、facs をインポートしてfacs.so
メソッドを表示できます。
しかし、utils サブモジュールを元に戻し、さまざまな部分をインポートしようとすると、1 つの名前空間が他の名前空間をマスクしているように見えます (utils
によってエクスポートされたシンボルをマスクしますfacs.so
)。
ご覧のとおり、 after dir(facs)
、build
、query
andremove
はなくなり、最初の import ステートメントを再利用して直接直接アクセスする代わりにgalaxy
a を実行しない限り、適切にインポートされません。from facs.utils import galaxy
facs.utils.galaxy.rsync_genomes()
要約すると、このモジュールの使用目的は次のとおりです。
(現在開発中の)コードは次のとおりです。
https://github.com/brainstorm/facs/tree/develop
誰かが自分で試してみたい場合。私は virtualenvs を使用していますが、私の $PYTHONPATH は正しいようです:
また、インストールも成功しているようです。
__init__.py
最上位ディレクトリに実際にファイルがコピーされていないようですが、そこに触れても触れなくても、上記のインポート動作には影響しません。
何か案は?前もって感謝します!
python - pyx/pxd ファイルの関数ファクトリを使用して、C ライブラリの cython 関数ラッパーを生成する
外部 C ライブラリを Python にラップするさまざまな方法を再評価しています。私はずっと前にプレーンな Python C API を使用することを選択していました。これは高速で、シンプルで、スタンドアロンであり、私が思っていたとおり、将来も保証されていました。それからPyPy
、CPython API をサポートする予定はないようですが、将来的には興味深い代替手段になる可能性がある . ctypes
は遅かったので、cython
PyPy をサポートするために努力しているように見える に戻りました。
私のライブラリには同じシグネチャを持つ関数がたくさんあるので、C プリプロセッサ マクロを多用して Python モジュールを生成しました。Python言語全体にアクセスできるため、これはcythonでより快適になると思いました。ただし、関数ラッパーのファクトリを作成するのに問題があります。
cpdef
内部_fun_factory
. _ ここで何が問題なのですか?pyx
ファイルは通常の python ファイルと同じだと思っていました。pyx
のような別の python スクリプトから動的にファイルを生成するという明白な方法以外に、これを機能させる方法はありますsetup.py
か?
また、cython が許可しないことにも驚きました。
コードをクリーンアップします。なぜこれが機能しないのですか?
自動C -> cython
翻訳機が存在することは承知していますが、そのようなサードパーティのツールに依存することには消極的です。しかし、プロダクションで使用する準備ができていると思われる場合は、遠慮なく提案してください。