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

python - PythonでFireFoxから現在のURLを取得する

PythonモジュールからFirefoxインスタンスを実行しているときにアクティブなタブの現在のURLが何であるかを知りたいです。FireFoxにはこれのためのAPIがあり、Pythonはそれを操作することを知っていますか?

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

python - Python C APIで複数のモジュール/タイプを使用していますか?

2つの異なるPython拡張モジュールがあります。それらをAとBと呼びましょう。モジュールAには、クラスメソッドの戻り型としてモジュールB内で使用したいcontainerというストレージクラス型が含まれています。

これを行う方法についてのドキュメントが見つからないようです。モジュール/クラスを作成するために、この記事に大まかに従いました。ただし、すべてのメソッドを静的として宣言しなかったため、アクセス可能でした:http: //nedbatchelder.com/text/whirlext.html

私の質問は、モジュールBのクラスメソッドのPyObject *戻り値として返すことができるコンテナのインスタンスを作成するにはどうすればよいですか?コンテナ定義は次のようになります。

問題のメソッド内で次のことを簡単に実行してみました。container_initは、コンテナークラスのtp_initとして登録したメソッドです。

ただし、Pythonインタープリターによると、メソッドを呼び出したクラスが返されます。(つまり、myclassinstance.mymethod()はmyclassinstanceを返します)。

私は明らかにこれを間違った方法で行っていますが、正しい方法が何であるかわかりません。助言がありますか?それを示唆する人を断ち切るためだけに-いいえ、SWIGやBoost::Pythonの使用には興味がありません。私はすでにそれを試しましたが、コンテナの基礎となるストレージクラスはどちらともうまく機能しませんでした(SWIGはそれを解析することさえできませんでした)。これまでのところ、自分で拡張機能を実行するのはかなり苦痛がありませんでしたが、私はこれに困惑しています。

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

python - Python C 拡張機能でメソッドを呼び出せません

私は、いくつかの関数とカスタム型を定義する最初の Python C 拡張機能の作成に取り組んでいます。奇妙なことに、カスタム タイプは機能していますが、通常の機能は機能していません。最上位の MyModule.c ファイルは次のようになります。

この setup.py ファイルを使用して拡張機能を構築しています。

「DoStuff」ファイルは、その機能を次のように定義します。

面白いことに、MyCustomType 型は次のようにインスタンス化できるため、正常に動作します。

そして、カスタム型の new メソッドと init メソッドからの printf() ステートメントが出力されているのがわかります。ただし、このコードは失敗します。

次のエラーが表示されます: Traceback (most recent call last): File "MyModuleTest.py", line 9, in mymodule.doStuff(buffer) AttributeError: 'module' object has no attribute 'doStuff'

ここで何が起こっているのですか?モジュールのメソッド宣言に何らかのエラーがありますか?

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

python - Python拡張機能はlibrary_dirsを使用できません

Python distutils.core.Extensionでlibrary_dirsを指定すると、ビルドしようとすると次のエラーが発生します。

どうしてこれなの?MacOSXでPython2.5を使用しています。

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

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

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

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

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

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

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

c++ - IronPythonのインタープリター(ipy.exe)に*.pydライブラリをインポートする

この例に従って、小さなhello.pydライブラリファイルを作成しました。その内容はこの質問の最後にあります。

Pythonインタープリターに入ると、次のようになります。

しかし、IronPythonのインタープリターでこれを試してみると、エラーが発生します。

ipyインタープリターにこのC++コンパイル済みライブラリを受け入れさせるにはどうすればよいですか?


hellomodule.cpp


setup.py


次のようにコンパイル

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

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

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

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

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

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

python - C 拡張または Cython を使用した重要な Python アプリケーションの最適化に関するチュートリアル

Python コミュニティは、Python コードのプロファイリング方法や、C またはCythonでの Python 拡張機能の技術的な詳細を示す参考資料を公開しています。私はまだチュートリアルを探していますが、自明ではないPythonプログラムについては、次のことを示しています。

  1. C 拡張への変換による最適化の恩恵を受けるホットスポットを特定する方法
  2. 同様に重要なこととして、C 拡張への変換の恩恵を受けないホットスポットを特定する方法
  3. 最後に、Python から C への適切な変換を行う方法について説明します。Python C-API を使用するか、(できれば) Cython を使用します。

優れたチュートリアルでは、完全な例を使用して最適化の問題を解決する方法について、読者に方法論を提供します。そのようなリソースを見つけることに成功しませんでした。

そのようなチュートリアルを知っていますか (または書いたことがありますか) ?

明確にするために、以下のみをカバーするチュートリアルには興味がありません。

  • (c)Profile を使用して Python コードをプロファイリングし、実行時間を測定する
  • ツールを使用してプロファイルを調べる ( RunSnakeRunをお勧めします)
  • より適切なアルゴリズムまたは Python コンストラクトを選択することによる最適化 (たとえば、リストの代わりにメンバーシップ テストのセット)。チュートリアルでは、アルゴリズムと Python コードが既に最適化されていると想定する必要があり、C 拡張が次の論理的なステップになる時点に達しています。
  • C 拡張機能の作成に関する Python ドキュメントの要約。これは、リファレンスとしては優れていますが、Python から C にいつ、どのように移行するかを示すリソースとしては役に立ちません。
