Python-UNO bridge

参考链接:http://www.openoffice.org/udk/python/python-bridge.html

PyUNO能被用于以下三种模式:

1.在LO进程中脚本框架内(OOo2.0版本以后)http://www.openoffice.org/udk/python/scriptingframework/index.html

2.在Python执行中(在LO进程之外)

以下情况,你可以考虑使用这个模式:

  • 刚开始使用PyUNO(因为这个是更直观的方法)
  • 想要从一个单独的进程中调用Python脚本(e.g. a cgi-script within a http-server)
  • 想要最短的周转时间(code - execute - code - execute ...)

调用模式:

  1. 启动soffice.bin进程 soffice "-accept=socket,host=localhost,port=2002;urp;"
  2. Python 脚本执行,与soffice.bin进程进行进程间通信 ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )

3.在LO进程内

以下情况,你可以考虑使用这个模式:

  1. 你想轻松将你的代码运行到多个其他机器(使用UNO packages)
  2. 脚本将被UI 事件触发(menu 或者 toolbars)
  3. 你已经有了使用PyUNO的经验
  4. 你想让你的脚本运行性能最好

这个模式是将py脚本编写成UNO组件的形式,并且打包在odt中供LO使用,具体例子查看最上方参考链接。

UNO语言绑定

UNO 类型映射


IDL 类型
Python

integer types (byte, short, unsigned short, long, unsigned long, hyper, unsigned hyper

Python内部只知道C数据类型long和longlong作为整数类型。在大多数机器上,一个long是一个32位值而longlong是一个64位的值.

  • 值来自UNO(例如,UNO方法的返回值)
    byte,short,unsigned short,long or unsigned long 转换到python long. 
    type hyper or unsigned hyper 转换到python long long.
  • 值传给UNO(例如,作为UNO方法的参数)

    如果有一个具体类型的idl方法,值转化为具体的类型(实际上调用服务做了这个工作)。

    如果方法只有一个any,每一个整数值转换为最小的数据类型(5 becomes a byte, 150 becomes a short, 0x1f023 becomes a long and values larger than 0xffffffff become a hyper)


boolean
Python 内部有boolean 数据类型,继承integer type 存在单件真假,pyuno使用区分整数和布尔值.
如果一个UNO方法的参数为boolean,你也可以使用数值传递
例如:

#idl signature void takeBool( [in] boolean bool )

unoObject.takeBool( 1 )       # valid, passing true (PyUNO runtime
                              # does the conversion
unoObject.takeBool( True) )   # valid, passing true
unoObject.takeBool( False )   # valid, passing false
然而当你想明确的指定传递boolean,并用any类型作为参数,你必须使用True 或 False

# idl signature void foo( [in] any value )

# implementation expects a boolean (which is separately documented
# e.g. in the service specification.
unoObject.foo( True ) # valid, pass a true
unoObject.foo( 1 )    # bad, just passing a 1, implementation will


string
通常情况下,string映射python unicode string,但是当传递8位的python string , UNO 桥会将8位的string转换为unicode string.

# idl signature foo( [in] string value )
# both lines are valid
unoObject.foo( u‘my foo string‘ )
unoObject.foo( ‘my foo string‘ )

enum

例:

from com.sun.star.uno.TypeClass import UNSIGNED_LONG

unoObject.setValue(UNSIGNED_LONG)

if unoObject.getValue() == UNSIGNED_LONG;

unoObject 映射为枚举类型


type

例:
from com.sun.star.lang import typeOfXComponent

unoObject.setType( typeOfXComponent )
if unoObject.getType() == typeOfXComponent:


struct(and exception)

例:

第一种实现方式:使用结构体的构造函数,拷贝构造函数,以及结构体支持等于号操作。

from com.sun.star.beans import PropertyValue

from com.sun.star.uno import Exception,RuntimeException

propVal = PropertyValue()                 # Default constructor
propVal.Name = "foo"
propVal.Value = 2

if propVal == PropertyValue( "foo", 2 ):  # Memberwise constructor
   # true !
   pass

if propVal == PropertyValue( propVal ):   # Copy Constructor
   # true

第二种实现方式: uno.createUnoStruct()

struct = uno.createUnoStruct( "com.sun.star.beans.PropertyValue" )

struct.Name = "foo"
struct2 = struct
struct2.Name = "python"           # modifies also struct, probably not desired !
unoObject.call( struct, struct2 ) # passes the same struct 2 times !

struct.Name = "doobidooo"         # even worse style. If the UNO object is implemented
                                  # in python, you possibly modify the callee‘s value.
				  # Don‘t do this !


secquence

secquence映射到python为tuple。

secquence<byte>映射为uno.ByteSecquence. 包含字符串类型的成员变量value, value存放字节流。

# idl signature writeBytes( [in] sequence%lt; byte > data )
#
out.writeBytes( uno.ByteSequence( "abc" ) )

# you could also write the following
begin = uno.ByteSequence( "ab" )
out.writeBytes( begin + "c" )

# but this does not work !
out.writeBytes( "abc" ) # ERROR, no implicit conversion supported by the runtime !

