2013-01-04 88 views
0

我的第一篇文章...在Python脚本中输出来自NSPasteboard的额外字符

我正在使用python脚本从Mac OS X Lion上的剪贴板中获取文本。

我设置具有以下功能剪贴板:

def setClip (text): 
    pb = NSPasteboard.generalPasteboard() 
    pb.clearContents() 
    a = NSArray.arrayWithObject_(text) 
    return pb.writeObjects_(a) 

其中text = “一些文本”

我用下面的检索剪贴板:

def getClip(): 
    pb = NSPasteboard.generalPasteboard() 
    pbstring = pb.stringForType_(NSString *)dataType 
    return pbstring 

输出前置用“u”将文字用引号括起来如下:

In [224]: setClip('some text') 
Out[224]: True 

In [225]: getClip() 
Out[225]: "u'some text'" 

如何检索文本,因为它应该是输入到剪贴板?

我对NSPasteboard一无所知。我在stackoverflow上找到了这些代码片段。

在此先感谢。

附录:我的实际代码

from AppKit import * 
    def setClip (text): 
     pb = NSPasteboard.generalPasteboard() 
     pb.clearContents() 
     a = NSArray.arrayWithObject_(text) 
     return pb.writeObjects_(a) 

    def getClip(): 
     pb = NSPasteboard.generalPasteboard() 
     pbstring = pb.stringForType_(NSString *)dataType 
     return pbstring 

这是我在IPython中运行它会发生什么:

输出被换成了一个“U”在引号的文本如下:

In [224]: setClip('some text') 
Out[224]: True 

In [225]: getClip() 
Out[225]: "u'some text'" 

试过一个建议从答案 ***

def getClip(): 
    pb = NSPasteboard.generalPasteboard() 
    return pb.stringForType_("public.utf8-plain-text") 

In [332]: getClip() 
Out[332]: u"some text" 

不行。 :-(

是的,我只需要做到这一点。

print getClip() 

而且我现在有

"some text" 
+0

如果使用[dataForType](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSPasteboard_Class/Reference/Reference.html)而不是'stringForType',会发生什么情况? – unutbu

+0

这不能是你的实际代码,因为'getClip'的第二行会引发'SyntaxError'。除非您向我们展示正确的代码,否则我们无法调试您的代码。 – abarnert

+0

'pbstring = pb.stringForType_(NSString *)dataType'的语法看起来可能来自不同的语言 - 您能准确地包含您用来生成上述输出的内容吗? – RocketDonkey

回答

5

如果你一无所知NSPasteboard,你应该撇去Pasteboard Programming Guide,看看NSPasteboard Class Reference的详细信息

您给我们的代码不可能是您正在运行的代码,因为:

pbstring = pb.stringForType_(NSString *)dataType 

这是无效的Python。它位于ObjC和Python之间的某处。所以它只会提高SyntaxError。即使我把它弄成明智:

pbstring = pb.stringForType_(dataType) 

或者,如果你想明确:

pbstring = pb.stringForType_(NSString.stringWithString_(dataType)) 

这将只是一个NameError,因为你还没有定义dataType任何地方。

那么,你从哪里得到dataType?那么,对于stringForType:参考使得这很清楚:

You must send types or availableTypeFromArray: before invoking stringForType:.

那么,如果我们所说的pb.types()?我们回来的字符串列表,像这样:

Out[153]: 
(
    "NeXT smart paste pasteboard type", 
    "com.apple.webarchive", 
    "NeXT Rich Text Format v1.0 pasteboard type", 
    "public.utf8-plain-text", 
    NSStringPboardType, 
    … 
) 

少数的内置类型将不会从AppKit的进口* ,从可可进口* , or similar, you can just refer to it as NSStringPboardType回来作为字符串文字像u"public.utf8-plain-text", but as string constants from one of the Cocoa libraries, like NSStringPboardType . If you've done `。

反正挑一些看起来合理,并使用它:

In [156]: pb.stringForType_(NSStringPboardType) 
Out[156]: u'some text' 

一切都很好!

那么,为什么你得到"u'some text'",而不是只有u'some text'?我的猜测是,在你真实的代码中,setClipgetClip正在做一个额外repr(s)的地方。例如:

In [165]: s=u'some text' 

In [166]: repr(s) 
Out[166]: "u'some text'" 

In [167]: s 
Out[167]: u'some text' 

Out[166]可能看起来很熟悉。最有可能的是,你已经在你的代码中完成了等价物。但是既然你没有在你向我们展示的代码中完成它,我们无法猜测在哪里。

getClip()正确的方法是,使一个类型list在你的优先顺序,然后做这样的事情:

def getClip(): 
    pb = NSPasteboard.generalPasteboard() 
    best_type = pb.availableTypeFromArray_(myFavoriteTypes) 
    if best_type: 
     return pb.stringForType_(best_type) 

这似乎是一个痛苦和不必要的。你不能只是做return pb.stringForType_(best_type[0])并跳过整个availableTypeFromArray_废话?在实践中,如果你想要的类型是NSStringPboardType,那么到目前为止,每个OS X版本都可能会遇到它,因为它可能是宇宙中的每个程序,因为将文本放在剪贴板上并没有意义以该格式提供。但它仍然是错误的,也是一个不好的习惯。 (另外,也许你实际上宁愿用来获取UTF-8字节而不是Unicode字符串,这在Python 2.x中可能更容易处理,或者在3.3中更加高效。)

当你做事情是对的,如果你只是在控制台输入getClip(),你会看到u'some text'而不是'u"some text"'。 “但是坚持下去”,你说,“那里仍然有一个'u'和一对引号,即使没有两个引号,所以它仍然是坏的!不,这不对。看看这个:

In [182]: s=u'some text' 

In [183]: s 
Out[183]: u'some text' 

In [184]: print s 
some text 

或者这样:

In [185]: s='some text' 

In [186]: s 
Out[186]: 'some text' 

In [187]: print s 
some text 

每当你只需要输入一个字符串(或返回一个字符串的函数)在交互式控制台,它打印出带有引号的字符串。但是引号实际上并不在字符串中 - 正如您在明确使用print语句时所看到的那样。

所以,如果你看到这一点:

In [332]: getClip() 
Out[332]: u"some text" 

这实际上是正确的。它与上面的s=u'some text'示例相同。字符串中没有引号或u个字符;这就是交互式解释器显示您在命令行中键入的字符串的方式。为了验证它,只是print结果:

In [332]: print getClip() 
some text 

或者其存储在一个文件中:

In [188]: with open('test.txt', 'w') as f: 
    .....:  f.write(getClip()) 
    .....: 

在文本编辑器,没有引号现在打开test.txt,没有u

+0

显然,正如本文中提到的,http://cl.ly/3z1T0Q2L2b44,当涉及到前缀'u'时,我只需要“吮吸它”。 – DMfll

+0

@ user1913726:不,这不是你的实际问题。字符串的'repr'确实有'u',但即使没有,你也有额外的引号。你的问题是你有字符串的'repr'而不是字符串本身,这就是你需要解决的问题。 – abarnert

+0

我只想从剪贴板中抓取文本并使用python进行处理。因为我的主要目标是使用python,所以我现在没有时间深入NSPasteboard。感谢您的帮助。 – DMfll