问题描述
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 .'
基于 , 我试过了
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.
1楼
不知何故,它不喜欢您的相对导入,我在考虑2种可能的解决方案:
-
尝试从项目的根目录导入
utils
包。 -
将
utils
包的路径添加到您的PYTHONPATH。
2楼
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