我正在尝试使用Python-Daemon模块。它提供守护程序。daemonContext类,以正确地守护脚本。尽管我主要针对Python 2.6+,但我想将向后兼容2.4版。

Python 2.5支持从 未来, ,但是Python 2.4没有这样的设施。我认为我只能捕获有关陈述的任何错误,并手动输入和退出上下文,但我似乎无法抓住所提出的语法。

是否有任何方法可以明确检查解释器版本?以下是我要做的事情的要旨以及我遇到的问题。在现实生活中,我无法控制上下文课程,因此它需要在不弄脏原始课程的情况下工作,即不喜欢 这些想法。

没关系,如果Python 2.4无法运行Python-Daemon;我至少想能够捕获错误并实现后备或其他东西。

感谢您的帮助。

#!/usr/bin/python2.4
from __future__ import with_statement
# with_statement isn't in __future__ in 2.4.
# In interactive mode this raises a SyntaxError.
# During normal execution it doesn't, but I wouldn't be able to catch it
# anyways because __future__ imports must be at the beginning of the file, so
# that point is moot.


class contextable(object):
    def __enter__(self):
        print('Entering context.')
        return None
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Exiting context.')
        return False

def spam():
    print('Within context.')

context = contextable()

try:
    with context: # This raises an uncatchable SyntaxError.
        spam()
except SyntaxError, e: # This is how I would like to work around it.
    context.__enter__()
    try:
        spam()
    finally:
        context.__exit__(None, None, None)
有帮助吗?

解决方案

SyntaxError 由Python编译器诊断为编译时 - 大概是您试图从被编译为同一模块一部分的代码中“捕获”它(例如,这就是您在代码示例中所做的),所以当然它行不通 - 您的“捕获”代码尚未编译(因为编译未成功终止),因此无法捕获任何内容。

您需要确保收集可能具有语法错误的代码 之后 而不是捕捉代码 - 要么将其放在您在该模块中导入的单独模块 try 子句,或在字符串中 compile 使用该名称的内置(您稍后可以执行从该名称) compile 致电,如果成功终止)。

我认为,这两种可能性都不适合您的目的。我怀疑使用两个单独的模块(可能会根据“ do do do this compile”支票进行选择,但是对我来说,一个版本检查听起来更干净)是唯一的“干净”解决方案。

编辑: :以下是微实验测试的方法/除了反对版本检查以外:

$ python2.4 -mtimeit 'try:
  compile("with x: pass", "", "exec")
except SyntaxError: x=1
else: x=2'
100000 loops, best of 3: 10.8 usec per loop
$ python2.6 -mtimeit 'try:
  compile("with x: pass", "", "exec")
except SyntaxError: x=1
else: x=2'
10000 loops, best of 3: 40.5 usec per loop

$ python2.4 -mtimeit -s'import sys' 'if sys.version>="2.5": x=2
else: x=1'
1000000 loops, best of 3: 0.221 usec per loop
$ python2.6 -mtimeit -s'import sys' 'if sys.version>="2.5": x=2
else: x=1'
10000000 loops, best of 3: 0.156 usec per loop

如您所见,我认为清洁器的版本是 10.8 / 0.221, ,在2.4上快了近50倍,并且 40.5 / 0.156, ,快2.6倍。通常(除极少数例外),清洁(即“ Pythonic”)方法将成为Python中更好地优化的方法 - 通常,至少部分原因可能是Python Core开发人员专注于促进和鼓励使用他们喜欢的结构,而不是他们不喜欢的结构。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top