AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

mysqlclient / MySQL-python コンパイルエラー対処

Redhat w/SCL + pip で、Django/pythonMySQLドライバ mysqlclient / MySQL-python がインストール出来なかった対処メモ。

SCLの問題というか、Redhatrpmパッケージの考え方の問題なのかな?

# MySQL の mysqlclient と python と名前が被って若干混乱

状況と解決

pip でインストールをすると gcc が走ってコンパイルを行うのですが、どちらのドライバも同じ所で失敗してしまってました。

    gcc -pthread -shared build/temp.linux-x86_64-2.7/_mysql.o -L/opt/rh/mysql55/root/usr/lib64/mysql -L/opt/rh/python27/root/usr
/lib64 -lmysqlclient -lpthread -lz -lm -lrt -lssl -lcrypto -ldl -lpython2.7 -o build/lib.linux-x86_64-2.7/_mysql.so
    /usr/bin/ld: cannot find -lmysqlclient

mysqlclient でググルと、MySQL-develと一緒に提供があるとの情報と、libmysqlclient.so によるとある。

続きを読む

flake8 2.5.0 のエラー対処 on Ubuntu

Ubuntu に pip で flake8 を入れたら、上手く動かなかった。次の対処で上手く動作したのでメモ。

対処1

設定ファイル書くか -j0 オプション付けて並列処理をなくしたら動作。

vi ~/.config/flake8

[flake8]
jobs = 1
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="14.04.3 LTS, Trusty Tahr"

$ python -V
Python 2.7.6

$ flake8 --version
2.5.0 (pep8: 1.5.7, pyflakes: 1.0.0, mccabe: 0.3.1) CPython 2.7.6 on Linux

対処2

あとから、apt-get でインストールしたらよかったと気づいた。。。

こっちのバージョンだと jobs オプションがないようなので、さっきのファイルは削除。

sudo apt-get install python-flake8

$ flake8 --version
2.1.0 (pep8: 1.4.6, mccabe: 0.3.1, pyflakes: 0.8.1) CPython 2.7.6 on Linux

Ubuntu 側でパッケージが用意されてる見極めって、どのラインなんですかね?CentOSと両方使ってると、ついつい pip からはいってしまう。

続きを読む

Djangoアプリ全体で使う変数をコンテキストプロセッサで提供

組み込み Template とかをみてると {{ MEDIA }} とかが出てきますが、これを自前で作る方法。同じアプリを複数サイトで立ち上げる必要が出てきて、区別の為、アプリごとにユニークな名前を表示したい。ただ、それだけの用途に使いました。

Django 1.7 の admin のように基底クラスの中で変数を定義して継承、もしくはCookieに値をセット、なども気づいたのですが、今回は修正が少なくて済む context processor を用意する方法を選択)


環境:

  • python 2.7.6
  • Django 1.6.11 (1.8から?は仕様が変更になってるようなので、後日確認)

Template と Context

Template 上で扱いたいオブジェクトや値は、Viewからcontextに入れて渡すというのが通常の流れ。

view.py

class IndexView(TemplateView):
    template_name = 'index.html'
...
    context['application_name'] = 'HogeHoge'

app/templates/index.html

<h1>{{ application_name }}</h1>

しかし、全Viewに対してアプリ名を渡すとなると、各Viewのcontextにアプリ名を渡していく修正が発生するので手間がかかる。

Context Processor で Context に値を追加

そこで、新しく必要な値を渡す コンテキスト プロセッサを作り、context を生成する度に、特定の変数を渡せるようにします( {{ MEDIA }} のような)。

続きを読む

dateutil で 曖昧な日付をパースする

pythondateutil ライブラリ。標準の datetime.strptime で日付を構文解析するよりも手軽にパースすることができます。2.x/3.x 両対応。

今回、このようなフォーマットの日付をパースしたのですが、表記が曖昧なので、結果が揺れてしまいました。

In [1]: import dateutil.parser

In [11]: dateutil.parser.parse('30/09/2015')
Out[11]: datetime.datetime(2015, 9, 30, 0, 0)

In [12]: dateutil.parser.parse('28/09/2015')
Out[12]: datetime.datetime(2015, 9, 28, 0, 0)

In [13]: dateutil.parser.parse('11/10/2015')
Out[13]: datetime.datetime(2015, 11, 10, 0, 0)

そこで dayfirst=True をつけて明示化して解決。

In [14]: dateutil.parser.parse('11/10/2015', dayfirst=True)
Out[14]: datetime.datetime(2015, 10, 11, 0, 0)

ちなみに daifirst, yearfirst ともにデフォルトは False らしいです。

ちょっとした課題は、賢人が過去に考えて解決策だしてくれてるんだと実感した次第です。

Python仮想環境ツール一覧 virtualenvwrapper, direnvとか

Pythonなど新しいバージョンがリリースされる言語は、プロジェクトや勉強に合わせたパッケージ用意したりと、1つの環境で作業しているとグチャグチャになります。
そこで1台のPC上に独立した個別環境を複数作れる、Python仮想環境を用意するツールを利用します。沢山あるなーって思ったので一覧にしてみました。

仮想環境ツールの一覧

ツール 切替コマンド 概要
direnv 特定ディレクトリに cd するだけ。複数言語に対応 environment switcher for the shell。GO言語
anyenv 特定ディレクトリに cd するだけ。複数言語に対応 simple wrapper for rbenv style environment managers。bashスクリプト
pyenv 特定ディレクトリに cd するだけ Simple Python Version Management。bashスクリプト
venv/pyvenv source activate/deactivate Python 3.3以降に内蔵。PEP 405
virtualenvwrapper 切替えコマンド workon/deactivate bashスクリプト
virtualenv 切替えコマンド activate/deactivate bashスクリプト/Windowsバッチ
続きを読む