暗号通貨.py

ビットコインやブロックチェーンの技術に衝撃を受け、プログラミングの勉強を開始。現在はPythonを勉強中。

Python

Pyramidチュートリアルを辿る③テストの実行とデータベースの初期化、アプリケーションの起動まで

前回の記事「Pyramidチュートリアルを辿る②エラーとの闘い」の続きです。

前回はまさかのpip freezeエラーにより時間をくってしまいました。

チュートリアルはまだ1ページも進んでいません泣

チュートリアルを終わらして簡単でも良いのであと3日間ぐらいで、オリジナルのWebアプリをPyramidで作ることが目標なので頑張っていきます。時間も限られていますし。

テストの実行

SQLAlchemyやテスト環境のインストールは前回終えたため、テストを実行してみます。

ディレクトリはmyprojectです。

$ py.test -q

結果はこのようになります。

..
2 passed in 7.23 seconds

チュートリアルでは0.44secondsだったけど私はなぜか遅いですね。気にせずいきましょう。

$ py.test --cov --cov-report='term-missing'

これチュートリアルでは「py.test --cov --cov-report=term-missing」となっていて文字列を表す''クォーテーションが抜けているので注意が必要です。

こんなん返ってきます。

usage: py.test [options] [file_or_dir] [file_or_dir] [...]
py.test: error: argument --cov-report: invalid choice: "=" (choose from "['term', 'term-missing', 'annotate', 'html', 'xml']")

形式を選んでねってことだと思います。

テストの結果も一応載せておきます。

platform darwin -- Python 3.5.1, pytest-3.0.6, py-1.4.32, pluggy-0.4.0
rootdir:/Users/maedanaoki/Documents/python_app/pyramid_tutorials/myproject, inifile: pytest.ini
plugins:cov-2.4.0
collected 2 items

myproject/tests.py ..

---------- coverage: platform darwin, python 3.5.1-final-0 -----------

Name Stmts Miss Cover Missing


myproject/init.py 8 6 25% 7-12
myproject/models/init.py 22 0 100%
myproject/models/meta.py 5 0 100%
myproject/models/mymodel.py 8 0 100%
myproject/routes.py 3 2 33% 2-3
myproject/scripts/init.py 0 0 100%
myproject/scripts/initializedb.py 26 16 38% 22-25, 29-45
myproject/views/init.py 0 0 100%
myproject/views/default.py 12 0 100%
myproject/views/notfound.py 4 2 50% 6-7


TOTAL 88 26 70%

===== 2 passed in 3.04 seconds =====

cookiecutterにもデフォルトでテストカバレッジ機能があるようですが特に必要なさそうなので飛ばします。

データベースの初期化

次にデータベースを初期化して、アプリケーションを起動させましょう。

ここで盛大にドハマリすることになります。

チュートリアルと同様に

$ initialize_tutorial_db development.ini

と打ち込み、データベースを初期化します。

しかし、このコマンドの結果は

$ command not found

what?why?意味がわからない。他のなんらかのエラーならまだしもcommand not foundってチュートリアル道理にやっているのにそんなことある?とパニック状態。

冷静にチュートリアルを見直し、他の記事など探すも理由はわからず。

とりあえず先に進もうと、アプリケーションの起動までやってみます。

$ pserve development.ini --reload

指定されたローカルのURLhttp://localhost:6543に飛びます。

以下のような記述がありました。pyramid優しい!

Pyramid is having a problem using your SQL database. The problem
might be caused by one of the following things:

  1. You may need to run the "initialize_myproject_db" script
    to initialize your database tables. Check your virtual
    environment's "bin" directory for this script and try to run it.

  2. Your database server may not be running. Check that the
    database server referred to by the "sqlalchemy.url" setting in
    your "development.ini" file is running.

After you fix the problem, please restart the Pyramid application to
try it again.

手がかりになりそうなのは、"initialize_myproject_db"とCheck your virtual environment's "bin" directory

やっぱりどう考えてもinitialize_myproject_dbと打ってくれと言っているのにコマンドがないのはおかしい。

ということは本命はCheck your virtual environment's "bin" directoryの方。

仮想環境のbinディレクトリを確認してくださいってことですよね。確認しましょう。

あれ?ぼくの作った環境にbinディレクトリがない。じゃあつくればいいか、とmyprojectの前にmkdirでbinディレクトリをわざわざ作って試してみる。

当たり前だけど全然うまくいかず、途方に暮れる。

