MAMPでPython3を使用する

MAMPとPythonに苦戦中。

前回の記事で、MAMPのphthonを使った方が良さそうと書いた。
コードの先頭行は
#!/usr/bin/env python3
ではなく、
#!/usr/bin/env /Applications/MAMP/Library/bin/python
にした方が良いと。
MAMPに同梱された /Applications/MAMP/Library/bin/python はバージョン 2.7だった。

#!/usr/bin/env /Users/ユーザ名/.pyenv/shims/python3
として、Pythonバージョン3を使うために、チャレンジする。
MAMPが示すコード例(Examples)は下記。

import mysql.connector

config = {
  'user': 'root',
  'password': 'root',
  'host': 'localhost',
  'unix_socket': '/Applications/MAMP/tmp/mysql/mysql.sock',
  'database': 'test',
  'raise_on_warnings': True
}

cnx = mysql.connector.connect(**config)

cursor = cnx.cursor(dictionary=True)

cursor.execute('SELECT `id`, `name` FROM `test`')

results = cursor.fetchall()

for row in results:
  id = row['id']
  title = row['name']
  print '%s | %s' % (id, title)

cnx.close()

テーブル名は test ではなく table1として作成しているのでそこは変えるとして、printの行で SyntaxError: invalid syntax: が出た。

Pythonバージョン2では、
print “Hello”
で良かったものが、Pythonバージョン3では、カッコをつけないとダメになったようだ。
print(“Hello”)

よって、コードを書き換えることで、このエラーは消えた。
print ‘%s | %s’ % (id, title)

print(‘%s | %s’ % (id, title))

次のエラーは
import mysql.connector: /Applications/MAMP/htdocs/mysql_brew.py
ModuleNotFoundError: No module named ‘mysql’: /Applications/MAMP/htdocs/mysql_brew.py

ライブラリのmysqlがないと思われる。

$ pip3 list
で、インストール済みのパッケージ一覧を確認。

pipはPythonのパッケージ管理ソフトらしい。

$ pip3 search mysql
で検索を試みるが、
RuntimeError: PyPI no longer supports ‘pip search’ (or XML-RPC search). Please use https://pypi.org/search (via a browser) instead.

searchは使えないんですって。

https://pypi.org/search で検索。


たくさん出てきてどれかわからないが、入れてみる

$ pip3 install mysql-connector

エラーがなくなった。

なんとか、MAMPでPython3が使えるようになった。

ちなみに、コード内でPythonバージョンを表示する方法は、

import sys

print("Content-Type: text/html\n\n")

print(sys.version)
print("<br>")

そして、前回出ていたレコード内に日本語が混じっていたときのエラー UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position xxx は出なくなった。Python バージョン3では解消したようだ。
ただし、文字コードをきちんとしないとブラウザ上では文字化けしたため、ちゃんとhtmlにしてみた。
最終的には、下記のコードとした。Hello Worldは関係ないけど。

#!/usr/bin/env /Users/ユーザ名/.pyenv/shims/python3

import sys

print("Content-Type: text/html\n\n")

print("<html>")
print("<head>")
print("<meta charset=\"utf-8\">")
print("<title>Hello World</title>")
print("</head>")
print("<body>")
print("<h1>Hello World!</h1>")

print(sys.version)
print("<br>")

import mysql.connector

config = {
  'user': 'root',
  'password': 'root',
  'host': 'localhost',
  'unix_socket': '/Applications/MAMP/tmp/mysql/mysql.sock',
  'database': 'test',
  'raise_on_warnings': True
}

cnx = mysql.connector.connect(**config)

cursor = cnx.cursor(dictionary=True)

cursor.execute('SELECT `id`, `name` FROM `table1`')

results = cursor.fetchall()

for row in results:
  id = row['id']
  title = row['name']
  print('%s | %s' % (id, title))

cnx.close()

print("</body>")
print("</html>")

まだまだ、色々と問題がありそうだなー。