Archive for the ‘Programming’ Category

python-logo-master-v3-TM

pipでもpip3でもparamikoが入らなかった

環境は以下の通り
Raspberry Pi Zero

cat /etc/debian_version
#9.8

Command “python setup.py egg_info” failed with error code 1 in ...

というようなエラーが出ていた。
調べてみるとsetuptoolsをアップグレードするというような記事が出てきた。

それらをやってもだめだったため、githubからparamikoのソースコードを探し出し、cloneの後に直接インストールを試みた。
pipを介さずインストールするのは依存関係が壊れる可能性があるので、もちろんバックアップは取ってからのこと。

すると、libffiというライブラリが不足していてインストールに失敗していることがわかった。

そこで

pip3 install libffi

でlibffiをインストールしたあと

pip3 install paramiko

で無事paramikoのインストールができた。

neovimを使っていて、:HealthCheckを実行時、python3はOKなのにpython2はエラーが出ていた。
python3とpython2、どちらもOKじゃないと問題がないかはわからなかったが、とりあえずエラーが出ている状態というのは気持ちがいいものではないので解決した

環境:
os:Linux Ubuntu18.04LTS
python2:2.7.16
python3:3.7.2

このサーバーではpythonのバージョン管理にpyenvを使っている。

記事執筆時に新しいバージョンだったpython2とpython3を導入している
それぞれ環境のところに書いてあるpythonをpyenvを使ってインストールをした。

その後、~/.config/nvim/init.vimに下記の記述を追加


let g:python_host_prog = expand('~/.pyenv/versions/2.7.16/bin/python2')
let g:python3_host_prog = expand('~/.pyenv/versions/3.7.2/bin/python3')

これで:CheckHealthをするとエラーは消えた

バージョンを直で書くのはよくないとかいう声も聞こえてきそうだけれど、とりあえずはこれでよし

(本当の問題は別のプラグインがまともに動いてくれていなくて、これがpython2がうまく動かないことに起因しているのかを確かめたかったのです)

下記記事を参考にさせていただきました。ありがとうございます。

init.nvim にpython のpath を指定してneovim の起動速度を早くする - Qiita

先日、上司が作ったpythonプログラムのグローバル変数を、外部からのプログラムによって書き換えたいという要求が起こった。

プログラム内でグローバル変数として確保されているメモリ領域を他のプログラムから直接書き換える、なんてことできるのだろうかと調べてみたら、プロセス間通信というのがそれらしいことがわかった。

しかしチラっと説明を見てみるとかなり面倒くさいことが発覚。
そりゃそうだ。ちょっと考えてみれば結構深いところを触らなければいけないことくらいはわかる。

そうして思いついたのは以下の2つ

  1. 環境変数を使ってプログラム間で変数の値を共有する
  2. 中継ファイルを一つ作る

1の方法では不可能だった。
Linux上のプログラムはOS全体の環境変数について読み込むことは出来ても書き換えることはできない。

プログラム上で書き込むことができるように見えても、それはそのプロセスにおいての環境変数が書き換わるだけで、他のプログラムから環境変数にアクセスすると、その値は書き換わってはいないのだった。

次に2の方法を試す。
これはまあ問題ないだろうと思いつつ実装してみると、やはり期待どおり動いた。

そこで友人のdyama氏(https://dyama.orgの運営者)からpipeを使ってはどうかというご提案をいただく。

pipeというのは文字通りfifoなpipeなわけだが、簡単に挙動を説明するとこんな感じ

#terminal A
$mkfifo pipe
$tail -f pipe

#terminal B
$echo "hoge" > pipe

とすると、ターミナルAの方でhogeという文字列が表示される

#terminal A
$tail -f pipe
hoge

この仕組を使って、2つのプログラム間での通信をさせて、外部プログラム(プログラムB)からコマンドを送り、それをpythonプログラム(プログラムA)で処理をするという形にした。

簡単な図にするとこう

スクリーンショット 2019 05 09 10 26 14

他プログラムから自プログラムの変数への介入をさせたいプログラムAは、もともとのメインループに加えてスレッドを実装し、一秒ごとにpipeファイルを読みにいく挙動を付け加えた。

さほどスピードが必要とされる処理ではなかったので一秒に一回で十分だった。

I/Oの時間すら惜しいスピードが求められる処理であれば、プロセス間通信を使う他ないのかなと思うが、ひとまずこれで十分に使えるものが出来たので満足です。