pathlib 绝对路径与配置解析器行为不当
pathlib absolute path misbehaving with config parser
我有一个以下 python3 脚本,它使用 config 函数从脚本所在目录中的 txt 文件加载数据。
我已经实现了 configparser 模块来提取数据,并实现了 pathlib 模块来设置该文件的绝对路径
from pathlib import Path
try:
import ConfigParser as configparser
except:
import configparser
def config():
parser = configparser.ConfigParser()
config_file = Path('config.txt').resolve()
parser.read(config_file)
return parser
然后我将它作为参数传递给下一个方法,然后从
配置文件:
def search_for_country(config):
country_name = config.get("var", "country_name")
config.txt 文件的结构如下:
[var]
country_name = Brazil
问题是:如果我通过终端从同一目录 运行 脚本,一切正常,但最终它打算 运行 作为 cron 作业,如果我尝试从上面的一个目录执行它,它 returns 出现以下错误:
File "test/script.py", line 28, in search_for_country
country_name = config.get("var", "country_name")
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/configparser.py", line 781, in get
d = self._unify_values(section, vars)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/configparser.py", line 1149, in _unify_values
raise NoSectionError(section) from None
configparser.NoSectionError: No section: 'var'
这似乎是说找不到 txt 文件。
到目前为止,我尝试了不同的选项,例如使用 parser.read_file() 而不是 parser.read(),也试过这个:
但是 none 似乎有效。也许有人能想到这个问题的原因?
所以你的问题:
import pathlib
path_own_dir = pathlib.Path(__file__).parent.resolve()
path_conf_file = path_own_dir / 'config.txt'
assert path_conf_file.is_file()
但是为什么首先要将这样的配置存储为文本?
“配置就是代码”- 那么为什么要用文本配置文件来限制自己?
我通常的做法是:
# conf.py
class Conf(object):
def __init__(self):
country_name: str = 'Brazil'
conf=Conf()
# main.py
from .conf import conf
print(conf.county_name)
# override settings in the object
conf.county_name = 'Argentina'
print(conf.county_name)
它有很多优点,比如拥有正确的数据类型,
具有 IDE 提示、避免解析器、动态更改设置等...
我有一个以下 python3 脚本,它使用 config 函数从脚本所在目录中的 txt 文件加载数据。
我已经实现了 configparser 模块来提取数据,并实现了 pathlib 模块来设置该文件的绝对路径
from pathlib import Path
try:
import ConfigParser as configparser
except:
import configparser
def config():
parser = configparser.ConfigParser()
config_file = Path('config.txt').resolve()
parser.read(config_file)
return parser
然后我将它作为参数传递给下一个方法,然后从 配置文件:
def search_for_country(config):
country_name = config.get("var", "country_name")
config.txt 文件的结构如下:
[var]
country_name = Brazil
问题是:如果我通过终端从同一目录 运行 脚本,一切正常,但最终它打算 运行 作为 cron 作业,如果我尝试从上面的一个目录执行它,它 returns 出现以下错误:
File "test/script.py", line 28, in search_for_country
country_name = config.get("var", "country_name")
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/configparser.py", line 781, in get
d = self._unify_values(section, vars)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/configparser.py", line 1149, in _unify_values
raise NoSectionError(section) from None
configparser.NoSectionError: No section: 'var'
这似乎是说找不到 txt 文件。
到目前为止,我尝试了不同的选项,例如使用 parser.read_file() 而不是 parser.read(),也试过这个:
但是 none 似乎有效。也许有人能想到这个问题的原因?
所以你的问题:
import pathlib
path_own_dir = pathlib.Path(__file__).parent.resolve()
path_conf_file = path_own_dir / 'config.txt'
assert path_conf_file.is_file()
但是为什么首先要将这样的配置存储为文本? “配置就是代码”- 那么为什么要用文本配置文件来限制自己?
我通常的做法是:
# conf.py
class Conf(object):
def __init__(self):
country_name: str = 'Brazil'
conf=Conf()
# main.py
from .conf import conf
print(conf.county_name)
# override settings in the object
conf.county_name = 'Argentina'
print(conf.county_name)
它有很多优点,比如拥有正确的数据类型, 具有 IDE 提示、避免解析器、动态更改设置等...