【问题标题】:What are some strategies to write python code that works in CPython, Jython and IronPython编写适用于 CPython、Jython 和 IronPython 的 Python 代码的一些策略是什么
【发布时间】:2010-09-08 09:17:57
【问题描述】:

尝试同时针对其中两个环境,我可以肯定地说,如果您必须使用数据库等,您最终必须为该环境编写唯一的代码。你有很好的方法来处理这种情况吗?

【问题讨论】:

    标签: python ironpython jython cpython


    【解决方案1】:

    如果您确实发现需要为环境编写独特的代码,请使用 pythons

    import mymodule_jython as mymodule
    
    import mymodule_cpython as mymodule
    

    将这些东西放在一个简单的模块中(''module_importer''?),然后像这样编写代码:

    from module_importer import mymodule
    

    这样,您只需在每个平台上更改module_importer.py

    【讨论】:

    • 那么大人,有没有办法让module_importer根据一些环境变量等动态导入正确的变量。
    • 对不起,我在这里画一个空白。不过,这将是一个很好的 SO 问题:“如何动态确定我们正在运行 Jython、CPython 还是 IronPython?”。然后,你可以在 ifs 中做到这一点......
    • Python的模块os可以作为例子。它提供操作系统例程,例如os.unlinkos.rename 等,具体取决于您使用的系统。
    【解决方案2】:

    @Daren Thomas:我同意,但您应该使用 platform module 来确定您正在运行的解释器。

    【讨论】:

    • 据我所知,IronPython (2.0.1) 中没有“平台”。 'os' 也不是。
    【解决方案3】:

    我为 CPython 和 IronPython 编写代码,但tip 也应该适用于 Jython。

    基本上,我将所有特定于平台的代码编写在单独的模块/包中,然后根据我正在运行的平台导入适当的代码。 (见上面cdleary的评论)

    当涉及到 SQLite 实现之间的差异以及您正在实现任何 GUI 代码时,这一点尤其重要。

    【讨论】:

      【解决方案4】:

      IMO 第一件事:关注线程安全。 CPython 的 GIL 使编写线程安全代码变得容易,因为一次只有一个线程可以访问解释器。 IronPython 和 Jython 的手感稍差一些。

      【讨论】:

        【解决方案5】:

        我很确定您已经知道这一点,但不幸的是 Jython can't load c extension modules.

        【讨论】:

          【解决方案6】:

          这里有两个主要问题...

          首先,据我所知,只有 CPython 具有 RAII - 您必须关闭自己在 Jython、Ironpython 等中的资源。

          其次,如前所述,是线程安全。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-26
            • 1970-01-01
            • 2020-02-23
            相关资源
            最近更新 更多