Python "myfirst.py"无法导入同一包"test"中的"mySecond.py

1 投票
2 回答
641 浏览
提问于 2025-04-16 17:57

我的主模块是用'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 脚本分发常见问题

撰写回答