将`print`的输出直接复制到剪贴板

时间:2018-06-15 00:28:21

标签: python ipython

我使用inspect.getsource来检查我导入的库:

In[52]: from django.views.generic import View
In[53]: view_code = inspect.getsource(View)
In[54]: len(view_code)
Out[54]: 3242

检索格式化代码

In[55]: print(view_code)

class View(object):
    """
    Intentionally simple parent class for all views. Only implements
    dispatch-by-method and simple sanity checking.
    """

    http_method_names = ['get', 'post', 'put',
                        'patch', 'delete', 'head', 'options', 'trace']

    def __init__(self, **kwargs):

我想将这些代码存储到我的笔记中以供进一步参考,
要做到这一点,我必须滚动整个代码,目的是复制它 如果代码足够长,那就不方便了。

如何以直接的方式将print的输出复制到剪贴板?

1 个答案:

答案 0 :(得分:2)

除了作为tkinter GUI的一部分之外,Python没有内置剪贴板API,但PyPI上有许多库可以做到。

例如,使用pyperclip,您可以将所需的任何字符串复制到剪贴板,如下所示:

In[56]: import pyperclip
In[57]: pyperclip.copy(view_code)

但您可以使用tkinter。根据您的平台,无论您是使用控制台模式还是qtconsole会话等,这可能无效,或者可能需要弹出不需要的窗口,但您可以尝试查看:

In [119]: import tkinter
In [120]: tk = tkinter.Tk()
In [121]: tk.clipboard_clear()
In [122]: tk.clipboard_append(view_code)

如果您的设置 要求您显示一个窗口(例如,我认为这将在Windows上的控制台模式会话中发生),您可能仍然可以在不过分分心的情况下执行此操作。如果您有兴趣,请参阅this answer, suggested by J.Doe

但是写一个文件可能更简单,也更有用:

In[58}: with open('spam.txt', 'w') as f: f.write(view_code)

或者,既然你正在使用IPython,你可以使用%save或其他各种魔术命令。 (请参阅this question,所以我不必在这里重复这些内容。)

或者,有多个IPython插件的第三方实现为您提供剪贴板复制命令,例如this one(我在随机搜索中找到它,所以我不赞同它或任何东西......但似乎有效):

In[61]: %clip view_code

如果您出于某种原因确实需要捕获print的输出,那么两种显而易见的方法是使用monkeypatch或shadow print或修补sys.stdout。例如:

import builtins
import io
import sys
def print(*args, **kw):
    if kw.get('file', sys.stdout) is sys.stdout:
        buf = io.StringIO()
        builtins.print(*args, **kw, file=buf)
        pyperclip.copy(buf.getvalue())
    builtins.print(*args, **kw)