Python脚本中NSPasteboard输出中的额外字符

时间:2013-01-04 21:40:52

标签: 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"

不行。 : - (

YES。我只需要这样做:

print getClip()

我现在有

"some text"

1 个答案:

答案 0 :(得分: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:的引用非常清楚:

  

在调用stringForType:。

之前,您必须发送types或availableTypeFromArray :.

那么,如果我们致电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,
    …
)

一些内置类型不会像来自Cocoa import * u"public.utf8-plain-text", but as string constants from one of the Cocoa libraries, like的AppKit import * . If you've done中的, NSStringPboardType , or similar, you can just refer to it as那样返回字符串文字* In [156]: pb.stringForType_(NSStringPboardType) Out[156]: u'some text' NSStringPboardType `。

无论如何选择看起来合理的东西并使用它:

"u'some text'"

一切都很好!

那么,为什么你得到u'some text'而不只是setClip?我的猜测是,在您的真实代码中,getCliprepr(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_而跳过整个getClip()胡说八道吗?实际上,如果您想要的类型是NSStringPboardType,那么到目前为止,您可以使用每个版本的OS X来处理它,可能是宇宙中的每个程序,因为将文本放在剪贴板上是没有意义的以该格式提供。但它仍然是错误的,并且是一个坏习惯。 (此外,也许你实际上更喜欢来获取UTF-8字节而不是Unicode字符串,这在Python 2.x中可能更容易处理,或者在3.3中更有效。)

当您做正确的事情时,如果您只是在控制台上输入u'some text',则会看到'u"some text"'而不是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 - 没有引号,没有{{1}}。