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

时间:2016-09-17 13:32:23

标签: python setuptools gtk3

我正在开发一个Gtk应用程序,并希望使用系统范围的已安装版本并同时运行不同的开发版本。

应用程序无法启动两次,因为Gtk.Application将尝试连接到同一个DBus总线并拒绝启动两次。因此,我的想法是确定我是否处于"开发模式",i。即该程序是否已使用./setup.py develop安装。

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

1 个答案:

答案 0 :(得分:2)

由于setuptools的设计方式,开发模式只是一个透明的.egg-link对象,所以在内部实际上无法确定包是否作为egg-link加载(即开发模式;相关的code here,看看它是如何递归调用find_distributions的,而>>> pkg_resources.get_distribution('setuptools').version '18.2' 之后又会再次调用此方法(通过内部导入查找器框架)。

因此,您可以做的是为每个版本的应用程序创建一个独特的DBus总线。通常,对于开发,您的版本号不同,可以通过generating the metadata object获取版本号。

setup.cfg

您还可以使用它来生成写入包的egg-info的自定义元数据,并且通过该包可以声明自定义项,可以说自定义要使用的Dbus总线的总线名称,但这需要更多的工作来设置。至少,您可以声明标记构建的[egg_info] tag_build = dev

setup.py develop

再次重新运行dev,版本号将包含pkg_resources.get_distribution后缀,该后缀将显示在您的包名称上由>>> pkg_resources.get_distribution('setuptools').location '/tmp/.env3/lib/python3.5/site-packages' 返回的版本字符串中。这不是您正在寻找的,但它可能允许您的应用程序的多个版本同时执行,无论它们在何处安装或如何安装。考虑可能使用virtualenvs的用户有多个本地安装的应用程序并希望同时运行它们,在这种情况下,您可能希望将其基于安装位置的哈希值:

site-packages

当然,如果在install内找到该包,则可能是<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^blog/([a-zA-Z0-9-/]+)$ /blog/post.php?s=$1 [L] </IfModule> ,但API中没有任何内容可以告诉您这一点。