問題タブ [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.

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

python - Cython はインポートで何をしますか?

Python 拡張機能を作成したいと考えており、Cython を使用するというアイデアが本当に気に入っています。主に、それについてより多くの知識を得て、もしあれば速度の向上を利用するためです。私はかなりの Cython ドキュメントを読みましたが、私は (まだ) コンピューター科学者ではなく、低レベルの基本を理解するための深い知識を持っていません。したがって、次の質問の理由は次のとおりです。

開発中の Python 拡張機能に、外部からインポートしたもの (たとえば、ORM または SQL ライブラリ、またはその他のサードパーティ ライブラリ) を使用するとどうなるのだろうか?

Cython はどのように処理しますか?

このインポートされたライブラリ/拡張機能が純粋な Python であるか、それともコンパイルされている場合に違いはありますか?

これを処理する正しい方法は何ですか?

ありがとうございました。

PS。質問は太字で入力されます。

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

python - Python インポート エラーの未定義シンボル: スクリプトの実行時の Py_InitModule4

私は、この拡張 C モジュールがリモート プロシージャ コール (RPC) を作成してネットワーク サービスにアクセスする Python の C 拡張に取り組んでいます。この C モジュールは、RPC の結果 (収集された情報) にメソッド Py_BuildValue を適用し、それを PyList_Append メソッドを使用してリストに追加します。最後に、このリスト オブジェクトは呼び出し元の Python スクリプトに戻ります。この C モジュールを共有 .so ファイルの形式に変換して、Python で使用できるようにします。

メモリ リークの問題を解決するために、RPC の結果の Py_BuildValue をリストに直接追加する代わりに、この Py_BuildValue の結果を PyObject 変数に割り当て、その変数をリストに追加するようにコードを修正しました。変数をリストに追加した後、Py_DECREF を使用してこの PyObject 変数の参照カウントを減らします。この変更の後、あるマシンで Python スクリプトを実行すると、次のエラーが発生しました。

ImportError: /usr/local/support/iadrpcmodule.so: 未定義のシンボル: Py_InitModule4

しかし、私は Py_InitModule3 のみを使用している C モジュールで変数 'Py_InitModule4' を使用していません。

Python 2.4 を使用してコードをコンパイルし、64 ビットの Linux マシンで実行しました。

ここでも興味深いのは、マシンを再起動したときに問題が消えたことです..!!。
別のマシンで試したとき、この問題は発生しませんでした。

PEP0353 (http://www.python.org/dev/peps/pep-0353/) に従って、Python 2.5 の場合は 64 ビット マシンの名前が変更され、32 を想定する拡張モジュールのロードを防ぐことがわかりました。 -ビットサイズの型を 64 ビットサイズの型を持つインタープリターに変換すると、Py_InitModule4 は Py_InitModule4_64 に名前が変更されます。

このような問題が発生する理由と、マシンの再起動時に解決する方法を教えてください。これは、メモリ リークの問題を修正するためにコードを変更したためであり、この「インポート エラー」を解決するためにコードを変更する必要がありますか? コードで Py_InitModule4 を使用していないため、名前を Py_InitModule4_64 に変更して 64 ビット マシンで動作させるにはどうすればよいですか?

いくつかの修正を適用した以前のコードは、次のようなものです

メモリリークの問題を解決するために、次のようにコードを変更しました。

また、モジュールを初期化するための別の関数は、Py_InitModule3 を使用している次のとおりです。

このコードは Python 2.4 を使用してコンパイルされており、任意の 64 ビット マシンで実行されます。実行マシンには、Python 2.4 と Python 2.5 の両方が含まれている場合があります。

私の質問は、拡張モジュールを Python 2.5 にロードしないようにするために、このモジュールで「Py_InitModule4」を明示的に定義して名前を変更する必要がありますか? 以下のようなもの

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

python - 純粋なasmでpython拡張機能を作成する方法は効率的ですか?

私は中程度のアマチュアスキルを持っていますが、言語のPython初心者でasmあり、言語の知識はありませんC

Cpython -extensions が正常に動作するには、特定のインターフェイスに従う必要があることを知っています。

Assemblyこれは、適切なインターフェイスと完全な機能を備えた純粋な Python 拡張機能を作成することは可能ですか? 2番目の質問は、それを正しく行う場合、それは十分に効率的でしょうか?

グーグルで調べている間、コードの例や、この質問に関する記事や解決策は見つかりませんでした。

そして、これは-code を内部から実行することに関する質問ではないので、SO のトピックと重複していません。asmPython

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

python - C tp_as_mapping(et al。)メソッドはいつ呼び出されますか?

C PyObject構造には、フィールドとが含まれてtp_as_numbertp_as_sequenceますtp_as_mapping。これらはどのような状況で呼び出されますか?これらのCメソッドが呼び出される結果となるPythonコードの例を誰かが提供できますか?

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

c++ - PyString_FromStringAndSize がセグメンテーション違反を引き起こす

Pythonで奇妙なセグメンテーション違反があります。問題のあるコードは次のとおりです。

ヒントを得ることを期待して、そこにprintfを置きました。ただし、長さと fName の値は正しいです。null 値はありません。

そして、これがgdbから得たトレースです:

何か案が ?あたりを見回そうとしましたが、この件について正確な情報は見つかりませんでした。

編集:この問題にあいまいさを追加するだけです。このバグは、スクリプト内で使用している場合にのみ発生します。Python内のコマンドラインから呼び出すと、すべて正常に動作します!

編集:これがvalgrindから得たものです:

それが何を意味するのかよくわかりません!なぜそこで失敗するのか、私はまだ理解していません。文字列 fullName のクローンを作成して、新しいメモリが割り当てられていることを確認するなど、さまざまなアプローチを試しました。新しい char[] を使用して、フルネームをコピーしました。同じ場所で、まだ同じ問題。

誰かアイデアはありますか?それはPythonで一般的なものですか?

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

python - Python拡張機能のデバッグ

Cで書いたPythonの拡張モジュールをデバッグしようとしています。次を使用してコンパイルしました。

次に、次のコマンドでデバッグします。

py_node_make(私が定義した関数の1つ)で壊れますが、それから私は試します:

私がデバッグしようとしている関数は次のとおりです。

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

python - Python メソッドを C 拡張に変換する利点は?

比較的単純な質問:
CPU バウンドのボトルネック メソッドを Python から C 拡張 (ほぼ同じアルゴリズムを実装) に変換すると、

  • 速度とパフォーマンスの向上はどの程度期待できますか?
  • それを決定する要因は何ですか?

更新: 人々は詳細の欠如に不満を持っているようでした. 私は主に、どのような要因が Python コードの一部を C で書き直すのに適した候補にするのかを理解しようとしていました (つまり、元の Python が CPU バウンドである場合、C に移植すると実際に速度が向上するのはいつでしょうか)。

詳細については、これが私が見ているコードです。基本的には、リストの 2 つのリスト (「列」のリスト、各列にはその列に入る可能性のある値が含まれています...基本的にはスキーマ) を取り、n 未満にすることが可能かどうかを確認する再帰的な方法です。 (通常は 1) 変更 (列に新しい値を追加する、新しい列を追加する、列を削除するなどの変更が行われる場合) 値のシーケンス (各列から 1 つの値) が存在するようにします。どちらのスキーマからでも構築できます。これは、文字列間の編集距離を計算するのと非常によく似ています。コードは次のとおりです。

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

c++ - boost.pythonを使用してcygwinでPython拡張機能を手動で構築する

そのような一般的なタイトルで申し訳ありませんが、私は正確に何が欠けているのか、何が間違っているのかよくわかりません。私の目的は、cygwinでboost.pythonを使用してPython拡張機能を構築し、bjamの代わりにmakeを使用するboost.buildツールを回避することです。後者の方法は私にとってはかなりうまくいきましたが、今はこの方法でやりたいと思っています。私はグーグルで同様のトピックを探すことで多くの問題を解決しました。それは私がいくつかのトリックを理解して前進するのに役立ちました。しかし、最後のステップでは、いくつかの問題があるようです。この投稿が将来他の人にも役立つことを願って、またセットアップをよりよく説明するために、すべてのステップを詳細に説明しようと思います。

pythonとboostの両方の元の(さまざまなcygwinリポジトリからの)インストールについてよくわからなかったので、ホームディレクトリに最初からインストールすることにしました。

  1. 最初にPythonをインストールします。これについての詳細はスキップします、それは多かれ少なかれ簡単です。後者の説明にとって重要なのはただの道です:

    /home/Alexey_2/Soft/python2.6-これはPYTHONPATHであり、PATHにも含まれています

  2. ブーストに取り組んでいます:

    a)ブーストソースを解凍します

    b)bjamを作成します。最初にディレクトリに移動します。

    次に、bootstrap.shを呼び出します。これにより、最終的にこのディレクトリにb2およびbjam実行可能ファイルが作成されます。.bash_profileで、このディレクトリをPATHに追加して、bjamを呼び出すことができるようにします。ここと.bash_profileを今後編集するたびに、cygwinを再起動して変更を有効にします

    c)まだ

    ディレクトリ-user-config.jamを編集して、使用するPythonをbjamに知らせます。したがって、私の場合は1行だけ追加します。

    lib-path(最後のエントリ)にlibpython2.6.dllが含まれているため、/ home / Alexey_2 / Soft / python2.6/binを配置します

    d)わかりました。これで、boost-pythonライブラリを作成できます。BOOST_ROOTディレクトリに移動し、コマンドを実行します

    これにより、必要なライブラリ(cygboost_python.dllおよびlibboost_python.dll.a)が作成され、それらがに配置されます。

    /li>
  3. Python拡張機能を構築しています。

    これが私の簡単なテストプログラムです(実際にはサンプルコードの一部です)

    そしてここにMakefileがあります:

    /li>

