我正在开发一个小型 django 项目,稍后将部署在 servlet 容器中。但是如果我使用 cPython 而不是 Jython,开发会快得多。所以我想做的是在我的 settiings.py 中测试我的代码是否在 cPython 或 Jython 上运行,这样我就可以告诉它使用适当的数据库驱动程序(postgresql_psycopg2 或 doj.backends.zxjdbc.postgresql)。有没有一种简单的方法可以做到这一点?
5 回答
最明确的方法是:
进口平台
platform.python_implementation()
'CPython'
默认情况下,大多数时候底层解释器只是 CPython,这也可以说是最有效的解释器 :)
正如孙强所指出的
import platform
platform.system()
适用于 Jython 2.5,但这不适用于 Jython 2.2(以前的 Jython 版本)。此外,还有一些关于在 Jython 3.x 中为此类调用返回更多操作系统特定细节的讨论。那里没有任何决定,但为了安全地向后和向前兼容,我建议使用:
import sys
sys.platform.startswith('java')
它将为 Jython 返回 True 并在其他任何地方返回 False (实际上在 Jython 2.2 或更早版本中,它为 Jython 返回 1 并在其他任何地方返回 0 ,但这在 if 语句和其他检查中仍然可以正常工作)。这个调用至少在 Jython 2.1 中有效,并且在可预见的未来也有效。
在 Python 2.6 或更高版本(注意 Jython 2.6 尚未发布)中,另一个选项是:
import platform
platform.python_implementation
它为 Python 的 C 实现返回“CPython”,为 IronPython 返回“IronPython”,并将为 Jython 返回“Jython”。显然,这个不向后兼容低于 2.6,但将向前兼容。
对于每个不同的环境,您都会拥有独特的 settings.py。
您的开发 settings.py 不应该是您的 QA/Test 或生产 settings.py。
我们要做的就是这个。
我们有一个“主”settings.py,其中包含已安装的应用程序和其他变化不大的项目。
我们有特定于环境的文件,其名称类似于settings_dev_win32.py
andsettings_qa_linux2.py
和 'settings_co_linux2.py` 等。
这些特定于环境的设置中的每一个都导入“主”设置,然后覆盖诸如 DB 驱动程序之类的东西。由于每个设置文件对于环境都是唯一的,因此没有 if 语句,也无法检测我们在哪个环境中运行。
生产(在 Apache 中,使用 mod_wsgi 和 mysql)使用该settings_prod_linux2.py
文件而不是其他文件。
开发(在 Windows 中使用 sqlite)使用该settings_dev_win32.py
文件。
在 Python 3.3 及更高版本中,您可以使用sys.implementation并查看name
属性。