[英]Configparser Occasionally Returns Empty Result
我正在使用 Python configparser 從 ini 文件中讀取配置。 95% 的時間,它都能完美運行。 如果不對 ini 文件進行任何更改(例如,在回歸測試中),configparser 將開始返回空結果,然后在搜索嵌套配置時當然會出現關鍵錯誤。
這表明它不是 ini 文件的問題,因為它沒有改變,而且它偶爾會發生。 一旦問題發生,它會繼續發生在對配置解析器的所有調用中,直到我終止程序並重新運行它。
我正在閱讀這樣的配置:
try:
path = os.path.dirname(os.path.realpath(__file__))
kml_ini = '/'.join([path, 'kml.ini'])
config = configparser.ConfigParser()
config.read(kml_ini)
db_conn_returnable = config['database']['db_connection'].strip()
except Exception as e:
print(e)
traceback.print_exc(file=sys.stdout)
pprint.pprint(config.sections())
pprint.pprint({section: dict(config.items(section)) for section in config.sections()})
我收到錯誤:文件“/home/sahmed/anaconda3/envs/kml/lib/python3.6/configparser.py”,第 959 行,在getitem KeyError : 'database'
我的 ini 文件如下所示:
[api]
server_debug=False
log_level=info
n_workers=10
[database]
db_connection=http://1.1.1.1:9191
user=admin
pass=whateverman
[cluster]
default_workers=3
我最初的想法是一個線程問題,因為我有 8 個線程不斷地訪問這個配置文件(雖然它沒有意義......我們只是在閱讀)所以我什至在讀取時放置了一個緊固件塊,仍然沒有運氣。 什么可能導致這種情況?
我可以用您提供的代碼復制問題的唯一方法是,如果我在代碼期間強行更改了工作目錄。
我把這個放在一起來測試這個問題:
from time import sleep
import configparser
import os
def readINI():
try:
path = os.path.dirname(os.path.realpath(__file__))
ini = '/'.join([path, "test.ini"])
config = configparser.ConfigParser()
config.read(ini)
string = config["things"]["abc"]
print(string)
except Exception as e:
print("Error: {}".format(e))
count = 0
while True:
count +=1
readINI()
sleep(1)
if count % 3 == 0:
os.chdir("..")
elif count > 1 and count % 3 == 1:
os.chdir("./TestFolder")
test.ini
非常簡單,它只包含兩行:
[things]
abc=123
我將這兩個文件放在同一個文件夾中,並在“根”文件夾和包含文件的 TestFolder 之間來回移動。 如果您raise
異常而不是僅僅打印它,那么您將收到相同的錯誤消息。
請確認您在代碼執行期間沒有意外更改工作目錄,並查看這是否確實是問題的原因。
我已經解決了這個問題。 Python 記錄器提取了太多的文件描述符,耗盡了最大限制(在經常調用的 function 中有一個 getLogger(),不是全局的)——所以整個 ZA7F5F35426B9232411FC9231B 進程無法打開配置文件。
這里的一般答案是 ConfigParser 當然會暴露於整體系統問題,它可能無法讀取它之前可以讀取的文件。 不是因為文件本身,而是因為達到了整體系統限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.