我可以检测我的代码是在cPython还是Jython上运行?

时间:2009-07-09 12:19:34

标签: python django jython

我正在研究一个稍后将部署在servlet容器中的小型django项目。但是如果我使用cPython而不是Jython,开发会快得多。所以我想要做的是测试我的代码是否在我的settiings.py中的cPython或Jython上运行,所以我可以告诉它使用适当的db驱动程序(postgresql_psycopg2或doj.backends.zxjdbc.postgresql)。有一种简单的方法可以做到这一点吗?

5 个答案:

答案 0 :(得分:22)

最明确的方式是:

  
    
      

导入平台

             

platform.python_implementation()

    
  

'CPython的'

默认情况下,大多数时候底层解释器只是CPython,也可以说是最有效的解释器:)

答案 1 :(得分:20)

孙全强指出

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

对于C的C实现返回'CPython',为IronPython返回'IronPython',并为Jython返回'Jython'。显然,这个在2.6以下不向后兼容,但将向前兼容。

答案 2 :(得分:15)

如果您正在运行Jython

import platform
platform.system()  

返回'Java' here has some discussion,希望这有帮助。

答案 3 :(得分:3)

每个不同的环境都有唯一的settings.py.

您的开发settings.py不应该是您的质量保证/测试或生产settings.py。

我们做的是这个。

我们有一个“master”settings.py,其中包含已安装的应用和其他没有太大变化的项目。

我们有特定于环境的文件,其名称为settings_dev_win32.pysettings_qa_linux2.py 'settings_co_linux2.py`等

这些特定于环境的设置中的每一个都会导入“主”设置,然后覆盖数据库驱动程序等内容。由于每个设置文件对于环境都是唯一的,因此没有if语句,也没有检测到我们正在运行的环境。

生产(在Apache中,使用mod_wsgi和mysql)使用settings_prod_linux2.py文件而不使用其他文件。

开发(在Windows中使用sqlite)使用settings_dev_win32.py文件。

答案 4 :(得分:0)

在Python 3.3及更高版本中,您可以使用sys.implementation并查看;WITH CTEContacts AS ( SELECT DISTINCT ContactEmail, ContactActive FROM Contacts ) SELECT ContactEmail, ContactActive, ISNULL(STUFF((SELECT DISTINCT ', ' + CAST(Contacts.CompanyId AS NVARCHAR(3)) FROM Contacts WHERE Contacts.ContactEmail = CTEContacts.ContactEmail FOR xml PATH ('')), 1, 2, ''), '') AS CompanyId, ISNULL(STUFF((SELECT DISTINCT ', ' + CAST([Services].ServiceName AS NVARCHAR(50)) FROM [Services] JOIN Companies ON [Services].CompanyId = Companies.CompanyId JOIN Contacts ON Contacts.ContactEmail = CTEContacts.ContactEmail AND Contacts.CompanyId = Companies.CompanyId WHERE Contacts.ContactEmail = CTEContacts.ContactEmail FOR xml PATH ('')), 1, 2, ''), '') AS ServiceName FROM CTEContacts ORDER BY CTEContacts.ContactEmail 属性。