Python "myfirst.py"无法导入同一包"test"中的"mySecond.py
我的主模块是用'execFile'加载的,然后我想导入一个.py模块,这个模块和我的Runner Java类在同一个包里,还是主.py模块。
不过我还没成功。我的情况是这样的:
My package structure:
/
/test/
/test/Runner.java
/test/myfirst.py
/test/mySecond.py
/test/__init__.py
In Runner.java:
InputStream mPython = getClass().getClassLoader().getResourceAsStream("test/myFirst.py" );
PythonInterpreter mInterp = new PythonInterpreter();
mInterp.execfile( mPython );
In myfirst.py
import sys
print sys.path
import mySecond
mySecond.hello()
In mySecond.py
def hello():
print "hi"
我尝试了各种方法,比如用测试的偏移量等等,但都没有成功。
下面是我在netbeans7 Java项目中运行'debug'时的输出。我想显示一下sys.path,也许这能帮助找到解决办法。
debug:
['D:\\....\\ext\\Lib', '__classpath__', '__pyclasspath__/']
Exception in thread "main" Traceback (most recent call last):
File "<iostream>", line 3, in <module>
ImportError: No module named mySecond
Java Result: 1
BUILD SUCCESSFUL (total time: 4 seconds)
我猜这可能是因为.py文件不在磁盘上,而是需要从我的Java类路径中加载?欢迎任何想法。
更新:
看起来我遇到了一个更普遍的问题。连'import os'都失败了。我的路径设置是错的。指向lib目录似乎解决了这个问题;
PySystemState mPyState = new PySystemState();
mPyState.path.insert(0,new PyString("C:\\jython2.5.1\\Lib"));
PythonInterpreter mInterp = new PythonInterpreter( null, mPyState );
我觉得这引出了一个问题;
我该如何在我的应用程序中嵌入jython,而不需要在我的硬盘上安装jython251(因此也不需要嵌入c:/jython251/lib目录)?
我找到了一些关于Jython导入工作原理的好资料,在这里。
2 个回答
1
听起来Python的工作目录会是位于test
文件夹上面的那个文件夹,所以你需要使用完整的模块名称(test.mySecond
)。另外,你还需要把test
变成一个Python模块。要做到这一点,只需在test
文件夹里添加一个名为__init__.py
的文件(这个文件可以是空的)。
2
这是针对你更新的一个回答。你可以使用一个独立的 Jython.jar 文件,这个文件里面包含了所需的库。你可以通过以独立模式安装 Jython 来获取这个 jar 文件,或者直接复制标准 Jython jar 文件根目录下的 lib 文件夹。关于这方面的更多信息,可以参考这个链接:Jython 脚本分发常见问题