質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

824閲覧

emacsでlspを用いた補完がopencvのメンバーに対して行われない

sai2sai

総合スコア0

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/08/29 08:56

編集2022/08/29 15:20

前提

以下の画像のように、opencvの関数がemacs上で補完されないという状態です。ミニバッファにも他の関数のような簡易な説明が表示されることもありません。
以前pwntoolsというライブラリを使用したとき、u32やp32など一部の関数のみに似たような症状が見られましたが、img2pdfなど普通に使えるモジュールが多数です。
補完にはcompanyを、サーバーはpython-language-serverを使っています。
イメージ説明

###companyとlspに関するinit.elでの設定

elisp

1;;;;;;;;;;;;;;;;;;;; 2;;;;company-mode;;;; 3;;;;;;;;;;;;;;;;;;;; 4(require 'company) 5(global-company-mode t) 6(setq company-idle-delay 0) 7(setq company-minimum-prefix-length 1) 8(setq company-selection-wrap-around t) 9(setq completion-ignore-case t) 10(define-key company-active-map (kbd "C-n") 'company-select-next) 11(define-key company-active-map (kbd "C-p") 'company-select-previous) 12(define-key company-active-map (kbd "C-s") 'company-filter-candidates) 13;;(setq company-backends '(company-capf)) 14 15 16;;;;;;;;;;;;;;;; 17;;;;lsp-mode;;;; 18;;;;;;;;;;;;;;;; 19(require 'lsp-mode) 20(setq gc-cons-threshold 100000000) 21(setq read-process-output-max (* 1024 1024)) 22(setq lsp-completion-provider :capf) 23(setq lsp-prefer-capf t) 24;;assigment to free variables? 25(setq lsp-idle-delay 0.500) 26 27;;;;;;;;;;;;;; 28;;;;lsp-ui;;;; 29;;;;;;;;;;;;;; 30(require 'lsp-ui) 31(setq lsp-ui-imenu-enable t) 32(setq lsp-headerline-breadcrumb-enable t) 33(add-hook 'lsp-mode-hook 'lsp-ui-mode) 34 35;;;;;;;;;;;;;; 36;;;;python;;;; 37;;;;;;;;;;;;;; 38;;(require 'lsp-pyright) 39(add-hook 'python-mode-hook #'lsp)

試したこと

実際にコマンドラインでプログラムを実行すると正しく実行されるため、lspの設定の問題かと思い少し調べてみたところvsCodeでも似たような問題が発生することがわかりました。曰く、pylintのextension-pkg-whitelistにcv2をセットすれば良いとのことでしたので、~/.config/pylintrcを作成して直接その値をセットして再起動したのですが、未だ状況は変わりません。

pipでpylsやpylintなどを再インストールしたり、lsp-modeからeglotに変えたり、言語サーバーをpylsからpyrightに変えてみたりもしてみたのですがやはり同様のエラーが起こってしまいました。

環境

Arch linux
GNU Emacs 28.1
Python 3.10.5
python-lsp-server 1.5.0
pylint 2.14.5
autopep8 1.5.5
flake8 3.8.4
pyflakes 2.2.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

個人的に興味があったので試しに色々やってみて
こうやったらできそうみたいなことができたので紹介します。
(なお,確認は個人の好みでeglotで行っていますが,lspでも同様だと思います)

なおpython-language-server(pyls)はメンテナンスが終了しているので,
python-lsp-server(pylsp)の方がいいと思います。

pipでインストールされたcv2のパッケージの中身を見ると,
動的に色々やっているような感じでlspでは普通に解析できないようです。

解決方法はpylspとmypyを組み合わせるというものです。
適当にpylsp-mypyというモジュールをインストールします。
依存関係でmypyがインストールされることを確認しておいて下さい。

bash

1pip(3) install python-lsp-server 2pip(3) install mypy 3pip(3) install pylsp-mypy

mypyがインストールされるとstubgenというコマンドがインストールされます。
ここで,opencv-pythonのモジュールのインストール先は次のようなところ(xはバージョンによって変わります)
だと思いますので,そのフォルダの中に入って次のコマンドを実行します。

bash

1cd $HOME/.local/lib/python3.x/site-packages/cv2 2stubgen -m stubgen -m cv2 -o .

するとcv2.pyiというファイルができます。

開発している.pyファイルが存在する作業フォルダに同名のシンボリックリンクを貼るか,このcv2.pyiをコピーします。
これでOKです。

おそらくcv2をimportした時にpylspの方では同じフォルダに.pyiというスタブファイルがあれば,
mypyとの連携機能でそちらの情報を参照するという動作なのだと思うのですが詳しく分かっていません。

[追記]

家の環境では上記ではうまくいかなかったのですが,うまくいった方法を追記します。

bash

1cd $HOME/.local/lib/python3.x/site-packages/cv2 2stubgen -m cv2 -o .

の後,生成されたcv2.pyiに対してそのままそのフォルダ内で

bash

1mv cv2.pyi __init__.pyi

を実行して試してみて下さい。
https://github.com/microsoft/pyright/issues/209
https://github.com/emacs-lsp/lsp-pyright/issues/41
にも記述がある方法なので,こちらの方が対策として本命かもしれません。

投稿2022/09/14 08:49

編集2022/09/14 14:30
ujimushi_sradjp

総合スコア2091

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問