0 投票する
2 に答える
610 参照

python - データ破損: バグはどこにある‽

最後の編集:問題が何であるかを把握しました (以下の自分の回答を参照してください)が、質問を回答済みとしてマークすることはできません。以下の私の回答にある質問に誰かが答えることができる場合、つまり、これは Cython のバグですか、それとも Cython の意図した動作ですか? .


最初に、私はこれを理解しようと 3 日間試みてきたと言うことから始めなければなりません。私はただ頭を壁にぶつけています。ドキュメントからわかる限り、私は正しくやっています。明らかに、私は物事を正しく行うことはできません。

いずれにせよ、私は mcrypt を Python にバインドする作業を行っています。Python 2 と Python 3 の両方で動作するはずです (ただし、Python 2 ではテストされていません)。投稿に含めるには大きすぎるため、リンクされています。また、何が間違っているのかわからないため、問題のコードを特定することさえできません問題を示すスクリプトも私のサイトにあります。スクリプトは、文字「a」のみの 100 ブロックをフィードするだけで (暗号化アルゴリズム/暗号化モードが使用するブロック サイズに関係なく)、もちろん、ラウンドトリップの結果として「a」のブロックを取得する必要があります。しかし、そうではありません(常に)。これを 1 回実行した場合の出力は次のとおりです。

奇妙な部分は、特定の (アルゴリズム、モード) ペアに対してまったく同じであるということです。アルゴリズムを変更すると、異なるラウンドトリップが発生しますが、アルゴリズムを変更しない場合、実行ごとに常に同じになります。私は絶対に困惑しています。また、上記の出力でわかるように、ブロック 5 と 6、ブロック 13 と 14 など、常に 2 つのブロックが連続して破損しています。したがって、パターンはありますが、何らかの理由で把握できません。そのパターンが正確に指しているもの。

私はおそらくここで多くの質問をしていることに気付きました.コードの小さな断片を分離することはできません.mcryptとPythonの両方に精通している必要があります. 悲しいかな、これに頭を悩ませてから 3 日後、私はこの問題から少し離れる必要があります。 (b) 後で問題に戻ったときに自分のバグを確認できる、または (c) 誰かまたは自分自身が自分のコードのバグではないかもしれない問題を見つけることができるバインディング プロセスまたはライブラリ自体のバグ。

私が行っていないことの 1 つは、別のバージョンの mcrypt ライブラリを使用しようとしたことです。Cython 0.13、Python 3.1、および mcrypt 2.5.8 を使用して作業を行っています。これらはすべて、Ubuntu 10.10 で Ubuntu によって配布されています (PyPi から取得した Cython を除く)。しかし、私は問題なく機能し、Ubuntu 10.10 でデータ破損なしに mcrypt を使用している PHP アプリケーションでシステムを管理しているので、それが mcrypt のビルドであると信じる理由はありません。 、 おもう。

いずれにせよ、助けてくれる人には心から感謝します。私はこの問題に何日もノンストップで取り組んできたので、気が狂いそうになり始めており、解決策はおそらく目の前にあると感じていますが、それを見ることができません。

編集: strncpy の代わりに memcpy を使用する必要があると誰かが指摘しました。私はそれを実行しましたが、テスト スクリプトはすべてのブロックが正しくないことを示しています。以前よりもさらに混乱しています...これがpastebinの新しい出力です。

編集 2 : 私はコンピューターに戻ってきて、もう一度見てきました。問題が発生している可能性がある場所を見つけるために、どこにでも print ステートメントを追加しているだけです。raw_encrypt.step(input) 関数の次のコード:

最初の print ステートメントは、渡されたプレーンテキストであると予想されるものを示しています。ただし、2 番目のステートメントは、完全に異なるものを示しており、同一である必要があります。私が完全に理解していない Cython で何かが起こっているようです。

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

python - exeファイルでDLLからエクスポートされたPythonオブジェクトを使用する

私は2つの部分からなるイベントジェネレータを持っています:

pyglobalexe(イベントをシミュレートするためのスタブ)

pyglobalextension

どちらのファイルも正常にコンパイルされます。pyglobalexe.exeがPyObject_CallMethod呼び出し時にクラッシュします。pyglobalexeのpyglobalextensionからevent_queueglobalを使用できるようにするには、何を変更する必要がありますか?

===編集===

申し訳ありませんが、ユースケースをより明確にする必要がありました。

コマンドプロンプト1(python.exeを実行)

コマンドプロンプト2(コマンドプロンプト1で完了したら)。

コマンドプロンプト1とq.get()10の数字に戻ることができると期待していました。