Python:Can’t find msguniq. Make sure you have GNU gettext tools 0.15 or newer installed.
- 2021.01.28
- php備忘録 サーバーサイド
- Django, Docker, gettext, GNU gettext tools 0.15, python, エラー改善, スクリプト備忘録, ツール, 多言語化, 自動翻訳

Django:Can’t find msguniq. Make sure you have GNU gettext tools 0.15 or newer installed.
多言語化のためのsettings.pyの設定を終えコマンドを走らせました。
1 |
python manage.py makemessages -l ja |
このコマンドで【/locale/ja/LC_MESSAGES/django.po】が作成されるはずでしたがエラーが返ってきました。
ちなみに、環境はこんな感じです。
- OS:CentOS8
- Dockerにて 【 python:3.9 】イメージを利用
まず最初に正解から
私の場合はDockerfile に下のコードを追加しビルドして解決しました。
1 |
RUN apt-get install -y gettext libgettextpo-dev |
エラーの内容はgettextのプログラムがないと言う事
Can’t find msguniq. Make sure you have GNU gettext tools 0.15 or newer installed.
翻訳:msguniqが見つかりません。GNU gettext tools 0.15 以降がインストールされていることを確認してください。
上記エラーはgettextが存在しない為に発生しています。存在しないといわれる時に考えられることは2つです。
私の環境ではそのままその通り『gettextが存在しない』事が原因でエラーが発生していました。
しかし『gettextへパスが通っていない』場合も同じメッセージが出てくるので注意が必要です。
四苦八苦したgettextのインストール
苦戦の状況は下の通りです。
- gettext とpython-gettext は同じものだと思い python-gettext をインストールして解決せず
- django.po作成コマンドが違うのかと思い [ django–admin makemessages –l ja ]として実行。結果変わらず
- Dockerfileに [ apt-get install -y gettext ] を書き加え再ビルド。Package ‘gettext’ has no installation candidateと撥ねられる
- Dockerfile で python:3.9-buster 使えば入ってないかと期待し実行。結果gettextは存在せず
- パッケージ指定してみようと再度探すが対応パッケージがどれかわからず断念
- gettext libgettextpo-devで取れるという情報に行き当たり実行。やっとコンテナが起動する。
- [ django-admin makemessages -l ja ] を実行。locale\ja 作成に成功。
ググって先頭の方に出てくる情報はMacOSの例が多かったです。
そのため、下のようなインストール方法がよく出てきました。
1 2 3 4 5 6 7 |
# brewを使うためにHomebrewをインストール /usr/bin/Ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" #brewコマンドでインストール brew install gettext #シンボリックリンク作成 brew link gettext --force |
でもね、環境違うのよ。
python-gettextって何者?
1 |
pip install python-gettext |
こんなコマンドでインストールできるので「環境構築は簡単」と思っていたら…どうやら終わったプロジェクトの様です。
■公式ページ(?)抜粋
Project description
Overview
This implementation of Gettext for Python includes a Msgfmt class which can be used to generate compiled mo files from Gettext po files and includes support for the newer msgctxt keyword.The idea for this project had been rather ambitious, but never lived up to what is was supposed to do. Look at Babel (http://pypi.python.org/pypi/Babel) for a project more worthy of this projects name.
Development takes place at https://github.com/hannosch/python-gettext
【翻訳】プロジェクトの説明概要概要このGettextfor Pythonの実装には、Gettext poファイルからコンパイルされたmoファイルを生成するために使用できるMsgfmtクラスが含まれており、新しいmsgctxtキーワードのサポートが含まれています。
このプロジェクトのアイデアはかなり野心的でしたが、本来の目的を果たせませんでした。このプロジェクト名にふさわしいプロジェクトについては、Babel(http://pypi.python.org/pypi/Babel)を参照してください。
開発はhttps://github.com/hannosch/python-gettextで行われます
『本来の目的を果たせませんでした』って…。
はい、こいつは不要です。
python-gettextインストール後に「なんでできない」って足掻いていたのですが全てが無駄だったようです。
apt-get install -y gettextでインストールできなかった理由
1 |
RUN apt-get install -y gettext |
Dockerfile にこんなコマンドを書いたところ、下のようなエラーが出てきました。
E: Package ‘gettext’ has no installation candidate
gettext’ パッケージにはインストール候補がありません
「インストールはどのパッケージがいいの?」って事ですよね。
これに対して指定すべきバージョンを探していたのですが、依存関係などよくわからずインストールに失敗してしまいました。そんな時に見つけたのが次のコマンドです。
1 |
RUN apt-get install -y gettext libgettextpo-dev |
何をしているかよくわかってないですけど【-dev】だからDeveloper用ってことなんでしょうか。
まぁ、DockerのPythonイメージにGettext入れようとした場合、このコマンドで走れます。
単独で動かなかった場合は[ apt-get update ] と合わせて下のように書いてみましょう。
1 2 3 |
RUN apt-get update \ && apt-get install -y python3-dev default-libmysqlclient-dev build-essential \ && apt-get install -y gettext libgettextpo-dev |
現在のDockerfile
今回の事案を受け、Dockerfileはこんな感じになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
FROM python:3.9-buster # ユーザーを作成 ARG UID=1000 RUN useradd -m -u ${UID} ユーザー名 # 作成したユーザーに切り替える #USER ${UID} RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install --upgrade pip \ && pip install -r requirements.txt ADD . /code/ RUN apt update; apt -y upgrade \ && apt-get install -y vim \ && apt install -y gnupg \ && wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \ && wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ && apt install -y ./google-chrome-stable_current_amd64.deb \ && apt clean \ && rm -rf /var/lib/apt/lists/ \ && rm google-chrome-stable_current_amd64.deb \ && apt-get install -y gettext libgettextpo-dev RUN pip install selenium chromedriver-binary~=$(/usr/bin/google-chrome --version | perl -pe 's/([^0-9]+)([0-9]+\.[0-9]+).+/$2/g') \ && pip install django-allauth |
まとめ
最初に出てきたErrorを見て「わかったよ。GNU gettext toolsをインストールすればいいのね。」と簡単に考えていたのですが解決まで1時間。
こういうのは備忘録書いとかなきゃね。
-
前の記事
Django:ファイルシステムos.pathをpathlibで置き換える場合どう書くか 2021.01.27
-
次の記事
Django:多言語化の実装で悩んだポイントと対応策 2021.01.29
コメントを残す