如何在基于Python Poetry的项目中访问数据资源文件?

Pav*_*oka 4 python project-structure python-poetry

理解Python诗歌1

\n

我遇到了一个奇怪的问题。\n一个小应用程序 - 字典,在命令行中工作:

\n
$ lexi\nUsage: lexi word\n\n$ lexi zoo\n\xd0\xb7\xd0\xbe\xd0\xbe\xd0\xbf\xd0\xb0\xd1\x80\xd0\xba\n\n$ lexi qwerty\nThere\'s not word \'qwerty\' is in the lexicon\n
Run Code Online (Sandbox Code Playgroud)\n

项目结构:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 poetry_test\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 data\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lexicon.json        # dictionary file\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lexi.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n
Run Code Online (Sandbox Code Playgroud)\n

词典.py:

\n
#!/usr/bin/env python3\n \nimport sys\nimport json\n \nLEXICON_DB = "poetry_test/data/lexicon.json"\n \n \ndef main():\n    args = sys.argv\n    if len(args) != 2:\n        print("Usage: lexi word")\n        sys.exit(1)\n    \n    word = args[1]\n    lexicon = json.load(open(LEXICON_DB))\n    translation = lexicon.get(word)\n    if translation:\n        print(translation)\n    else:\n        print(f"There\'s not word \'{word}\' is in the lexicon")\n \n \nif __name__ == \'__main__\':\n    main()\n\n
Run Code Online (Sandbox Code Playgroud)\n

如果我使用命令在项目根文件夹中运行

\n
$ poetry run lexi zoo\n
Run Code Online (Sandbox Code Playgroud)\n

它在各方面都工作得很好。

\n

使用命令安装发行版后,系统中的任何地方都可以使用$ python3 -m pip install .该命令lexi,即软件包的安装已成功:

\n
$ lexi\nUsage: lexi word\n\n$ whereis lexi\nlexi: /home/paalso/.local/bin/lexi\n
Run Code Online (Sandbox Code Playgroud)\n

在项目根文件夹中lexi,已经没有poetry run也完全可以正常工作

\n

但是,当我尝试使用参数(要翻译的单词)在系统中的其他位置运行它时,当应该访问数据文件 lexicon.json 时,会发生错误:

\n
$ lexi zoo\nTraceback (most recent call last):\n  File "/home/paalso/.local/bin/lexi", line 8, in <module>\n    sys.exit(main())\n  File "/home/paalso/.local/lib/python3.8/site-packages/poetry_test/lexi.py", line 16, in main\n    lexicon = json.load(open(LEXICON_DB))\nFileNotFoundError: [Errno 2] No such file or directory: \'poetry_test/data/lexicon.json\'\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,数据文件 data/lexicon.json 似乎不可用,即在安装过程中,它似乎没有安装,即它没有随应用程序进入系统。\n如何修复此问题?\n到目前为止我在诗歌文档中没有找到它

\n

git 链接

\n

fin*_*mer 5

访问包的数据文件的首选方法是importlib.resources。还有一个名为importlib-resources 的向后移植。

__init__.py文件放入数据文件夹后,您可以打开文件,如下所示:

lexicon = json.load(importlib.resources.open_text("mypackagename", "data/lexicon.json"))
Run Code Online (Sandbox Code Playgroud)