いくつかのコメント:

  1. ライブラリパスが設定され、適切なライブラリに対してコンパイルされます(詳細:win7-64bitのmingwでboost.pythonを使用してコードをコンパイルします)。

  2. 上記のリンクは、user-config.jamを構成することが重要である理由を説明しています-私はステップ1cでそれを行いました。

  3. 起こりうる問題を回避するために(上記のリンクおよびboost.pythonをmingwとリンクできません(ただしmingwの場合))、静的に好きなboost.pythonライブラリを使用します

    bjamへの引数として(1dを参照)

  4. ここで説明されているように:MinGW + Boost: `WSAStartup @ 8'へ の未定義の参照は、何かをコンパイルしたいライブラリをオブジェクトファイルの後にリストする必要があります。そのため、次のようになります。

    ではなく

    /li>

そして、これが私の.bash_profileの一部です(最終的に)。ここで、環境変数を定義します。

最後に、問題に。上記の設定で、Python拡張オブジェクトファイルを正常にビルドできました。

ただし、単純なスクリプトでテストすると、次のようになります。

ImportErrorが発生します:

このような問題の理由は、使用されているPython実行可能ファイルが間違っている可能性があることに注意してください。ただし、そうではありません。

期待されること(pythonはそのディレクトリからpython2.6へのシンボリックリンクであることに注意してください)

これが私が持っているもう一つの有用な情報です:

何だろう

おそらく意味する可能性があります。これが私が欠けているものかもしれません。しかし、それは何ですか?(最後の質問だけでなく)コメントや提案は大歓迎です。

編集:

(twsansbury)が-vvオプションを使用してPythonモジュールの検索パスを調べるという提案に続いて:

与える

最初のディレクトリは、Pythonを呼び出してスクリプトを実行する場所です。主な結論は、cygwin pythonは、標準のWindows拡張子を持つモジュール(ライブラリ)を探しているということです-dll(他の3つのタイプの中で)、私が最初にcygwinのLinuxエミュレーションスタイルから期待したように.soではありません。したがって、前のMakefileの次の行を次のように変更します。

xyz.dllを生成します。これは正常にロードできます。

今与える:

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

c++ - .stackdump を回避するための try/catch

try/catch以下のコードでは、python モジュールコードで使用しています。ブロックにtry単純なエラー (メモリ アクセス違反) があり、対応する例外をキャッチして、.stackdumpファイルを生成せずにプログラムを静かに終了しようとしています。ただし、後者はまだ生成されており、try/catchコンストラクトがその仕事をしていないことを意味します。不適切な操作 (コード内の操作など) が発生した場合に、ファイルの生成を回避.stackdumpし、エラーなしでプログラムを終了するにはどうすればよいですか? PS私はgccとboost.pythonを使ってcygwinでコードをコンパイルしています

x[3]=2の場合にのみ機能するのではなく、他のすべての場合に機能x[4]=2するのは興味深いことx[20]=2ですx[2]=2

編集:

Maciek が提案したことによると、次のトリックを試しました。

例外をスローするシグナル処理関数を作成しますが、終了しません

次に、問題のある可能性のある関数を try/catch ブロックで囲みます (シグナル関数はクラス コンストラクターに配置されます)。

ただし、このようなトリックは期待どおりに機能せず、次の出力が生成されます。

したがって、例外がスローされますが、キャッチされる前にすべてが終了します。プロセスを終了する前にキャッチする方法はありますか?

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

python - distutilsを使用してPython拡張機能のRPMを構築する際の相対インクルードパス

Python 2.6を使用して、PythonC拡張モジュールのRPMを構築しようとしています。

setup.py私が使用しているものには、次のようなものが含まれています。

python setup.py buildたとえば、から実行する/devel/fooと、エラーなしでコンパイルおよびビルドさgccれ、正しいパスで呼び出されます。

代わりに使用python setup.py bdist_rpmすると、上記で使用した相対パスがRPMビルドディレクトリを基準にした絶対パスに変換されます。これにより、次gccを使用してコンパイルが試行されます。

.hインクルードパスに必要なファイルが見つからないため、コンパイルは失敗します。

これに対する提案や回避策はありますか?