获取安装前Python文件的路径



我有一个包含c++二进制文件和python脚本的项目,它的设置应该使用setuptools安装。其中一个python文件打算同时用作脚本"python3 script_name.py params它的主要功能是在其他python项目from script_name import function中使用。主要函数调用在安装之前位于已知相对位置的二进制文件(期望用户调用pip install project_folder)。因此,为了调用二进制文件,我需要得到这个文件的位置(预安装)

为了得到这个,我使用了像

这样的字符
Path(__file__).resolve().parent

但是,由于安装将文件移动到另一个文件夹,如~/.local/...,因此在安装后导入时不起作用。

是否有办法获得原始文件路径,或使安装保存该路径的地方?

编辑:在@sinoroc的建议之后,我尝试通过在构建文件夹中放入__init__.py并放入

来包括二进制文件作为资源。
from importlib.resources import files
import build
binary = files(build).joinpath("binary")

在主初始化。之后,package.binary仍然给我.local/lib的路径,binary.is_file()仍然返回False

from importlib_resources import files
GenerateHistograms = files("build").joinpath("GenerateHistograms")

给出了相同的结果

由于正在安装包,因此还需要在安装中包含c++二进制文件。你不能有一个混合的设置。我建议这样做。

在你的setup.py:

from setuptools import setup, find_packages
setup(
name="mypkg",
packages=find_packages(exclude=["tests"]),
package_data={
"mypkg": [
"binary",  # relative path to your package directory
]
},
include_package_data=True,
)

然后在你的模块使用pkg_resources:

from pathlib import Path
from pkg_resources import resource_filename
# "binary" is whatever relative path you put in package_data
path_to_binary = Path(resource_filename("mypkg", "binary"))

pkg_resources应由setuptools拉入。

编辑:上面的食谱可能有点过时了;正如@sinoroc所建议的,使用importlib.resources代替pkg_resources可能是现代的等效。

所以最后我用@sinroc的方法解决了这个问题

在setup . py

package_data={'package':['build/*']}
include_package_data=True

和主节点__init.py__:

from importlib.resources import files
binary = files("package.build").joinpath("binary")

输入from package import binary来获取路径

编辑:看起来有人在我完成之前就指出了我的错误^^

最新更新