Python: pipでローカルネットワー上のプライベートなリポジトリからインストールする

仕事で使うちょっとしたツール(大抵はテキスト処理のツール)を Python で書いたりしてるんだけど、一つ不便なことがある。職場のネットワークから PyPI にアクセスできないんだ。

まぁ、セキュリティだの何だの考えるとインターネットへのアクセスを制限するのもわからないではない。

幸いブラウザでは繋がるので、ファイルを一つずつダウンロードしてからインストールすることは可能で、今までそうやってたんだけど不便なことこの上ない。パッケージがファイル一つで済むならまだいいんだけど、他のパッケージに依存してたりすると、正直やる気が失せてくるし、同僚に使ってもらおうというときにもハードルが高い。

さて、今日になって pip install コマンドの --find-links オプションでパッケージ置き場の URL を指定できることを知った。pypiserver みたいな PyPI クローンのサーバじゃなくて、ディレクトリにパッケージファイルを置いておくだけでいい。

早速、自宅の HTTP サーバにディレクトリを公開して試してみた。こんな感じ。

takatoh@apostrophe:~$ pip install filtre --find-links http://nightschool/py-packages/ --trusted-host nightschool
Looking in links: http://nightschool/py-packages/
Collecting filtre
  Downloading http://nightschool/py-packages/filtre-0.1.0-py3-none-any.whl (1.9 kB)
Installing collected packages: filtre
Successfully installed filtre-0.1.0

http://nightschool/py-packages/ がパッケージファイルを置いてあるディレクトリの URL。--trusted-host nightschool オプションを指定してるのは HTTPS じゃなくて HTTP だから。filtre ってのは自作のパッケージね。

さらに、Windows なら file: スキーマでも行ける。上のディレクトリは Samba で共有フォルダにしてあって file://nightschool/shared/py-packages/ でアクセスできるので、こうすればいい。

takatoh@montana: Documents > pip install filtre --find-links file://nightschool/shared/py-packages/ --user
Looking in links: file://nightschool/shared/py-packages/
Processing \\nightschool\shared\py-packages\filtre-0.1.0-py3-none-any.whl
Installing collected packages: filtre
Successfully installed filtre-0.1.0

やぁ、これでだいぶ楽になるぞ。

ちなみに、パッケージファイルをダウンロード(インストールじゃなくて)するには pip download コマンドを使えば依存パッケージも含めてダウンロードしてくれる。使いそうなパッケージを自宅でダウンロードしたら、職場に持っていってまとめて適当な共有フォルダに放り込んでおけばいい。

[追記]

pip install コマンドの --find-links オプションや --trusted-host オプションは、pip の設定ファイルに書いておけばいちいち指定しなくてもいい。こんな感じ。

[install]
find-links = http://nightschool/py-packages/
trusted-host = nightschool

pip の設定ファイルは、Linux なら ~/.conf/pip/pip.conf、Windows なら %APPDATA%\pip\pip.ini。

MediaWikiにYouTubeの動画を埋め込む

ローカルネットワーク上で使ってる MediaWiki に YouTube の動画を埋め込みたいと思って調べたら、そのまんま、YouTube という名前の拡張機能があった。マニュアルに使い方が載ってる。

これを使うことにする。

環境

  • Ubuntu server 20.04 LTS
  • Docker 20.10.8
  • docker-compose 1.25.5
  • MediaWiki 1.35.0

MediaWiki は Docker コンテナ上で動いていて、これは dockerhub から取ってきた公式のイメージを利用してる。

拡張機能のダウンロードとインストール

拡張機能は、上のリンクからたどってダウンロードした。YouTube-REL1_36-c352d8c.tar.gz っていうファイル名だった。

マニュアルによると、これを MediaWiki のディレクトリにある extensions/ ディレクトリに置けばいい。コンテナの中に入って確認すると、(コンテナ内の)/var/www/html/extensions/ に置けばいいことがわかった。

とはいえ、コンテナ内に置く必要はなくて、外(つまりホスト側)に置いてボリュームをマウントすればいい。実際、LocalSettings.php ファイルなんかもそうなっていて、~/docker-environments/wiki/ 以下に置いてある。

というわけで、ここに extensions/ ディレクトリを作って、YouTube 拡張機能を配置する。

$ cd ~/docker-environments/wiki
$ mkdir extensions
$ cd extensions
$ tar xzvf ~/YouTube-REL1_36-c352d8c.tar.gz

これで extensions/ ディレクトリの下に YouTube/ ディレクトリができる。

つぎに、MediaWiki の設定ファイル LocalSettings.php に1行書き加える。

wfLoadExtension('YouTube');

YouTube っていう拡張機能を読み込む設定だ。MediaWiki についてはこれで終わり。

Dockerコンテナの設定と再起動

拡張機能自体はコンテナの外に置いてあるので、ボリュームとしてマウントする。docker-compose.yml ファイルの volumes セクションに書き加える。

      - /home/takatoh/docker-environments/wiki/extensions/YouTube:/var/www/html/extensions/YouTube

最後にコンテナを起動し直して終わり。

$ docker-compose restart wiki

確認

実際に MediaWiki のページに YouTube の動画を埋め込めることを確認した。楽なもんだね。