bazel-contrib / bazel-contrib/rules_python

FYI - python-build-standalone now builds dynamic Tkinter/Tcl/Tk

未关闭
#3,155 4 条评论 1 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Starlark
星标
688
派生
721
平均合并
15 小时 7 分钟
30 天内合并 PR
76

描述

Hi! In today's release (20250808) of python-build-standalone we've split out `_tkinter`, `libtcl`, and `libtk` into their own dynamic libraries (astral-sh/python-build-standalone#676). This should address issues like #2540 where tkinter didn't work right. I'm opening this mostly because we're now generating three new .so files and I don't know if you need to adjust something on your end to pick them up. But also, if you see any issues with the new setup, please let me know, either here or by opening an issue in python-build-standalone.

Details on the implementation, if it's helpful:
* `_tkinter` is now a separate extension module and no longer statically linked into bin/python and libpython (so any user code using `_tkinter` will need to bundle the dynamic library and unpack it at runtime)
* There are separate `libtcl8.6.so` and `libtk8.6.so` (or `.dylib`) libraries inside our `lib` directory.
* On Linux, `bin/python3` has a `DT_RPATH` pointing it at the `lib` directory, so `import _tkinter` finds our copies of libtcl and libtk. Users of `libpython3.x.so` will need to set up rpaths or something on their own. (If it's helpful can add an rpath to `libpython3.x.so`, or tweak the `DT_NEEDED` in `_tkinter` to use `$ORIGIN/../../libtcl8.6.so` etc. (though that trick would only work for gllibc, not musl).
* On macOS, `lib/python3.x/lib-dynload/_tkinter.cpython-3x-darwin.so` has an `LC_RPATH` pointing at `@loader_path/../../`, and the install name of libtcl and the `LC_LOAD_DYLIB` entry in `_tkinter` is `@rpath/libtcl8.6.so.dylib`, and the same for libtk. So if you maintain the `lib/` directory structure you shouldn't need to fiddle with library paths on your own.
* libX11 and friends are now statically linked into `libtk` on Linux. At some point I might make these dynamic libraries and/or attempt to look for the system version.

Also, speaking of changes to dynamic libraries, as of a few months ago, our Linux builds statically link libpython into the interpreter, so you no longer need lib/libpython3.x.so.1 to run bin/python. We still ship libpython for the sake of people embedding Python into a larger program. At some point I want to split this out but I haven't yet figured out how to coordinate that transition.

贡献指南

打开贡献指南

调研方向

首先检查 rules_python 如何使用 python-build-standalone 的布局,尤其是 bin/python3、lib/python3.x/lib-dynload/_tkinter.cpython-3x-darwin.so 和 lib 目录。确认是否包含新的动态库 _tkinter、libtcl8.6 和 libtk8.6,以及 Python 执行和 libpython 嵌入是否都仍然正常工作。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
build-system
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
需要澄清
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。