确定程序是使用 "setup.py develop" 安装的

Determine program was installed using "setup.py develop"

我正在开发 Gtk 应用程序,我想同时使用系统范围内的已安装版本和 运行 不同的开发版本。

应用程序无法启动两次,因为 Gtk.Application 将尝试连接到同一 DBus 总线并拒绝启动两次。因此我的想法是判断我是否在"development mode",i。 e.该程序是否已使用 ./setup.py develop 安装。

我怎样才能做到这一点?或者是否有另一种更通用的方法来区分程序的开发版本和安装版本?我宁愿避免在开发范围之外无用的特殊 --develop 选项或类似选项。

由于 setuptools 的设计方式,开发模式只是一个透明的 .egg-link 对象,所以在内部实际上不可能确定包是否作为 [=15] 加载=](即开发模式;相关code here and see how it just recursively invoke find_distributions which would in turn call this method again (through the internal import finder framework) before generating the metadata object)。

因此,您可以改为为每个应用程序版本创建不同的 DBus 总线。通常开发你的版本号是不同的,可以通过pkg_resources API.

获取版本号
>>> pkg_resources.get_distribution('setuptools').version
'18.2'

您还可以使用它来生成写入包的 egg-info 的自定义元数据,并且通过它,您的包可以声明自定义项,可以说自定义 Dbus 总线的总线名称是使用,但这将需要更多的工作来设置。至少,你可以声明一个 setup.cfg 来标记一个 build

[egg_info]
tag_build = dev

Re运行 setup.py develop 并且版本号将包含一个 dev 后缀,它将显示在 pkg_resources.get_distribution 返回的版本字符串中的包名称上。这不是您想要的,但它可能允许同时执行您的应用程序的多个版本,而不管它们安装在何处或如何安装。考虑可能使用 virtualenvs 的用户在本地安装多个应用程序并希望同时 运行 它们,在这种情况下,您可能希望将其基于安装位置的哈希值:

>>> pkg_resources.get_distribution('setuptools').location
'/tmp/.env3/lib/python3.5/site-packages'

当然,如果包在 site-packages 中找到,它可能是作为一个正确的 install 完成的,但是 API 中没有任何东西可以告诉你这一点。