エックスサーバーからPythonでMySQLを操作しようとしたらModuleNotFoundErrorになった話

現在このホームページに掲載するためのデータを使用しているエックスサーバーのMySQLに自動で格納できるようにしようと、導入した仮想環境のpythonを動かして

データ取得→phpmyadminにデータ格納

というのを行おうとpythonファイルを作成してエックスサーバーのフォルダに入れて実行。

import mysql.connector as mydb
 
conn = mydb.connect(
    host='データベースホスト名.xserver.jp',
    port=3306,
    user='データベースのユーザ名',
    password='データベースのパスワード',
    database='データベース名'
)

conn.ping(reconnect=True)
# 接続できているかどうか確認
print(conn.is_connected())
# Trueと表示されれば、正常に接続できています。

しかし、以下のようなエラーが。

ModuleNotFoundError: No module named 'mysql'

いや、モジュールはpipで入れたはずなんですけど・・・
mysql-connectorでは駄目かなと思い、pymysqlにライブラリを変更して行ったものの同様のModuleNotFoundError。

色々英語でもこの問題について検索してみると、anaconda環境なのでもしかするとconda installじゃなければ駄目なのではないかというのに至り、一回pip uninstallをしてconda installでモジュールを入れ直し。
しかしそれでもModuleNotFoundError、mysql-connectorもpymysqlの両方とも同様のエラーが出てしまう。
しかしconda listでインストールした外部モジュールリストを検索するときちんと入っているし、pip installでもpip listで確認するとちゃんとモジュールが入っている。
この時点でインストールはできているはずなのに、読み込めないという今まで直面したことのないエラーでスタック。
英語圏でも同様にこのエラーでスタックしてしまっている人が続出しているのは、こうしたプログラミングについて質問するStackoverflowのサイトでも確認でき、どうにもこうにもなあとなってしまった。

しかし、ここで諦めるのももったいないと思い、なぜ参照できていないのだろうかと基礎に立ち返ることにし、まずそもそも現在エックスサーバーに入っているminicondadenoでのpython仮想環境はどこに保存してあるライブラリを読み込みにいっているのかを下記プログラムで確認した。

import sys
import pprint

pprint.pprint(sys.path)

ModuleNotFoundErrorということはそもそも参照モジュールを認識できていないという話である。
何かしら参照先フォルダのファイルに問題があるのではないかと考えた。

なるほど、ここのフォルダに入っているライブラリを参照しているのか。


このフォルダの中身を見ると今までインストールしたモジュール一覧が入っているが・・・
なぜかmysql-connectorとpymysqlが入っていない。
なぜかpip installでもconda installでもmysql-connectorとpymysqlのインストール先がなぜかこのエックスサーバーに導入したminicondaでのpython仮想環境が読み込むライブラリフォルダと全然違うところに入ってしまっているのだ。

ここまで理解できれば解決は簡単である。
pip installで保存先をこちらで指定して、きちんと参照しているライブラリフォルダを指定してあげればよい。
さてpip installで入れ直し。

$ pip install mysql-connector-python -t "仮想環境がライブラリを読み込んでいる先のフォルダ"

さてきちんと読み込んでくれるかどうか・・・
とやってみるとなんとすんなり通りました!
気づけば単純な話ですが、まさかpip install・conda installが全然違うフォルダにライブラリを格納してしまう事象が発生するとは思わず、気づくまでに時間のかかる案件となりました。

コメント