簡體   English   中英

Configparser 偶爾返回空結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM