我正在编写我的第一个 python 包,我想将其上传到 PyPI 上。我基于此构建了我的代码博客文章.
我想将用户设置存储在 config.ini 文件中。在同一包中的单独 python 模块中读取一次(每次运行包时),并将用户设置保存在该模块的全局变量中。稍后将其导入其他模块中。
为了重现错误,我只是在博客文章中描述的模板中编辑了几行代码。 (请参考它,因为重新创建整个有问题的内容需要太多的输入。)
唯一的区别是我的stuff.py
像这样从配置文件中读取:
from ConfigParser import SafeConfigParser
config = SafeConfigParser()
config.read('config.ini')
TEST_KEY = config.get('main', 'test_key')
以下是内容config.ini
(放置在与stuff.py
):
[main]
test_key=value
And my bootstrap.py
只需导入并打印TEST_KEY
from .stuff import TEST_KEY
def main():
print(TEST_KEY)
但是在执行包时,导入失败并出现此错误
Traceback (most recent call last):
File "D:\Coding\bootstrap\bootstrap-runner.py", line 8, in <module>
from bootstrap.bootstrap import main
File "D:\Coding\bootstrap\bootstrap\bootstrap.py", line 11, in <module>
from .stuff import TEST_KEY
File "D:\Coding\bootstrap\bootstrap\stuff.py", line 14, in <module>
TEST_KEY = config.get('main', 'test_key')
File "C:\Python27\Lib\ConfigParser.py", line 607, in get
raise NoSectionError(section)
ConfigParser.NoSectionError: No section: 'main'
进口不断给予ConfigParser.NoSectionError,但是如果你只构建/运行 stuff.py(我使用 sublime3),该模块不会给出错误并打印TEST_KEY
gives value
作为输出。
另外,当我只在目录中使用 3 个文件(config、stuff、main)并仅将 main 作为脚本执行时,这种导入方法确实有效。但我必须像这样导入它
from stuff import TEST_KEY
我只是使用该文章中描述的显式相对导入,但对这些没有足够的理解。我猜错误是由于项目结构和导入造成的,因为运行stuff.py
因为独立脚本不会引发ConfigParser.NoSectionError
.
其他读取配置文件一次然后在其他模块中使用数据的方法也将非常有用。