2010-03-23 508 views
26

有一段代码需要复制并粘贴到我的Python解释器中。不幸的是,由于Python对空白的敏感性,以一种合理的方式复制和粘贴它并不容易。 (我认为这些空白会被打乱)有更好的方法吗?也许我可以从文件加载片段。将代码复制并粘贴到Python解释器

这只是一个小例子,但如果有很多代码,我想避免从函数的定义或逐行复制和粘贴中输入所有内容。

class bcolors: 
    HEADER = '\033[95m' 
    OKBLUE = '\033[94m' 
    OKGREEN = '\033[92m' 
    WARNING = '\033[93m' 
    FAIL = '\033[91m' 
    ENDC = '\033[0m' 

    def disable(self): 
     self.HEADER = '' # I think stuff gets mangled because of the extra level of indentation 
     self.OKBLUE = '' 
     self.OKGREEN = '' 
     self.WARNING = '' 
     self.FAIL = '' 
     self.ENDC = '' 
+0

使用体面的编辑器(我的意思是Emacs),你不需要复制/粘贴。 – tripleee 2015-03-04 12:01:06

+3

如何使用Emacs帮助从python.org复制粘贴到终端? – 2015-11-05 13:09:27

+0

micropython有一个特殊的粘贴模式,可通过按ctrl-E' – 2017-08-15 16:38:37

回答

8

你可以调用execfile(filename)。或多或少与导入模块相同,只是它跳过了模块管理部分,并且不需要将文件夹添加到sys.path中。

编辑:为了解决原始问题:复制粘贴的代码可以通过调用exec(codestring)来执行。

+10

这是如何回答“我如何粘贴python代码?”的问题 – 2010-03-23 21:36:34

+1

你说的没错,但我更喜欢这个解决方案,因为它不需要你选择特定的shell或使用特定的IDE。其他解决方案也很出色,但我接受了最普遍的解决方案。 – wp123 2010-03-24 04:21:24

+0

@Bryan Oakley:你说得对,execfile(filename)不能用于那个。但是exec(codestring)可以。 – 2010-03-25 08:17:55

5

您可以将文件导入python解释器。这将加载类,并允许您运行代码。

例如,创建一个名为“bgcolors.py”的文件并复制并粘贴您的代码。然后使用python解释器,你只需输入“import bgcolors”,你就可以运行它。

你可以在这里阅读更多:

http://docs.python.org/tutorial/modules.html

+0

访问在同一会话中第二个'import bgcolors'不会执行任何操作,因为导入“知道”bgcolors已经被导入。 – msw 2010-03-23 15:49:06

+1

而不是在shell中显式导入它,像这样调用python:'python -m bgcolors.py',你将看到一个已加载该模块的环境。 – vezult 2010-03-23 15:49:12

+0

我认为-m选项只适用于sys.path中的文件。但我的脚本不在标准库中。 – wp123 2010-03-23 16:03:20

5

您可以使用IPython这是更好的蟒蛇REPL。它具有使用%edit命令从external editor获取输入的命令。

+0

我喜欢这个解决方案,因为它不需要你使用不同的IDE。 – wp123 2010-03-23 16:09:52

2

IDLE接口确实会努力保留粘贴文本的正确缩进。

3

Dreampie允许您复制粘贴具有正确缩进的代码。

24

通常您可以通过%cpaste%paste命令轻松安全地复制粘贴IPython。这对于测试从网页或从编辑器复制的代码非常方便。 IPython还有一个运行程序的%run命令,并将您保存在一个Python shell中,其中包含程序中定义的所有变量,以便您可以使用它们进行操作。

为了得到这些功能的帮助:%cpaste?

+0

JetBrains PyCharm也支持这个! – Andrew 2013-11-01 18:22:36

+1

这是最好的答案! :) – 2015-09-10 19:09:04

+0

在**'Ipython 5' **只是粘贴代码。阅读我的答案[这里](http:// stackoverflow。com/a/38419584/2248627) – Levon 2016-07-17 09:13:14

0

我最近并最终有这个问题,只是需要改变我的编辑器的凹槽从选项卡设置为空格。 (我正在使用OSX终端运行解释器。)一旦我这样做,复制&粘贴工作正常。

3

您可以简单地将所有制表符转换为空格并删除全部空行。 所以,你将能够粘贴任何代码移植到Python控制台(例如:python2.6的)

1

有一个内置的方法调用“缩进区域& DEDENT语言区”,你可以只使用它。一次粘贴大量代码后,您可以将它们全部选中并调整空白。

1

我的答案是专门关于复制到标准python shell(仅在linux上测试)的粘贴。

取决于代码来自何处以及它最初是如何格式化的空白可能或可能不重要。特别是关于您的示例代码片段 - 从SO的代码格式部分复制粘贴 - 无关紧要(假设代码被正确缩进为可执行文件)。

的空行,但是,确实会导致在标准Python解释器的麻烦,因为它通常是壳-S去缩进CMD。在你的代码段的情况下,空行前述的disable()函数定义结束/过早退出类的定义,所以当disable()定义线有压痕错误检测:

>>> class bcolors: 
...  HEADER = '\033[95m' 
...  OKBLUE = '\033[94m' 
...  OKGREEN = '\033[92m' 
...  WARNING = '\033[93m' 
...  FAIL = '\033[91m' 
...  ENDC = '\033[0m' 
... 
>>> def disable(self): 
    File "<stdin>", line 1 
    def disable(self): 
    ^
IndentationError: unexpected indent 
>>> 

所以,你只需要在那些关注空行。您的代码片段只需要2个多行复制粘贴操作来解决该空行。

我唯一需要的其他东西 - 用于复制粘贴部分已缩进的代码(例如从类内部的函数中) - 一个额外的缩进级别,无需重新执行复制代码的缩进。对于一个通往粘贴片段if 1:线之前和输入(即空行)做的伎俩后:

>>> if 1: 
...  def disable(self): 
...   self.HEADER = '' # I think stuff gets mangled because of the extra level of indentation 
...   self.OKBLUE = '' 
...   self.OKGREEN = '' 
...   self.WARNING = '' 
...   self.FAIL = '' 
...   self.ENDC = '' 
... 
>>> 
+0

使用两个复制粘贴操作的另一种方法是简单地确保“空白”行的缩进量与代码的其余部分相同。为了避免使用'if 1:',有几个选择:如果你的编辑器有一个可视块选择(而不是行选择),那就使用它。或者,在复制之前选择要复制的行并取消缩进。 – Jeff 2017-07-03 18:03:44

0

对于那些有问题使用Ctrl-C & CTRL-V复制/粘贴在在Windows上Python解释器外壳它只是表明:

>>> ^V 

只需鼠标右键单击该应用程序窗口标题栏并选择默认或属性,那么你要取消选中Use legacy console (requires relaunch)确保现在Enable Ctrl key shortcuts被选中,关闭并重新打开Python解释器控制台窗口。