![](/img/trans.png)
[英]Best way to find the location of a config file based from launching directory?
[英]Config file location on Windows / Create directory in %APPDATA%
我正在編寫帶有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']
此代碼段將檢查os.environ中與鍵APPDATA
關聯的文件夾中是否存在PressLogReader
文件:
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'))
中的每個目錄都需要檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.