Category: python

  • pipenv2018.7.1とpip18.1の組み合わせはエラーになる

    不具合に遭遇したのでメモ。

    現象

    $ pipenv install {some_package}
    すると、エラー終了する。
    Pipfileやパッケージのインストール自体は完了している
    lockfileの作成あたりでコケている模様?

    原因

    エラーメッセージでググると同様の事象を見つけた。
    https://github.com/pypa/pipenv/issues/2871

    pipenv2018.7.1とpip18.1の組み合わせがエラーを起こしている模様。

    解決方法

    workaroundとしてはpipを18.0にする。
    ポイントとしては、pipenvの環境のほうのpipを18.0にする。

    $ pipenv run pip install pip==18.0

  • Pythonの環境構築にpipenvを使う

    pipenvというPythonの仮想環境構築ツールを使い始めました。詳細は公式を見れば良いとして分かりづらかったところのメモ書き。

    Pipenv: 人間のためのPython開発ワークフロー

    書いている時点のバージョンは以下
    $ pipenv –version
    pipenv, version 2018.7.1

    インストール

    繰り返しだが詳細は上記の公式サイトのドキュメントを読めば良い。macOSの場合Homebrewとpipを使う方法があるようですが、私はPythonのバージョン管理にpyenvも使っていてHomebrewの方で入れるとバージョンが変になりそうな気がしたのでpipの方でインストールしました(Homebrewで試してはいない)。

    $ pip install pipenv
    すると、下記のようにpyenv配下にpipenvがインストールされてる模様。
    $ which pipenv
    /Users/hkuro/.pyenv/shims/pipenv

    使い方

    任意のディレクトリで
    $ pipenv shell
    とすると、”カレントディレクトリの名前-{hash}”という名前のvirtualenvが~/.local/share/virtualenvs/配下に作成される。hashの部分は詳しく調べてないけど何らかのハッシュみたいなので、別の同名ディレクトリでpipenv shellしても別のvirtualenvとして作成される(そりゃそうか)。

    環境変数を設定することでカレントディレクトリに作成されるようにすることが可能(

    PIPENV_VENV_IN_PROJECT)。これは環境によって違いそうなのでpipenv shellするときのオプションであったほうが便利そうな気もする。
    カレントディレクトリにPipfileを作成してくれて、pipenv経由でパッケージをインストールするとPipfileの更新なども同時にやってくれる。これまでだとpip freezeとかいちいちしないといけなかった部分が、PHPでいうところのcomposerみたいな感じになっているということ、なんだと思った。

    9/21追記:任意のディレクトリでpipenv shellして環境が作成されたあと、そのディレクトリを別のパスに移動したあとにpipenv shellすると新規のvirtualenvが作成される、元の場所に戻すと前のvirtualenvに戻れるので、やはりsuffixのハッシュはカレントディレクトと連動している模様。

    virtualenvから抜けるには

    pipenv shellした環境はvirtualenvでsource activateした場合と違ってサブシェル中で動作しているようなので、環境を抜けるにはCtrl+Dかexitする必要がある。deactivateしてしまうとvirtualenvな環境からは実質抜けてるけどpipenvが起動したサブシェルからは抜けられないみたいな中途半端な状態になってしまうので注意する。

    環境の削除

    普通のvirtualenvなので、上記の~/.local/share/virutualenv/配下の該当ディレクトリを丸ごと削除すれば良さそうだけど、もしくはpipenv shellしたのと同じディレクトリでpipenv –rmとすれば対応する環境は削除される。

    その他

    繰り返しだが作成されるのは普通のvirtualenvなので、
    $ source ~/.local/share/virtualenv/hogehoge/bin/activate
    とかすれば任意のディレクトリで特定のvirtualenvに入ることもできる。

  • pyenvとpyenv-virtualenvで任意のpython環境に切り替える(homebrew使用)

    pyenvを使って任意のPythonバージョンを利用できるようにする。
    さらに、pyenv-virtualenv(pyenvのプラグインということらしい)で、同一のPythonバージョン化でも任意のpython実行環境が管理できるようにする。これはpipとかでライブラリをインストールする場合に便利だろう。

    homebrewを使ってインストールすることにする。

    1. pyenvのインストール
      $ brew install pyenv
    2. pyenv-virtualenvのインストール
      $ brew install pyenv-virtualenv
    インストール自体は上記で終了。続いてPATH環境変数などを書き換える必要があるが、これは初期設定のスクリプトファイル(zshなら.zshrc)に以下の行を追記すれば良い

    if which pyenv > /dev/null; then eval “$(pyenv init -)”; fi
    if which pyenv-virtualenv > /dev/null; then eval “$(pyenv virtualenv-init -)”; fi

    これでPATHなどの環境変数を書き換えて、実際にpythonコマンドなどでpyenvの設定が有効に動作するようになる。

    具体的にはシステム全体、特定のディレクトリ配下、現在のシェル内のいずれかで任意のpython環境が利用できることになるので、pythonで複数のプロジェクトを管理するような場合には、必要な最小限だけのライブラリ環境が構築できてとても便利です。

  • Homebrewを使ったpyenvのセットアップ(El Captan+zsh)

    Homebrewを使ったzsh+prezto環境でのpyenvの構築手順メモ。

    1. pyenvのインストール
    $ brew update
    $ brew install pyenv

    2. 環境変数の設定
    .zshrcに以下の行を追加する。Preztoの場合はどこに独自設定を書けばいいんだろうと思ったんだけど、普通に.zshrcに書けばいいらしいからPreztoはあんまり関係なかった。

    if which pyenv > /dev/null; then eval “$(pyenv init -)”; fi

    3. python環境のインストール
    デフォルトで使えるバージョンはsystemのみ。
    追加できるバージョンは以下で確認できる。

    $ pyenv install -l

    で確認したあと、

    $ pyenv install 2.7.12

    みたいにして任意のバージョンをインストールする。 pyenv環境にインストールすみのバージョンは

    $ pyenv versions

    で確認できる。 任意のディレクトリで

    $ pyenv local 2.7.12

    のようにすると、そのディレクトリに.python-versionというファイルが作られ、これが反映されてそのディレクトリ内でpythonコマンドを実行した時だけそのバージョンのPythonで実行されるようになり、ディレクトリを抜けるとglobalなpythonのバージョンに自動で切り替わる。globalなバージョンを変更するときは

    $ pyenv global 2.7.12

    とすると、ローカルに.python-versionがないディレクトリで実行される(globalな)pythonのバージョンを設定できる。

  • pyenv installでエラーになるときの対応

    macOS(正確にはEl Capitan)のpyenvで特定のバージョンのpythonをインストールしようとしたときにエラーになることがありました。曰く:

    $ pyenv install 2.7.12                                                                                                               +[master]Downloading Python-2.7.12.tar.xz…-> https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xzInstalling Python-2.7.12…ERROR: The Python zlib extension was not compiled. Missing the zlib?
    Please consult to the Wiki page to fix the problem.https://github.com/yyuu/pyenv/wiki/Common-build-problems

    調べると、 zlibのヘッダが見つかってないのでCFLAGS環境変数を設定するか、xcode-select –install を実行してXCodeコマンドラインツールを再度設定するとのこと(OSをアップグレードした後とかは必要だそう)。

    今回はxcode-selectのほうを試して正常にインストールできるようになりました。

    $ xcode-select –install   

    として出てくるダイアログ経由でXcodeのコマンドラインツールをインストールしたあと、

    $ pyenv install 2.7.12                                                                                                               +[master]Downloading Python-2.7.12.tar.xz…-> https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xzInstalling Python-2.7.12…Installed Python-2.7.12 to /Users/Kurosawa_Hiroyuki/.pyenv/versions/2.7.12 

    としてインストールが成功するようになりました。

  • pythonでnkfを使って文字コードの変換を行う要点だけ

    pythonでnkfを使って文字コードの変換を行う要点だけ

    環境依存文字を含むutf-8文字列をeuc_jpに変換したいときに、pythonのunicode.encode(‘euc_jp’)だとエラーになってしまうのでこれをnkfモジュールで解決するという内容。

    (more…)

  • OSX MavericksでPillowのPNGサポートを有効にする方法の要点だけ(blockdiagのインストール)

    OSX Mavericks環境でblockdiagをインストールしようと思い、pipを使ってPillowをそのままインストールするとPNGサポートが無効なままの様である。これを解決したのでインストールメモ。

    (more…)

  • dotcloudでDjango

    dotcloudのチュートリアルでDjango + Mongo DBがうまく動かなかったのでメモ的に書いとく。
    単にチュートリアルが古いだけなのでそのうち修正されるんだと思う。

    http://docs.dotcloud.com/tutorials/python/django-mongodb/
    このドキュメントの、requirements.txtの部分の記述が古くて、うまくdotcloud pushできない(エラーをよく見ると、django-mongodb-engineがgithubからpullできてないみたい)。これを、

    このように書くとうまくデプロイできる。

  • OSXのPastorのexportをKeePassX XML形式に変換するスクリプト

    以前のエントリで書いたけど、KeePassならWin/Mac以外にもiPhoneとかからも使えるのでパスワード忘れて困った!ということが基本的に無くなって便利なので乗りかえました。移行のときに、OSXのパスワード管理ソフトPastorの書き出したtsvをKeePassXで読み込めるXML形式にコンバートするPythonスクリプトを書きました。

    この手のやつどこに上げたもんかと思ってたんだけど、さっきgistというものの存在を知ったので使って公開してみます。これ便利だな。