みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

yoctoのbitbakeで作ったLinuxでPyCharmのリモートデバッグ環境をつくる

これがしたかったために、有償版を買った。

PyCharmを使った普通のリモートデバッグ環境の構築はたくさんあると思うので、 yoctoで作ったラズベリーパイ3向けの環境でリモートデバッグする環境を作る。

その際にハマったところピックアップする。

確実に名前でアクセスできるようにする

local.confに下記を追加して、確実に「raspberrypi3.local」でアクセスできるようにする。

詳細についてはavahi-autoipdでDHCPサーバが無い場所でもIP通信を参照。

# avahi
IMAGE_INSTALL_append = " \
             avahi-daemon \
             avahi-autoipd \
"

リモートデバッグの設定

通常の手順でプロジェクトを作成した後に「File」->「Settings...」で設定ダイアログを出し、 左側のツリーの検索フィールドで「Project Interpreter」の項目を選択する

f:id:mickey_happygolucky:20180411060441p:plain

ダイアログ右端の歯車アイコンをクリックし「Add...」を選択する。

「Add Python Interpreter」ダイアログが表示されるので、画面左のリストから「SSH Interpreter」を選択する。

f:id:mickey_happygolucky:20180411060510p:plain

次の内容を入力し「Next」ボタンをクリックする。

項目
Host raspberrypi3.local
Username root
Port 22

次の画面でそのまま「Finish」ボタンをクリックする。

java.io.IOException: inputstream is closed」のエラー

SSHインタプリタの追加画面で「Finish」ボタンをクリックした時に次のような画面が表示された場合は、 ターゲット側でSFTPサーバが動作していないことが疑われる。

f:id:mickey_happygolucky:20180411060519p:plain

回避するためには、次のようにlocal.confに追加する。

# ssh/sftp
EXTRA_IMAGE_FEATURES += "ssh-server-openssh"
IMAGE_INSTALL_append = " openssh-sftp-server"

PyCharmではターゲット側へのファイルの転送にSFTPを使用する。 dropbearのSFTPサーバでも良いかもしれないが、opensshのほうがおそらく無難。

イメージをSDに書きなおした後、再度SSHインタプリタの追加を実施する。

リモート側のインストール済みパッケージが表示されない

ターゲット側にpipがインストールされていないとこのようになる。

f:id:mickey_happygolucky:20180411061059p:plain

local.confで次を追加する。

# pip
IMAGE_INSTALL_append = " python-pip"

「Couldn't refresh skeletons for remote interpreter」のエラー

リモートとの接続時に次のようなエラーが発生する。

f:id:mickey_happygolucky:20180411061146p:plain

Couldn't refresh skeletons for remote interpreter
            failed to run generator3.py for sftp://root@raspberrypi3.local:22/usr/bin/python, exit code 2, stderr: 
            -----
            /usr/bin/python: can't open file '/home/root/.pycharm_helpers/generator3.py': [Errno 2] No such file or directory
            -----

これは、SDにOSイメージを書き直した場合などに発生することが多く、その原因はPyCharmのリモートヘルパーパッケージがターゲット上で展開されていないためである。

リモートヘルパが正しく機能していないと、FlyCheckの処理でターゲットにインストールされているモジュールの解決がうまく行かないなどの症状が発生する。

このエラーを解消するためには、ターゲット側でリモートヘルパーパッケージを展開する必要がある。 一度SSHでターゲットにログインし、リモートヘルパーが転送済みか確認する。

ターゲット側で次のコマンドを実行する。

# cd ~/
# ls -la

この時点でホームディレクトリに「.pycharm_helpers」が存在しない場合は、PyCharmで一度Pythonスクリプトを実行してみる。 すると、ヘルパーパッケージがデプロイされるので、再度ホームディレクトリを確認する。 「.pycharm_helpers」の存在を確認した後で次のコマンドを実行する。

# cd ~/.pycharm_helpers
# tar xvf ./helpers.tar.gz

tarの展開が終わったらPyCharmでメニューの「File」->「Invalidate Caches / Restart...」を選択する。

f:id:mickey_happygolucky:20180411061308p:plain

ダイアログの「Invalidate and Restart」ボタンを押しキャッシュをクリアとPyCharmの再起動を行う。

f:id:mickey_happygolucky:20180411061326p:plain

すると、再起動にリモートインタプリタの更新が開始され、これらの処理が終了すると正しくリモートと接続されるようになる。