我正在开发一个Gtk应用程序,并希望使用系统范围的已安装版本并同时运行不同的开发版本。
应用程序无法启动两次,因为Gtk.Application
将尝试连接到同一个DBus总线并拒绝启动两次。因此,我的想法是确定我是否处于"开发模式",i。即该程序是否已使用./setup.py develop
安装。
我怎样才能做到这一点?或者是否有另一种更通用的方法来区分开发和安装的程序版本?我宁愿避免使用在开发范围之外无用的特殊--develop
选项等。
答案 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中没有任何内容可以告诉您这一点。