CORBA python 目录树中与导入它们的模块不同级别的文件
CORBA python files on different level in dir tree than modules which imports them
我遵循了 Python 中的 CORBA 开发教程,该教程位于:omniORBpy User’s Guide
在我从给定的 IDL 文件生成 Python 文件后,我注意到包 Example 和 Example__POA 中的 init.py
正在尝试导入文件 echo_example_idl.py
,这被放置在下一层。目录树如下所示:
---Example (module)
|
|------ init.py
|
---Example__POA (module)
|
|------ init.py
|
---echo_example_idl.py
---echo_example.idl
---example_execution.py
来自示例模块的 init.py 的内容:
# DO NOT EDIT THIS FILE!
#
# Python module Example generated by omniidl
import omniORB
omniORB.updateModule("Example")
# ** 1. Stub files contributing to this module
import echo_example_idl
# ** 2. Sub-modules
# ** 3. End
example_execution.py的内容:
#!/usr/bin/env python
import sys
from omniORB import CORBA, PortableServer
import Example, Example__POA
class Echo_i (Example__POA.Echo):
def echoString(self, mesg):
print "echoString() called with message:", mesg
return mesg
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
poa = orb.resolve_initial_references("RootPOA")
ei = Echo_i()
eo = ei._this()
poaManager = poa._get_the_POAManager()
poaManager.activate()
message = "Hello"
result = eo.echoString(message)
print "I said '%s'. The object said '%s'." % (message,result)
我可以成功启动程序。
为什么两个模块的 init.py 中的 import 语句都能正常工作?是因为我 运行 和 example_execution.py 与通过 omniidl 生成的源文件在同一目录中吗?
如果想把执行文件放到程序外应该怎么办
包含源文件的目录(例如,在我想要的一个目录中
拥有所有 CORBA 资源,在另一个我想保留
example_execution.py 文件)。如果我这样做,我会得到一个 ImportError
echo_example_idl.py
我能够解决这个问题。解决方案是在 Python 模块内生成 CORBA 存根和 client/server 模块。这可以通过将适当的标志传递给 omniidl 程序来完成。在我的例子中是:
omniidl -bpython -Wbpackage=example example_echo.idl
感谢我的目录树如下所示(包括执行文件和 IDL 文件本身):
---example (Python module)
|
|------Example (CORBA client module)
|------Example__POA (CORBA server module)
|------echo_example.idl.py
|
---echo_example.idl
---example_execution.py
如果我想使用 CORBA 功能,我只需要在文件顶部添加 import example
。
我遵循了 Python 中的 CORBA 开发教程,该教程位于:omniORBpy User’s Guide
在我从给定的 IDL 文件生成 Python 文件后,我注意到包 Example 和 Example__POA 中的 init.py
正在尝试导入文件 echo_example_idl.py
,这被放置在下一层。目录树如下所示:
---Example (module)
|
|------ init.py
|
---Example__POA (module)
|
|------ init.py
|
---echo_example_idl.py
---echo_example.idl
---example_execution.py
来自示例模块的 init.py 的内容:
# DO NOT EDIT THIS FILE!
#
# Python module Example generated by omniidl
import omniORB
omniORB.updateModule("Example")
# ** 1. Stub files contributing to this module
import echo_example_idl
# ** 2. Sub-modules
# ** 3. End
example_execution.py的内容:
#!/usr/bin/env python
import sys
from omniORB import CORBA, PortableServer
import Example, Example__POA
class Echo_i (Example__POA.Echo):
def echoString(self, mesg):
print "echoString() called with message:", mesg
return mesg
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
poa = orb.resolve_initial_references("RootPOA")
ei = Echo_i()
eo = ei._this()
poaManager = poa._get_the_POAManager()
poaManager.activate()
message = "Hello"
result = eo.echoString(message)
print "I said '%s'. The object said '%s'." % (message,result)
我可以成功启动程序。
为什么两个模块的 init.py 中的 import 语句都能正常工作?是因为我 运行 和 example_execution.py 与通过 omniidl 生成的源文件在同一目录中吗?
如果想把执行文件放到程序外应该怎么办 包含源文件的目录(例如,在我想要的一个目录中 拥有所有 CORBA 资源,在另一个我想保留 example_execution.py 文件)。如果我这样做,我会得到一个 ImportError echo_example_idl.py
我能够解决这个问题。解决方案是在 Python 模块内生成 CORBA 存根和 client/server 模块。这可以通过将适当的标志传递给 omniidl 程序来完成。在我的例子中是:
omniidl -bpython -Wbpackage=example example_echo.idl
感谢我的目录树如下所示(包括执行文件和 IDL 文件本身):
---example (Python module)
|
|------Example (CORBA client module)
|------Example__POA (CORBA server module)
|------echo_example.idl.py
|
---echo_example.idl
---example_execution.py
如果我想使用 CORBA 功能,我只需要在文件顶部添加 import example
。