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

Alg*_*bra 1 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
Run Code Online (Sandbox Code Playgroud)

检索格式化代码

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):
Run Code Online (Sandbox Code Playgroud)

我想将代码存储到我的笔记中以供进一步参考,
为此,我必须滚动浏览整个代码以进行复制。
代码太长就不方便了。

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

aba*_*ert 5

除了作为tkinterGUI 的一部分外,Python 没有内置剪贴板 API ,但是 PyPI 上有许多库可以这样做。

例如,使用pyperclip,您可以像这样将您想要的任何字符串复制到剪贴板:

In[56]: import pyperclip
In[57]: pyperclip.copy(view_code)
Run Code Online (Sandbox Code Playgroud)

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

In [119]: import tkinter
In [120]: tk = tkinter.Tk()
In [121]: tk.clipboard_clear()
In [122]: tk.clipboard_append(view_code)
Run Code Online (Sandbox Code Playgroud)

如果您的设置确实需要您显示一个窗口(例如,我认为这会在 Windows 上的控制台模式会话中发生),您可能仍然可以在不分心的情况下完成它。如果您有兴趣请参阅J.Doe 建议的这个答案


但仅写入文件可能更简单、更有用:

In[58}: with open('spam.txt', 'w') as f: f.write(view_code)
Run Code Online (Sandbox Code Playgroud)

或者,由于您使用的是 IPython,您可以使用%save或 其他各种魔术命令。(请参阅此问题,这样我就不必在此处全部介绍了。)


或者,有多个 IPython 插件的第三方实现可以为您提供剪贴板复制命令,就像这个(我只是在随机搜索中发现的,所以我不认可它或任何东西......但它似乎有效):

In[61]: %clip view_code
Run Code Online (Sandbox Code Playgroud)

如果您print出于某种原因确实需要捕获 的输出,那么两种明显的方法是monkeypatch 或shadow print,或patch 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)
Run Code Online (Sandbox Code Playgroud)