2

モジュールで使用される構成ファイルを使用してアプリケーションを作成していConfigParserます。この設定ファイルは、実際には に保存されてい%APPDATA%/PressLogReader/PressLogReader.confます。

しかし、問題は、%APPDATA%/PressLogReader(および構成ファイル) がアプリケーションの最初の起動時に存在しないため、アプリがクラッシュすることです。

アプリケーションのインストール時にフォルダを作成できるかもしれませんが%APPDATA%/PressLogReader、それは悪い解決策だと思います。

より良い解決策はありますか?

私のConfクラスがあります:

APP_DIRNAME = 'PressLogReader'

if 'APPDATA' in os.environ:
        APP_CONFIG_PATH = os.path.join(os.environ['APPDATA'], APP_DIRNAME)
elif 'XDG_CONFIG_HOME' in os.environ:
    APP_CONFIG_PATH = os.path.join(os.environ['XDG_CONFIG_HOME'], APP_DIRNAME)
else:
    APP_CONFIG_PATH = os.path.join(os.environ['HOME'], '.config', APP_DIRNAME)

APP_CONF_FILE = os.path.join(APP_CONFIG_PATH, 'PressLogReader.conf')

class Config :

    def __init__(self) :
        self.parser = ConfigParser.ConfigParser()

        params = {
            'logFile': 'C:\Program Files\syslog\log\messages',
            'filterByIP': False,
            'IpFilter': ''
        }

        if not os.access(APP_CONF_FILE, os.F_OK | os.W_OK) :
            self.parser.add_section('general')
            for arg in params:
                self.parser.set('general', arg, params[arg])
            self.write()

        self.parser.read(APP_CONF_FILE)
        self.getLogFile()
        self.getFilterByIp()
        self.getIpFilter()

    def write(self) :
        with open(APP_CONF_FILE, 'wb') as conf_file:
            self.parser.write(conf_file)

    def getLogFile(self) :
        try :
            self.log_file = self.parser.get('general', 'logFile')
        except ConfigParser.NoSectionError :
            self.parser.add_section('general')
            self.parser.set('general', 'logFile', params['logFile'])
        except ConfigParser.NoOptionError :
            self.parser.set('general', 'logFile', params['logFile'])
        finally :
            self.log_file = params['logFile']

    def getFilterByIp(self) :
        try :
            self.filter_by_ip = self.parser.getboolean('general', 'filterByIP')
        except ConfigParser.NoSectionError :
            self.parser.add_section('general')
            self.parser.set('general', 'filterByIP', params['filterByIP'])
        except ConfigParser.NoOptionError :
            self.parser.set('general', 'filterByIP', params['filterByIP'])
        finally :
            self.filter_by_ip = params['filterByIP']

    def getIpFilter(self) :
        try :
            self.ip_filter = self.parser.get('general', 'IpFilter')
        except ConfigParser.NoSectionError :
            self.parser.add_section('general')
            self.parser.set('general', 'IpFilter', params['IpFilter'])
        except ConfigParser.NoOptionError :
            self.parser.set('general', 'IpFilter', params['IpFilter'])
        finally :
            self.ip_filter = params['IpFilter']
4

1 に答える 1

2

このスニペットはPressLogReader、キーに関連付けられている os.environ のフォルダーにファイルが存在するかどうかを確認しAPPDATAます。

APP_DIRNAME = 'PressLogReader'

if not os.path.exists(os.path.join(os.environ['APPDATA'],APP_DIRNAME)):
    os.mkdir(os.path.join(os.environ['APPDATA'],APP_DIRNAME))

必要に応じて、新しいフォルダーを作成する前に、構成ファイルが配置されている可能性のある各場所をチェックするように、それを作り直すことで拡張できます。ソリューションの要点は同じなので、演習として読者に任せます。

ところで、これは私たちの構成ファイルです。複数の場所にあることを心配する必要があるのはなぜですか? 別の場所に配置する必要があるレガシー コードはありますか? それとも、おそらくクロス プラットフォーム対応のためですか?

編集:

os.path.exists(file_path)システム上にファイルが存在するかどうかを確認するために使用することもできます。したがって、チェックするのではなく、チェックする必要がある各ディレクトリをチェックインすることもできますos.path.exists(os.path.join(os.environ['APPDATA'], APP_DIRNAME))os.path.exists(os.path.join(os.environ['APPDATA'], APP_DIRNAME, 'PressLogReader.conf'))

于 2012-11-27T13:30:21.727 に答える