【发布时间】:2021-06-02 21:44:27
【问题描述】:
我正在尝试帮助 tkdnd 的所有者生成一个轮子并将其分发给 Pypi,以便用户可以使用简单的 pip install TkinterDnD2 简单地安装 tkdnd 扩展。
过去两天我一直在关注这个“挑战”,但到目前为止我自己无法解决它,但我相信对 python 打包和安装过程有深入了解的人可以帮助在短时间内解决它。
目前为了获得这个扩展工作,您需要执行以下步骤(as mentioned here):
- download the compiled tkdnd files 为您的操作系统。现在转到您的 base interpreter 目录/tcl 并将此文件夹复制到下面。例如:
--<python3.9-directory>
--tcl
--tkdnd2.9.2
...
...
注意 - 如果我在导入的 TkinterDnD2 项目的 venv 中创建匹配的 tcl/tkdnd2.9.2 目录,它对我不起作用
- 现在download the python wrapper 并将其添加到您的 venv 站点包目录(或基本解释器无关紧要)。 因此将导入 TkinterDnD2 的 python 项目将如下所示:
--<python-test-project>
--venv
--Lib
--site-packages
--TkinterDnD2
...
...
现在可以成功运行 tkdnd 扩展了。
您可能会说这与安装普通的 python 库不太一样。 这里的问题是额外的 tkdnd2.9.2 文件夹必须位于基本解释器的 tcl 文件夹中。
也许可以在 setup.py 中使用 package_data 和 data_files 来告诉 python 在从轮子安装期间添加这个 tcl 文件,但我不确定。见Packaging and distributing projects
供完整参考。
不完整的 setup.py:
import setuptools
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setuptools.setup(
name="TkinterDnD2",
version="2.9.2",
author="petasis",
description="TkDND is an extension that adds native drag & drop capabilities to the Tk toolkit.",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/petasis/tkdnd",
project_urls={
"Bug Tracker": "https://github.com/petasis/tkdnd/issues",
},
classifiers=[
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
"Operating System :: OS Independent",
],
packages=setuptools.find_packages(),
python_requires=">=2, >=3",
# some extra logic probably belong here
# ...
)
您可以跟踪问题here,其中包括一些额外的讨论。
非常有用的 stackoverflow 问题:
- How to avoid building C library with my python package?
- How to Install and Use TkDnD with Python Tkinter on OSX?
非常有用的指南:
- Packaging and distributing projects
- Packaging Python Projects
- Python Bindings: Calling C or C++ From Python
任何帮助将不胜感激!
【问题讨论】:
-
您是否在启用存根的 Tcl/Tk 端构建扩展包?如果你不是,那将是一个严重的头痛。启用存根(并且最初针对您希望支持的最低 API 版本构建)在运行时设置整个 Tcl 端只需将正确的目录放在
TCLLIBPATH或auto_path上。 (Tkdnd 好像有个non-trivial package index file...) -
其实我不是自己构建的,只是从发行版下载编译好的文件,所以我不知道是否启用了存根。我的问题更多地与如何配置 setup.py 以使用编译文件而不是编译 tcl 文件来构建轮子有关。
-
唉,我对构建 Python 轮子了解不多;我当前的项目只使用它们(因为它的某些部分需要针对嵌入式 ARM 处理器的交叉编译器,这需要与普通代码完全不同的工具链)。但是只要 Tcl 端相对于彼此保持正确——尤其是相对于包索引文件——并且在启用存根的情况下构建,它应该加载到任何可用的地方;否则它可能不需要太多特殊的路径处理。
标签: python tkinter tcl setup.py python-wheel