問題タブ [python-extensions]
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-2.7 - Python 2.x C 拡張モジュールの PyMODINIT_FUNC の反対は何ですか?
モジュールの一部の関数からdatetime
a を返したいので、C 拡張モジュール内にコア モジュール ( ) の 1 つをインポートする必要があります。datetime.date
Python C 拡張モジュールにはPyMODINIT_FUNC
、破棄時の補完がないようです。
質問: C 拡張モジュール内のすべての呼び出しで必要なモジュールを何度もインポートし、呼び出しの最後で再度参照解除する以外に何ができますか?
理由:基本的に、これ (何度も何度もインポートすること) が不必要なオーバーヘッドを生み出すのではないかと心配していますPyImport_ImportModule
。 .
やや関連する質問:
memory-management - Python/Numpy C++ 拡張機能: メモリの問題
numpy 配列を操作するために C++ で Python 拡張機能を作成しました。メモリの問題があります。
拡張機能を呼び出す前に、値が 0 より大きい 3D numpy 配列があります。拡張機能に入ると、次の関数を使用して numpy 配列を取得します。
「 !O 」を使用すると、numpy 配列に直接アクセスできるように、python への参照を借用する必要があります。
次に、データにアクセスします。
後で、myArray に存在する値がまだ正であることを確認します。
そして、値が < 0 の場合に遭遇するたびに、それは「-0.0000」ではなく、「-19.73」です。
では、この種の問題にすでに遭遇した人はいますか、それともどこから来て、どのように解決するかを知っている人はいますか?
numpy - Windows で f2py を使用して 64 ビット Python 拡張機能をビルドする
f2py.py
Numpy のスクリプトを使用して、Fortran ソースから Python 拡張機能を構築しようとしています。http://www.scipy.org/F2PY_Windows ( web archive )の手順に従っています。私のシステムは Windows 7 64 ビットで、主に Python 2.7.3 [MSC v.1500 64 ビット (AMD64)] を使用しています。私はhttp://www.lfd.uci.edu/~gohlke/pythonlibs/#numpyから Numpy-MKL 1.7.1 を持っています
これが私が試したことです:
- Fortran コンパイラを選択します。64 ビットの Python を使用しているため、64 ビットの Fortran コンパイラが必要です。MinGW-w64から、いくつかの個人用ビルドを試しました。
- 新しい
cmd.exe
シェルを開き、GCC コンパイラを抽出した場所へのパスを編集します。set PATH=%PATH%;c:\gnu\mingw64\bin
set C_INCLUDE_PATH=C:\gnu\mingw64\include
f2py.py
次のコマンドでビルドを試してください。C:\Python27\python.exe C:\Python27\Scripts\f2py.py -c --fcompiler=gnu95 --compiler=mingw32 -lmsvcr90 -m foo foo.f90
出力は次のとおりです ( でノイズ ラインを削除<--snip-->
)。
これを初めて実行すると、次の 3 つの新しいファイルがビルドされることに注意してくださいC:\Python27\libs
。
libmsvcr90.a
libpython27.a
python27.def
他に何かインストールする必要がありますか? に他のオプションを提供する必要がありますf2py
か? より一般的に言えば、GNU コンパイラから MSVC ビルド Python の拡張機能をビルドすることは可能ですか?
c - C拡張からPythonクラスにアクセスするには?
Cで書かれたPythonの拡張機能があります。現在、外部の純粋なpythonモジュールで宣言されたタイプの拡張オブジェクトの関数で処理する必要があります(たとえば、その名前はですext_module
)。まず、入力オブジェクト タイプが のクラスに対応していることを確認する必要がありますext_module
。どうすればこれを実装できますか? いくつかの追加コード:
実際には、予想されるメソッドを呼び出して例外を取得しようとすることができますがNotImplementedError
、これが正しいアプローチであるかどうかはわかりません。
python - distutilscrossを使用したpythonネイティブC拡張機能のクロスコンパイル、setup.pyは「-x」引数を受け入れません
Python のクロス コンパイルが機能していますが、distutilscross を使用して i2c-tools から py-smbus 拡張機能をクロス コンパイルしようとしましたが、コマンド ラインを通過できません。
ドキュメント(https://pypi.python.org/pypi/distutilscrosspython setup.py build -x
)は、 (適切な環境変数を設定した後)と同じくらい簡単であることを示唆していますが、そのコマンドを実行すると、「-x」が不正な引数エラーを引き起こします.
これを修正する方法を知っている人はいますか?
python - pyqt を使用して .c ファイルに入力を取得する
(scanf による) 入力を必要とする ac プログラムを作成しました。次に、.so ファイルを作成し、それを Python スクリプトで呼び出して、スクリプトを実行するとターミナルで入力を求められるようにしました。しかし、python プログラムを実行すると、端末がハングします。
注意してください:
1. 私の c コード
2. コードのコンパイルに使用したコマンド
3..soファイルの作成
4.python プログラムの関連セクション
.so ファイルのロード
c プログラムで定義された関数の呼び出し
聞いてくれてありがとう :)
python-2.7 - Pythonスクリプトに送信されたSIGINTがMySQL接続を切断するのはなぜですか?
MySQLdb (mysql-python) を使用して MySQL データベースに接続している Python スクリプトに SIGINT を送信する際に問題が発生しています。Python スクリプトは無限ループで実行されます。スクリプトの現在のループが完了した後、SIGINT をキャッチして正常に終了したいと考えています。ただし、SIGINT は実行中の mysql クエリを中断し、サーバーから切断します。これにより、Python スクリプトが現在のループを終了しようとするため、エラーが発生します。
動作を次のスクリプトに絞り込みました。
infinity.py
このスクリプトをコマンド ラインから実行し、別のシェルから SIGINT を送信すると (を使用sudo kill -INT $PID
)、次の出力が得られます。
handling SIGINT
シグナルを送信するとすぐに が出力され、直後に が続きFinished very long query
ます。execute
したがって、通話が中断されていることは明らかです。また、上記のスクリプトを gdb でデバッグしました。SIGINT を送信すると、gdb が停止し、次の出力が表示されます。
興味深いことに、私の Python シグナル ハンドラーからの出力行は、gdb を介して実行すると実行されませんが、libpthread.so.0 では実行が中断されます。
MySqldb パッケージの基礎となる C コードは、独自のシグナル ハンドラを登録していますか? クエリは別のスレッドで実行されていますか? その場合、Python スクリプトだけでなくシグナルも受信しますか?
この動作を防ぐ方法はありますか? シグナル ハンドラーを変更して MySQL に再接続できることを発見しました (MySQLdb.connect
再度呼び出すことにより)。これにより、今後のクエリが失敗するのを防ぐことができますが、現在のクエリが中止されるという影響がまだあります。
ありがとうクリス
python - PyInstance_NewRaw() と新旧のスタイル クラス
最近、コンストラクターを呼び出さずにオブジェクトをインスタンス化しようとしているときに、C ベースの python 拡張機能で問題に直面しました。これは、拡張機能の要件です。
インスタンスの作成に使用するクラスは動的に取得されます。ある時点で、x
他のインスタンスの作成に使用したいクラスを持つインスタンスがあるのでx.__class__
、後で使用するために保存します。この値を にしますklass
。
後で呼び出すPyInstance_NewRaw(klass, PyDict_New())
と、問題が発生します。klass
古いスタイルのクラスの場合、その呼び出しの結果は目的の新しいインスタンスになるようです。ただし、新しいスタイルのクラスの場合、結果は NULL になり、発生する例外は次のとおりです。
SystemError: ../Objects/classobject.c:521: 内部関数の引数が正しくありません
記録のために、私は Python バージョンを使用してい2.7.5
ます。グーグルで調べてみると、解決策を探している人は他に 1 人しかいませんでした (そして、彼は回避策を実行しているように見えましたが、詳細は示していませんでした)。
レコード #2 の場合: 拡張機能が作成しているインスタンスは、これらの同じx
インスタンスのプロキシです。x.__class__
およびは既知であるため、拡張機能は(前述の C 関数を使用して) にx.__dict__
基づいて新しいインスタンスを生成し、それぞれを新しいインスタンスに設定します。インスタンス(これらにはプロセス間共有メモリデータがあります)。インスタンスを 2 回呼び出すことは概念的に問題があるだけでなく(1 つ目: 状態は既にわかっている、2 つ目: ctor の予想される動作は、インスタンスごとに 1 回だけ呼び出す必要がある)、拡張機能を使用できないため、非現実的でもあります。システム内の各インスタンスを呼び出すための引数とその順序を理解してください。また、__class__
__dict__
__dict__
__init__
__init__()
__init__
インスタンスがプロキシである可能性のあるシステム内の各クラスの、それらが対象となるプロキシメカニズムがあることを認識させることは、概念的に問題があり (彼らはそれについて知る必要がありません)、実用的ではありません。
だから、私の質問は:PyInstance_NewRaw
インスタンスのクラス スタイルに関係なく、同じ動作を実行する方法は?