Jython没有-m
选项,并且使用from .utils import *
引发错误。
解决方案不是使用相对路径
sys.path.insert(0, os.path.dirname(__file__))
from utils import *
由于我需要使用Jython和CPython的代码,我想出了这个命令:
try:
from .utils import *
except Exception: # Jython or Python with python context/context.py invocation
sys.path.insert(0, os.path.dirname(__file__))
from utils import *
但是,Jython似乎没有捕获异常,仍然会生成异常。
File "context/context.py", line 9
SyntaxError: 'import *' not allowed with 'from .'
基于How to know that the interpreter is Jython or CPython in the code?,我尝试了
binary = sys.executable
if binary is None:
sys.path.insert(0, os.path.dirname(__file__))
from utils import *
else:
from .utils import *
我仍然得到SyntaxError
,为什么Jython解释器在它应该这样做的时候继续解析from .utils import *
;我的意思是,这段代码可行。
binary = sys.executable
if binary is None:
sys.path.insert(0, os.path.dirname(__file__))
from utils import *
else:
pass
这是我的Jython信息:
Jython 2.7b1 (default:ac42d59644e9, Feb 9 2013, 15:24:52)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.7.0_51
Type "help", "copyright", "credits" or "license" for more information.
答案 0 :(得分:0)
不知何故,它不喜欢你的相对导入,我正在考虑两种可能的解决方案:
utils
包。utils
包的路径添加到您的PYTHONPATH。答案 1 :(得分:0)
issubclass(SyntaxError, Exception)
说它应该被抓住,事实上,如果你手动举起它就会被抓住:
try:
raise SyntaxError
except Exception:
print('caught it')
打印caught it
。虽然
try:
from . import *
except Exception:
print('nope')
导致:
File "<stdin>", line 2
SyntaxError: 'import *' not allowed with 'from .'
如果您在上面添加了一些代码,那么您会看到它没有被执行,即后一个异常不是运行时。在CPython中也是如此:
import sys
sys.stderr.write("you won't see it\n")
try:
1_ # cause SyntaxError at compile time
except:
print("you won't see it either")
编译期间出现错误。
要解决此问题,您可以尝试使用绝对导入:
from __future__ import absolute_import
from context.utils import * # both Jython and CPython