この記事の内容
あるPCで動いていたコードが違うPCで動かないことがありました。
原因は相対パスを上手く読み込んでいないことが原因のようでしたので、備忘として解決策を記載します。
なお、現時点で解決策がうまくいく理由がわからないため、理解ができた段階で記事を更新する予定です。
目次
1.背景
2.事象の整理
3.解決策
4.解決策が上手くいく理由
1. 背景
とある簡単なアプリケーション作成のために書いたコードが1,000行超え始めたところから、1ページのpythonファイルにコードを書くことに限界を感じ始めましたので、処理
を分割し、複数のpythonファイルに分けて管理をすることとしました。
ログイン情報等の初期値についてはsettings.ini
ファイルを作成し、settings.py
からconfigparser
を使って読み込むこととしました。
また、アップデート管理をするためにgithubも先日使い始めました。
初めてのことが重なり、わからないこともたくさん出てきたので備忘として記録を残します。
2. 事象の整理
メインPCで作成したRepositoryをgitからサブPCにクローンを作成したときに、なぜかうまくいかない箇所がいくつかありました。
特に理由がわからなかったのが、相対パスで参照していたsettings.ini
をsettings.py
から読み込めない点でした。
メインPCでは下記のコードで問題なく動いていました。
import configparser
conf = configparser.ConfigParser()
conf.read('./settings.ini')
# プロファイルパス
PROFILE_PATH = conf['driver']['PROFILE_PATH']
# saleceforce
Saleceforce_ID = conf['saleceforce']['Saleceforce_ID']
Saleceforce_PASS = conf['saleceforce']['Saleceforce_PASS']
Saleceforce_ADDRESS = conf['saleceforce']['Saleceforce_ADDRESS']
しかし、これをサブPCで動かすと下記のエラーが生じます。どうやら'./settings.ini'
をうまく読み込めていないということがわかりました。
raise KeyError(key)
KeyError: 'driver'
3. 解決策
こちらについては下記のように書き直してやるとうまくいきます。
import configparser
import os
conf = configparser.ConfigParser()
path = os.path.join(os.path.dirname(__file__), 'settings.ini')
conf.read(path, 'UTF-8')
# プロファイルパス
PROFILE_PATH = conf['driver']['PROFILE_PATH']
# saleceforce
Saleceforce_ID = conf['saleceforce']['Saleceforce_ID']
Saleceforce_PASS = conf['saleceforce']['Saleceforce_PASS']
Saleceforce_ADDRESS = conf['saleceforce']['Saleceforce_ADDRESS']
相対パスだとうまく読み込めないので、実行ファイルのディレクトリをos.path.dirname(__file__)
で読み込んで直接指定してやると上手くいきました。
違う環境でコードを実行するときはこっちのほうがいいのかもしれないです。
4. 解決策が上手くいく理由
理由がわかりません。
自分の中で理解ができたら更新します。