configparser.NoOptionError(option, section)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fredvonfat
User
Beiträge: 51
Registriert: Mittwoch 12. September 2018, 10:00
Wohnort: Berlin

Hallo zusammen,

gegeben:
- Windows Server2016
- Python 3.7.4
- configparser per pip installiert

*.cfg:

Code: Alles auswählen

[DEFAULT]
driver = {SQL SERVER}
server = ip-Adresse
database = DB
Trusted_Connection = yes

Auszug aus dem Script *.py:
[code]
import configparser

CONFIG_FILE_PATH = '\\Server\c$\scripts'
CONFIG_FILE = os.path.join(CONFIG_FILE_PATH, '*.cfg')
config = configparser.ConfigParser()
config.read(CONFIG_FILE)
server = config.get('DEFAULT', 'server')
database = config.get('DEFAULT', 'database')
Popwershell Ausgabe:

PS C:\scripts> & "C:/Program Files/Python37/python.exe" c:/scripts/F1_log_to_sql_win_esi1.py
c:/scripts/F1_log_to_sql_win_esi1.py:21: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
import pymssql
Traceback (most recent call last):
File "C:\Program Files\Python37\lib\configparser.py", line 788, in get
value = d[option]
File "C:\Program Files\Python37\lib\collections\__init__.py", line 916, in __getitem__
return self.__missing__(key) # support subclasses that define __missing__
File "C:\Program Files\Python37\lib\collections\__init__.py", line 908, in __missing__
raise KeyError(key)
KeyError: 'server'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "c:/scripts/F1_log_to_sql_win_esi1.py", line 38, in <module>
server = config.get('DEFAULT', 'server')
File "C:\Program Files\Python37\lib\configparser.py", line 791, in get
raise NoOptionError(option, section)
configparser.NoOptionError: No option 'server' in section: 'DEFAULT'[/code]

Das Script hatte unter Linux und auf einem w10 Rechner funktioniert.
Jetzt auf dem Server gibt es die Fehlermeldung.

Was übersehe ich hier bzw. wo muss ich nachschauen um die Funktion hinzubekommen?

Danke schon mal im Voraus
fredvonfat
User
Beiträge: 51
Registriert: Mittwoch 12. September 2018, 10:00
Wohnort: Berlin

danke für eure Zeit, der Pfad zur CFG war unglücklich, jetzt geht es.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fredvonfat: '*.cfg' wird hier als Dateiname verwendet — heisst die Datei *tatsächlich* so?

Die `read()`-Methode ignoriert Probleme beim lesen einfach, also zum Beispiel wenn es die Datei nicht gibt, und gibt eine Liste mit den erfolgreich gelesenen Dateinamen zurück. Steht aber auch alles laut und deutlich in der Dokumentation.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fredvonfat
User
Beiträge: 51
Registriert: Mittwoch 12. September 2018, 10:00
Wohnort: Berlin

@_blackjack_
nein, die Datei heißt so nicht, der * fungiert hier als beliebige Zeichenfolge, da ich meine, das der tatsächliche Name nichts zur Sache tut.

Ich habe jetzt statt dem UNC-Pfad, den laufwerksbuchstaben angegeben und schon funktioniert das.

Allerdings stehe ich beim verstehen deines Hinweises ein wenig auf dem Schlauch.
Mir sagt die Fehlerausgabe, dass keine Option, "server" in der Sektion [default] gefunden wurde.

Das erweckt in mir 2 mögliche Zustände:
1. Das cfg-file wird nicht gefunden
und
2. Das cfg-file wird nicht richtig gelesen.

Punkt 1 hielt ich für unwahrscheinlich und habe eher Punkt 2 untersucht.

Darf ich Deinen Hinweis so, verstehen, dass du Punkt 1 für wahrscheinlicher hieltest, als Punkt 2?
Und die Files, die read() auflistet, sind, "c:/scripts/F1_log_to_sql_win_esi1.py" und "C:\Program Files\Python37\lib\configparser.py" ?

Wenn Punkt 2 zutreffen würde, würde read() dann das cfg-File ebenfalls auflisten?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fredvonfat: Es werden alle `OSError` beim einlesen ”ignoriert”, das heisst wenn so etwas auftritt ist der Dateiname am Ende nicht im Ergebnis. Das kann übrigens auch bedeuten, dass das *während* des einlesens passiert ist, also schon Teile der Datei in das `ConfigParser`-Objekt eingetragen wurden!
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
fredvonfat
User
Beiträge: 51
Registriert: Mittwoch 12. September 2018, 10:00
Wohnort: Berlin

Verstehe, wie kann ich beim debuggen sicherstellen, dass die Datei gefunden wird, aber der Fehler während des einlesens auftritt?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Falls mit „der Fehler“ ein `OSError` gemeint ist: gar nicht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten