Help us understand the problem. What is going on with this article?

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

はじめに

 初投稿です。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公式のドキュメンテーションは普通に修正した方がいいと思う。
 何か指摘あれば遠慮なくお願いします。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした