【问题标题】:Copy the output of `print` to clipboard directly将`print`的输出直接复制到剪贴板
【发布时间】:2018-11-24 19:58:45
【问题描述】:

我使用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 的输出复制到剪贴板?

【问题讨论】:

  • 您真的想要一种将print 的结果捕获到剪贴板的方法,还是只是一种将字符串发送到剪贴板而不打印的方法?

标签: python ipython


【解决方案1】:

Python 没有内置剪贴板 API,除了作为tkinter GUI 的一部分,但 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)

【讨论】:

  • 其实还有Tkinter.Tk剪贴板方法。
  • @J.Doe 好点。大概 OP 处于控制台模式或 qtconsole 会话中,并且根据平台的不同,使用 tkinter 可能不起作用,或者需要弹出不需要的窗口……但至少在某些情况下它会起作用;我会把它添加到答案中。
  • @J.Doe 我已经在答案中添加了一个,但我会链接到那个以获得更多详细信息。
  • 可能要提一下tkinter/Tkinter向后不兼容
  • @J.Doe 我认为在 2018 年有关 Python 3 的问题中没有必要提及 Python 2。
猜你喜欢
  • 2011-07-05
  • 2021-11-07
  • 1970-01-01
  • 2016-04-28
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多