とりあえず悪いのは仮想環境だろうと重点的に調べます。

全然別の関係ないディレクトリでさっきのコマンドを打ち込みます。

$ initialize_myproject_db development.ini

pyenv: initialize_myproject_db: command not found

The `initialize_myproject_db' command exists in these Python versions:
3.5.1/envs/pyramid
pyramid

コマンドが見つかりません。initialize_myproject_dbは「3.5.1/envs/pyramid」か「pyramid」環境にあります。

おっ、今まで私が利用していたのは「pyramid」環境です。

これは以下のコマンドで作りました。

$ pyenv virtualenv 3.5.1 pyramid

私のpyenv環境を見てみましょう。

$ pyenv versions
system
2.7.11
2.7.11/envs/new_env
2.7.7
3.5.1
3.5.1/envs/django
3.5.1/envs/pyramid
3.5.1/envs/test
anaconda3-2.5.0
django
miniconda2-latest
miniconda3-latest
new_env
* pyramid (set by /Users/maedanaoki/documents/python_app/pyramid_tutorials/bin/myproject/.python-version)
test

あれ?pyramid環境2つある。

もしかしてもう1つの3.5.1/envs/pyramidの方なら!!

$ pyenv local 3.5.1/envs/pyramid

そもそも2つの仮想環境ができることすら知らなかった。

なぜこんなことになるのか?理由を調べたいけどまた泥沼になりそうなので、とりあえずチュートリアルを終わらすことに専念します。

もう1度やり直します。

$ initialize_myproject_db development.ini

pkg_resources.DistributionNotFound: The 'myproject' distribution was not found and is required by the application

次はなんだ、、、

myprojectが見つからないよってことのよう。

いやいや最初にmyproject作ったしなんのこっちゃ。

ここで違和感に気づく。

もしかしてpip freezeで出てきてたmyprojectのことでは・・・

そうです。前回の記事でアンインストールしたmyprojectのことです。

もう1度インストールしてやり直します。

$ python setup.py develop

pip freezeするとエラーが出ますが無視して再度データベースの初期化を図ります。

$ initialize_myproject_db development.ini

2017-02-23 23:10:53,055 INFO [sqlalchemy.engine.base.Engine:1235][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2017-02-23 23:10:53,055 INFO [sqlalchemy.engine.base.Engine:1236][MainThread] ()
2017-02-23 23:10:53,056 INFO [sqlalchemy.engine.base.Engine:1235][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2017-02-23 23:10:53,056 INFO [sqlalchemy.engine.base.Engine:1236][MainThread] ()
2017-02-23 23:10:53,057 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] PRAGMA table_info("models")
2017-02-23 23:10:53,058 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] ()
2017-02-23 23:10:53,059 INFO [sqlalchemy.engine.base.Engine:1140][MainThread]
CREATE TABLE models (
id INTEGER NOT NULL,
name TEXT,
value INTEGER,
CONSTRAINT pk_models PRIMARY KEY (id)
)

2017-02-23 23:10:53,059 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] ()
2017-02-23 23:10:53,061 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT
2017-02-23 23:10:53,061 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] CREATE UNIQUE INDEX my_index ON models (name)
2017-02-23 23:10:53,061 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] ()
2017-02-23 23:10:53,063 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT
2017-02-23 23:10:53,069 INFO [sqlalchemy.engine.base.Engine:679][MainThread] BEGIN (implicit)
2017-02-23 23:10:53,071 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] INSERT INTO models (name, value) VALUES (?, ?)
2017-02-23 23:10:53,072 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] ('one', 1)
2017-02-23 23:10:53,073 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT

うおー!!できた!!

結局はpyenvの環境選択を間違えていたことと、setup.py developでインストールしたmyprojectを消したことが問題だったみたいです。

アプリケーションの起動

データベースの初期化も完了しましたのでアプリケーションの起動にかかりましょう。

$ pserve development.ini --reload

http://localhost:6543に飛びます。

下の画像が表示されれば成功です。

 

これでひとまずインストールからアプリケーションの起動までのチュートリアルの1ページ目が終わりました。

http://docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/wiki2/installation.html

次回はルーティングやviewについてになります。

最後に2つだけ今回の反省点を。

  • pyenvを使うときはどの環境にいるのかを注意する
  • インストールしたものをエラーが出たからといって何も考えずに消さない

がんばっていきまっしょい。

 

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

-Python