# idl signature long readBytes( [out] sequence<byte> , [in] length )
len,seq = in.readBytes( dummy, 3 )

# the statements do the same thing
print seq == "abc":
print seq == uno.ByteSequence( "abc" )

any 通常情况下,写python脚本时不需要接触到any类型,只需要根据UNO接口方法所需要的any类型,传入具体的数据类型就OK。
但是有些特殊情况,需要传入指定的any值
例如:

# the normal call
uno.setPropertyValue( "foo", (4,5))

# the uno.invoke call
uno.invoke( obj, "setPropertyValue" , ("foo",uno.Any( "[]short", (4,5))) )

我们可以使用uno.Any(),传递类型名称和值来构造Any

# constructs a uno.Any, that contains a byte
byteAny = uno.Any( "byte" , 5 )

# constructs a sequences of shorts
byteAny = uno.Any( "[]short", (4,5))

参考链接:http://www.openoffice.org/udk/python/scriptingframework/index.html

文档python脚本,保存在zip中。

vnd.sun.star.script:push_me.py$pushMe?language=Python&location=document

全局脚本,保存在目录:instdir\share\Scripts\python

vnd.sun.star.script:HelloWorld.py$HelloWorldPython?language=Python&location=share

用户脚本,保存在目录:instdir\user\Scripts\python

vnd.sun.star.script:HelloWorld.py$HelloWorldPython?language=Python&location=user

嵌入uno-package LO的用户目录(只读)

vnd.sun.star.script:pyhello2.uno.pkg|package|hallo.py$HelloWorldPython?language=Python&location=user:uno_packages

时间: 2024-11-08 23:08:41

Python-UNO bridge的相关文章

python 设计模式

介绍 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用

DIY一个基于树莓派和Python的无人机视觉跟踪系统

DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站几乎已经是标配.如果想来点高级的--在无人机上直接处理拍摄的图像并实现自动控制要怎么实现呢?其实视觉跟踪已经在一些高端的消费级无人机上有了应用,不过玩现成的永远没有自己动手来劲;).前段时间DIY了一个无人机三轴云台的视觉跟踪系统,除去云台花了¥370,本文将设计思路与实验效果分享出来. 一.基本配置 1.1 硬件 计算平台:树莓派3 (¥219.00) 摄像头:USB网络摄像头(¥108.

Python 学习第一弹:基本数据类型

python提供了很多数据结构,不过其很多操作都是朴素操作,速度慢时间复杂度参见:https://wiki.python.org/moin/TimeComplexity 可遍历(for): list, string, 判断元素是否存在(in): list, string, tuple 合并: list, string 元素个数(len()) 元素和(sum()) string(字符串) word = 'banana' 特点: 不可变的列表 list(列表) a = [1, 'abc', [a,

Python 串口通讯

摘要: pyserial module: https://github.com/tbusf/pyserial Python使用pyserial进行串口通信:http://blog.csdn.net/log1100/article/details/54380325 串口通讯的python模块--pySerial :http://blog.csdn.net/dainiao01/article/details/5885122 Parameters for the Serial class ser =

python部分内容存档

笨办法学python. 1 Ec6字符串和文本... 1 ec7. 1 ec8. 1 Ec9. 1 Ec10 转义字符... 1 Ec11提问... 1 raw_input和input的区别... 1 Ec12提示别人... 1 ec13 参数,解包,变量... 1 ec14提示和传递... 1 Ec15读取文件... 1 Ec16读写文件... 1 ec17更多文件操作... 1 ec18命名,变量,代码,函数... 1 ec19函数和变量... 1 ec20函数和文件... 1 ec21函数

python之路,Day24 常用设计模式学习

python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一

【物联网(IoT)开发】使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

上篇"[物联网(IoT)开发]Arduino 入门 Hello World(LED闪烁)"只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断开网络提供电源依然还可以工作.本文将介绍如何开发一个应用程序,以便使用适用于物联网 (Internet of Things, IoT) 的技术.我们的应用程序通过串口收集数据,将其存储在一个 Web 服务器上,然后在网页上实时显式结果,并可以在网页上控制LED的开关. 构建一个类似的应用程序的前提条件 对于第

python 各模块

01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支持模块 12 _ _builtin_ _ 模块 121 使用元组或字典中的参数调用函数 1211 Example 1-1 使用 apply 函数 1212 Example 1-2 使用 apply 函数传递关键字参数 1213 Example 1-3 使用 apply 函数调用基类的构造函数 122

转:Python标准库(非常经典的各种模块介绍)

Python Standard Library 翻译: Python 江湖群 10/06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我们 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10. cmath 模块

Python自动化运维之13、设计模式

设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板.设计模式不会绑定具体的编程语言.一个好的设计模式应该能够用大部分编程语言实现(如果做不到全部的话,具体取决于语言特性).最为重要的是,设计模式也是一把双刃剑,如果设计模式被用在不恰当的情形下将会造成灾难,进而带来无穷的麻烦.然而如果设计模式在正确的时间被用在正确地地方,它将是