4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python3かつvenv使用時にuWSGIをインストールする時の注意点

Last updated at Posted at 2020-02-13

はじめに

 初投稿です。Pythonでwebアプリケーションを構築する際に用いるuWSGIのインストール方法に関する記事です。

準備

 OSはLinux、Mac。Windowsの場合は分からないです。
 まず、Python3でvenvを建てる
$ python3 -m venv ./venv
アクティベート
$ . ./venv/bin/activate
pipのアップグレード(兼pipコマンドが通るか確認)
(venv) $ pip install -U pip
このまま普通にuWSGIをインストールしようとしても、おそらくエラーになるはずです。

(venv) $ pip install uwsgi
...(略)
No such file or directory
     #include <Python.h>
              ^~~~~~~~~~
    コンパイルを停止しました。

公式のドキュメンテーションをみる

 Installing uWSGI — uWSGI 2.0 documentation を参照。これによれば、

Devian系統 (Ubuntu等)

$ sudo apt-get install build-essential
$ sudo apt-get install python-dev

RedHat系統 (CentOS, Amazon Linux AMI等)

$ sudo yum groupinstall "Development Tools"
$ sudo yum install python-devel

を打ってからpipでuWSGIをインストールするとの事。
このようにすればコンパイルが通るようになり、うまくインストールできるらしい.

 uwsgiをEC2インスタンスにインストールしようとして失敗した話
を見ても、同じコマンドを打っていてコンパイルが通ったと報告がなされている。

 しかし、Python3のvenv環境ではこのようにコマンドを打った後でもpipでのインストールが通らない。
venvを使っていなくともPython3であれば、
$ python3 -m pip install uwsgi とコマンドを打ってもエラーになるはず。

解決策

 RedHat系統でしか確認できていないが、上のコマンドを次のように変更してやれば良いだけのことだった。

$ sudo yum groupinstall "Development Tools"
$ sudo yum install python3-devel

これでuWSGiのインストールも通るはず。

(venv) $ pip install uwsgi
Collecting uwsgi
  Using cached https://files.pythonhosted.org/packages/e7/1e/3dcca007f974fe4eb369bf1b8629d5e342bb3055e2001b2e5340aaefae7a/uwsgi-2.0.18.tar.gz
Installing collected packages: uwsgi
  Running setup.py install for uwsgi ... done
Successfully installed uwsgi-2.0.18

Ubuntu等の場合でも、次のように変更すれば多分いけるはず。

$ sudo apt-get install build-essential
$ sudo apt-get install python3-dev

bottle+uWSGI+python3+nginxでアプリを動かす でも同じようにコマンド打ってますね。

 これでインストールが通る理由としては、python-devやpython-develはPython3ではなくPython2に対応したものだから(多分)。python3-devやpython3-devel、はたまたpython3.6-devなんてものが出ていることからも恐らくそうなのだろう。

 venvを使わずに、python -m pip install uwsgi などと打ってうまくいっている例が多い(ように感じる)のは、pythonのパスがPython2のバージョンのものになっているのではないだろうか。linuxだと大体デフォルトではそうだし。
 その場合、nginxやDjango、Flask等と繋げるところまではとりあえずうまくだろうが、uWSGIを通してwebアプリを動かす時にはPython2で動いていることになるので、f文字列等のPython3特有の構文は使えなくなるし、venvを使ってないので入れるモジュール(バージョン含め)を環境ごとに分けるとかも出来なくなる。

補足

 venv環境を使ったwebアプリケーションをuWSGIで動かす時は、コマンドを打つ際に
$ uwsgi ~(略)~ --venv /to/path/venv
と追加するか、.iniファイルに

...(略)
venv = /path/venv

を追記するのを忘れずに。

終わりに

 以上がPython3かつvenv使用時にuWSGIをインストールする時の注意点、になります。自分含めてuWSGIのインストールでハマってしまう人が多い気がするわりに、「uwsgi python3 venv」等のキーワードで検索しても全然引っかからず、また「python3-devel」で検索しようとしても検索候補にuWSGIが出なかったりしたので、必要性があるかもしれないと思い寄稿しました。
 てかPython2もサポート終了するんだし、uWSGI公式のドキュメンテーションは普通に修正した方がいいと思う。
 何か指摘あれば遠慮なくお願いします。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?