Bre*_*bel 8 python software-distribution setuptools
我有一个用户环境,其中大多数python包安装在网络共享上,并通过PYTHONPATH环境变量提供.Python本身仍然在本地安装.其中一些软件包需要注册setuptools 入口点.通常,这可以通过运行setup.py包的文件来实现,但由于这些安装在网络位置,因此setup.py永远不会使用本地安装的python运行.
有没有办法注册入口点而不在本地python安装中安装包?
注册插件系统回调的入口点示例
setup(
...
entry_points={
'xx_plugin': ['value = package.module:func'],
}
)
Run Code Online (Sandbox Code Playgroud)
setup.py和入口点创建包装可调用对象的独立脚本console_scripts。gui_scripts该coverage包就是一个很好的例子。为了方便起见,它有一个入口点来创建包装器脚本。setup.py创建控制台脚本的示例片段:
setup(
...
entry_points = {
'console_scripts': [
'script_name = package.module:function'
]
}
)
Run Code Online (Sandbox Code Playgroud)
可以通过 .仅将脚本安装到指定目录setup.py。除非传递参数,否则现有脚本不会被覆盖--force。
python setup.py install_scripts --install-dir /some/alternate/location
Run Code Online (Sandbox Code Playgroud)
对于插件,入口点作为元数据存储在通常与包一起安装的 Egg 中。示例插件入口点:
setup(
...
entry_points = {
'group_name': [
'plugin_name = package.module:function'
]
}
)
Run Code Online (Sandbox Code Playgroud)
可以通过 .仅将包的元数据(包括任何入口点)安装到指定目录setup.py。
python setup.py egg_info --egg-base $PYTHONPATH
Run Code Online (Sandbox Code Playgroud)
如果setup.py无法运行来写入egg元数据,那么完全可以自己编写,因为它只是目录中的文本文件。基于上述入口点的示例元数据:
# $PYTHONPATH/entry_points.egg-info/entry_points.txt
[group_name]
plugin_name = package.module:function
Run Code Online (Sandbox Code Playgroud)
要测试入口点查找:
import pkg_resources as pkg
for entry_point in pkg.iter_entry_points('group_name'):
plugin_name = entry_point.name
plugin_module_name = entry_point.module_name
plugin_callable = entry_point.load()
# do something with plugin
Run Code Online (Sandbox Code Playgroud)