我有一个包含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
来获取路径
编辑:看起来有人在我完成之前就指出了我的错误^^