これまでのあらすじ
諸事情により最近 Android Studio を使っているので、ついでに Python の開発環境も PyCharm にしてみようと思った。普段は packer で作った VirtualBox の仮想環境に入って Vim 使ってる。
環境
ホスト: Mac OS X 10.9.2
ゲスト: Ubuntu 14.04 LTS
PyCharm: 3.4
ゲストは shiguredo/packer-templates で作ったあと vagrant ユーザーじゃなくて新たにユーザー (drillbits) を作って vagrant ssh じゃなくて普通に ssh ログインできるようにしてある。
あと apt で入る Python3.4 には ensurepip ないので普通にビルドしてある。
PyCharm のインストール
はい http://www.jetbrains.com/pycharm/
ホストに作業環境作る
ローカルにもそれなりの環境作らないといけない。
Python3.4 のインストール
.dmg あるけど homebrew 使ってると相性悪いっぽいので、Python も brew install
する。
$ brew update
$ brew install python3
$ python3 -V
Python 3.4.0
PyCharm でプロジェクト作成
プロジェクト用のディレクトリ作っておく
適当に。
$ mkdir -p ~/dev/sushiapp
venv の作成
PyCharm 起動して Create New Project
を選択。
Interpreter の右の ... から Python Interpreters を開いて、ヘビさんマークから Create Virtual Environment する。
Base interpreter が Python3.4 なら、ちゃんと virtualenv じゃなくて pyvenv を使ってくれるっぽい。やりましたね。
あとはできあがった interpreter を使って Pyramid Project を作る。
仮想環境と同期する
コードは、仮想環境のディレクトリを直接参照するのではなくて、単純にファイルをアップロードして同期する。
Vagrant の設定
Configure > Preferences > Vagrant
これだけ設定する。仮想環境は bebe っていう名前で /Users/drillbits/vagrant/bebe
に VagrantFile がある。
同期の設定
Tools > Deployment > Configuration...
+
ボタン押して Add Server する。今回は Name: bebe, Type: SFTP で。bebe はホストオンリーアダプターで 192.168.33.10
に ssh ログインする感じ。接続テストもできて便利。
あと Connection 以外にも Mappings, Excluded Paths の設定も必要。
Mappings
- Local path: /Users/drillbits/dev/sushiapp
- Development path on server 'bebe': /home/drillbits/dev/sushiapp
Excluded Paths
venv のディレクトリは同期したくない (Python 入ってるパスとか違う) ので除外する。
- /Users/drillbits/dev/sushiapp/env
これであとは Tools > Deployment > Configuration の Automatic Upload にチェックしておくだけでいい感じにアップロードしてくれる。
仮想環境の venv 作成
PyCharm からはできないっぽいので ssh login して直接作る。
$ cd ~/dev/sushiapp
$ pyvenv-3.4 env
Pyramid プロジェクトのセットアップ
pcreate 使わないマンなので普通に setup.py などを書いたりモジュールを配置したりする。とりあえず最低限。
from setuptools import setup, find_packages
install_requires = [
'pyramid',
'waitress',
]
setup(
name='sushiapp',
version='0.0',
packages=find_packages(),
install_requires=install_requires,
entry_points="""\
[paste.app_factory]
main = sushiapp:main
""",
)
[app:main]
use = egg:sushiapp
pyramid.reload_templates = true
[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 5000
ここで通常ならコマンドラインで python setup.py develop
するところを PyCharm の Run/Debug で行えるようにする。
Remote interpreter 追加
setup.py は仮想環境内で実行されてほしいので Remote Interpreter を追加する。
Preferences > Project Interpreter > Python Interpreters
+
ボタン押して Select Interpreter Path から Remote... を選ぶ。
Fill from deployment server settings > bebe とすると自動で設定入ってくれて便利。
Python interpreter path だけ、先ほど作成した venv の python /home/drillbits/dev/sushiapp/env/bin/python
を指定しておく。
ちなみに Remote Interpreter、接続情報とか入って名前めっちゃ長くなるので、あとから鉛筆アイコンで編集して適当な短い名前に変えるといい。
setup.py develop の Run Configuration 作成
Run > Edit Configurations...
+
を押して Python を選択、setup develop
という名前で Configuration を追加する。
Python Interpreter に先ほど作成した Remote interpreter を指定して、Script に setup.py のパス、Working directory に作業ディレクトリのパスを入力する。ここのパスはローカルだけど問題ないっぽい。
これを Run すると仮想環境で setup.py develop が実行されて pyramid が install されたりする。
また、この Configration の Python Interpreter をローカルの venev のものに変えたものも作っておく ((local) setup develop
)。理由は後述。
setup develop
の Before launch っていうところで +
を押して、Run Another Configuration として (local) setup develop
を追加しておくと setup develop
を Run する前にローカルにも実行できて便利。
Project Interpreter
Run/Debug Configurations の他にも Preferences > Project Interpreter で、デフォルトの Interpreter っぽいものを設定できる。
仮想環境を使いたいのだから、ここも Remote Interpreter にするのだろうと思ってたけど、これはよくなかった。
Remote Interpreter を設定してしまうと zope.sqlalchemy みたいに namespace パッケージがあるやつを import したときに IDE っぽい赤い波線が出て Unresolved reference
とか言われる。IDE 使っているのだからそういう警告っぽいのは出ないようにしたい。
Project Interpreter をローカルのものにして、かつローカルにもちゃんとインストールしておけば問題ない。なので Run Configuration にローカルのやつも作った。Before launch 使えば実行漏れもなくなる。
問題点
PyCharm、setup.py
の install_requires にパッケージ追記するとインストールするか聞いてくれるのだけど、これは Project Interpreter のところにしか実行してくれない。なんとかしたい。
pserve の Run Configuration 作成
sushiapp モジュール作れば pserve できるようになるけど、これも Run Configuration でできる。
Run > Edit Configurations... で +
を押して Pyramid server を選択して作る。
Config file とかいいつつ実際は pserve のパスを設定しないといけないところが罠っぽい。Run browser にチェックしておくと実行時にブラウザ開いてくれて便利だけど、既に開いてる場合でも新しいの開くの気が付くと無限にタブが増えている。