我正在尝试在运行时创建的build / lib目录中包含一个python文件
python setup.py install
尤其是,我想包含一个简单的配置文件('definitions.py'),该文件定义了ROOT_DIR变量,然后该变量将由子包使用。 “ definitions.py”文件包含:
import os
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
我的目标是让每个子包('config.py')内的配置文件调用ROOT_DIR来构建自己的绝对路径:
from definitions import ROOT_DIR
PACKAGE_DIR = os.path.join(ROOT_DIR, 'package1/')
这个想法是从以下stackoverflow答案中得出的:https://stackoverflow.com/a/25389715。
但是,运行“ setup.py install”时,此“ definitions.py”文件永远不会显示在构建目录中。
这是项目的目录结构:
project | ├── setup.py | ├── definitions.py | ├── package1 | ├── __init__.py | ├── config.py | └── ... | ├── package2 | ├── __init__.py | └── ... └── ...
我的多次尝试都失败了(尝试,例如https://stackoverflow.com/a/11848281中提供的建议)。据我所知,这是因为definitions.py位于项目结构的顶层(缺少__init__.py文件)。
我已经尝试过:
1)...使用setuptools.setup()中的'package-data'变量
package_data={'package': ['./definitions.py']}
,但是definitions.py不会显示在内部版本
中(我认为是因为definitions.py不在具有__init__.py的“包”中)。
2)...使用MANIFEST.in文件,但这也不起作用
(我认为是因为MANIFEST不适用于.py文件?)
我的问题
是否可以在构建目录中包含definitions.py?
或者,是否可以通过更好的方法来访问从顶层目录为多个子软件包构建的绝对路径?
答案 0 :(得分:1)
如果您正在寻找一种方法来访问已安装模块中的非python数据文件(如您所链接的问题)(顶级软件包中的配置文件,应该可以在子软件包中访问),请使用{ {1}}机械,而不是发明自定义路径分辨率。项目结构示例:
pkg_resources
project
├── setup.py
└── root
├── __init__.py
├── config.txt
├── sub1
│ └── __init__.py
└── sub2
└── __init__.py
:
setup.py
wim在评论中指出,importlib.resources
现在有一个反向端口(仅在Python 3.7及更高版本中可用)-importlib_resources
,它提供了一种现代的资源机制利用from setuptools import setup
setup(
name='myproj',
...,
packages=['root', 'root.sub1', 'root.sub2'], # or setuptools.find_packages()
package_data={'root': ['config.txt']}
)
:
pathlib
使用pkg_resources
,您可以从软件包的任何位置访问# access the filepath
importlib_resources.path('root', 'config.txt')
# access the contents as string
importlib_resources.read_text('root', 'config.txt')
# access the contents as file-like object
importlib_resources.open_binary('root', 'config.txt')
,而不必执行任何路径解析:
root/config.txt
等