在 python 的虚拟环境中安装 pip 后如何访问资源文件?
how to access resource files after pip install in virtual env in python?
假设我有这个项目结构:
src
|my_package
__init__.py
|utils
__init__.py
util.py
|resources
__init__.py
my_resource.yml
在util.py中,我有这段代码需要资源文件才能工作:
import yaml
import importlib.resources
from my_package import resources
class Util:
def merge_settings(self, settings: dict)->dict:
with importlib.resources.path(resources, 'my_resource.yml') as p:
with open(p) as file:
default_settings = yaml.safe_load(file)
在我的开发环境中一切正常。
然后我用我的 setup.py 文件用这段代码制作了一个轮子:
import setuptools
import glob
resource_folder = 'my_package/resources'
setuptools.setup(
name="my_package",
version="0.3",
packages=setuptools.find_packages(),
data_files=[(resource_folder, glob.glob(resource_folder+r'/*.yml'))]
然后我创建一个轮子:
python .\setup.py bdist_wheel
我最终安装它用于另一个项目,使用名称为 my_env:
的虚拟环境
(my_env) D:\dev pip install my_package-0.3-py3-none-any.whl
但由于这一行,我的代码不再是 运行:
importlib.resources.path(resources, 'my_resource.yml')
原因在浏览my_env文件夹时找到,my_resource.yml不再在my_package中。
my_env
|my_package
|resources
my_resource.yml
|Lib
|site-packages
|my_package
|resources
__init__.py
但是这个位置对于轻松修改这个文件可能非常有用...我如何在我的开发环境中同时处理正确的资源调用以及在 pip 安装后使用它?我希望在需要时始终可以访问 yml 文件进行编辑,即使在 pip 安装之后...
谢谢你的帮助
您的 data_files
指定错误并且不是您想要的设置(它用于非包数据)。 data_files
中的键是从前缀的根开始放置的(假设您将包安装到 ./venv
而不是以 ./venv/lib/python#.#/site-packages/my_package/resources/...
结尾的数据,它们将以 venv/my_package/resources
-- 绝对不是你想要的!)。
您想要的实际设置是 package_data
:
package_data={
'my_package.resources': '*.yml',
},
映射从带点的包名称映射到 glob,并将其放置在站点包中
无需使用 MANIFEST.in
等,因为这些文件会自动包含在您的包中
有关这方面的更多信息,我 made a video on the subject
假设我有这个项目结构:
src
|my_package
__init__.py
|utils
__init__.py
util.py
|resources
__init__.py
my_resource.yml
在util.py中,我有这段代码需要资源文件才能工作:
import yaml
import importlib.resources
from my_package import resources
class Util:
def merge_settings(self, settings: dict)->dict:
with importlib.resources.path(resources, 'my_resource.yml') as p:
with open(p) as file:
default_settings = yaml.safe_load(file)
在我的开发环境中一切正常。
然后我用我的 setup.py 文件用这段代码制作了一个轮子:
import setuptools
import glob
resource_folder = 'my_package/resources'
setuptools.setup(
name="my_package",
version="0.3",
packages=setuptools.find_packages(),
data_files=[(resource_folder, glob.glob(resource_folder+r'/*.yml'))]
然后我创建一个轮子:
python .\setup.py bdist_wheel
我最终安装它用于另一个项目,使用名称为 my_env:
的虚拟环境(my_env) D:\dev pip install my_package-0.3-py3-none-any.whl
但由于这一行,我的代码不再是 运行:
importlib.resources.path(resources, 'my_resource.yml')
原因在浏览my_env文件夹时找到,my_resource.yml不再在my_package中。
my_env
|my_package
|resources
my_resource.yml
|Lib
|site-packages
|my_package
|resources
__init__.py
但是这个位置对于轻松修改这个文件可能非常有用...我如何在我的开发环境中同时处理正确的资源调用以及在 pip 安装后使用它?我希望在需要时始终可以访问 yml 文件进行编辑,即使在 pip 安装之后...
谢谢你的帮助
您的 data_files
指定错误并且不是您想要的设置(它用于非包数据)。 data_files
中的键是从前缀的根开始放置的(假设您将包安装到 ./venv
而不是以 ./venv/lib/python#.#/site-packages/my_package/resources/...
结尾的数据,它们将以 venv/my_package/resources
-- 绝对不是你想要的!)。
您想要的实际设置是 package_data
:
package_data={
'my_package.resources': '*.yml',
},
映射从带点的包名称映射到 glob,并将其放置在站点包中
无需使用 MANIFEST.in
等,因为这些文件会自动包含在您的包中
有关这方面的更多信息,我 made a video on the subject