「Python」タグアーカイブ

pythonで、データベースを使い、データに更新があるか調べる時に出たエラー

また、ほんのちょっとしたミスで長時間を無駄にしたのでメモ。

GAE上でpythonを使ってデータをデータベースに入れ、新しいデータを入れる時に、データに変化があったら自動でメールで知らせる、というプログラムを作っていた。

最初は問題なく動いていたんだけど、途中で急におかしくなり、データに更新がないのにデータ更新がある、というメールが来るようになってしまった。

最初は、ランチャーのバージョンの更新か何かが影響してるかと思ったが、色々試した結果、文字コードのせいだとわかった。

データの更新を調べるときに、新しく入れるデータと、すでに入れているデータを比較するんだけど、お互いに文字コードが違ったので、同じ内容でも更新ありと判断してしまっていた。前に、プログラムをちょっといじった時に、文字コードに関する部分もいじっていたのが原因。

単純なミスだけど、文字コードの違いでエラーが出るという発想自体頭に無かったのでハマった。

1

GAE(Google app engine python)でデプロイに失敗しError 409が出た時の解決法

以前もデプロイに失敗して以下のようなエラーが出たことがある。

Error 409: — begin server output —
Another transaction by user (ユーザー名) is already in progress for app: (アプリ名), version: 1. That user can undo the transaction with “appcfg rollback”.

これはデプロイの途中で何かあってエラーが出たという意味らしく、元の状態に戻すためにはコマンドプロンプトからコマンドを打ち込む必要がある。

前回は、ネットで調べてすぐ解決したんだけど、今回はなぜか何度やっても解決しない。原因は、Google app engineを置いている場所と、アプリを置いているフォルダを別の場所においていたからっぽい。

結論を書くと以下のようにしたら解決した。

まず、google_appengineのフォルダ上にマウスポインタを置いて、SHIFTを押しながら右クリック

すると開いたウィンドウ内に「コマンド ウィンドウをココで開く」があるのでクリック。

すると、GAE(Google app engine python)までのパスがすでに表示された状態でコマンドプロンプトが開くので

「python appcfg.py rollback ここにアプリのパスを書く」をコピペしてエンターを押せばOK

アプリのパスは、アプリのフォルダ内を表示させている状態で、フォルダ上部にあるパンくずリスト上で右クリックしてアドレスをコピーで取得できる。

また次回エラーが出た時に時間を無駄にしないように半分自分のためにここにメモしておく。

1

matplotlibのインストール

matplotlibのサーバーへのインストールについて、よく紹介されている方法でやると、他にもいろんな物入れないといけなかったり、エラーが出たりで大変。ネットを見ていてもインストールに苦労している人が多い。私もさくらのVPSに入れようとして挫折。

でも、公式サイトのインストールの部分(http://matplotlib.sourceforge.net/users/installing.html)を見ると、EPDという物を使うと超簡単みたいなことが書いてある。で、さっそくインストールしてみたらあっさり成功。他にpythonを入れていたんだけど追加でインストールしてもちゃんとい動いた。いくつかエラーはでるけど、そのエラー表示で検索するとすべて解決方法は見つかるので、15分くらいで終わった。

一番引っかかったのが、最初にどうやってインストールするかで、なんとなくカンでやったら上手く行った。まず、wgetでダウンロード先のURLを入れて、サーバーにダウンロードする。SHファイルなので、shの後にファイル名を指定すると、インストールが自動で始まる。あとは画面の指示に従うだけ。

1

XMLのメモ

以下のようなXMLファイルがあって、Cタグの属性であるdataの中身Xを取り出す方法。
<xml_api version=”1″>
 <A>
  <B>
   <C data=”X”/>
   <D data=”Y”/>
   <E data=”Z”/>
  </B>
 </A>
</xml_api>
実際にはもっとごちゃごちゃしていて時間を取られた・・・。XMLは新しいものを使うたびに引っかかってる気がする。要素とか属性とか単語の意味をちゃんとわかってないと頭が混乱する。

GAEでpython使ってElementTreeで取り出す。
追加で以下の2つを読み込む。

from xml.etree.ElementTree import XML, ElementTree, Element
import urllib2

取り出し方。

url = “URL
xml = ElementTree(file=urllib2.urlopen(url2))
xml = xml.getroot()
xml = xml.find(“A/B/C”)
xml = xml.get(“data”)
print xml

これでXが出てくる。
わかってしまえばシンプルだけど、ここまでたどり着くのに時間かかった(>_<)

1

正規表現メモ

GAE上にサイトマップを置く方法がわからず迷った。

解決

app.yamlファイル内に以下を書けばOK

– url: /(.*\.xml)
static_files: htdocs/\1
upload: htdocs/(.*\.xml)

直接sitemap.xmlを入れて

– url: /(sitemap.xml)
static_files: htdocs/\1
upload: htdocs/(sitemap.xml)

でもOK。

正規表現が今だによくわかってないけど、解決したのでさっさと先に進む。

1