在Python 2.7中使用子进程时出现缩进错误

时间:2016-02-23 13:06:00

标签: python python-2.7 indentation

我尝试过使用使用子进程定义的函数,但是根据我将其放在代码上的位置,我会出现缩进错误。我的代码的一个最小例子是:

import subprocess

def runsafe(job,args):
    jobs=[job];
    for arg in args:
        jobs.append(arg)
    proc=subprocess.Popen(jobs,stdout=subprocess.PIPE)
    return proc.stdout.readlines()

if __name__=="__main__":
        runsafe("mkdir","Try")
    A=0
    B=7

这有效并且给了我正确的输入(这段代码只创建了三个新的文件夹,称为T,r,y,它在哪里被执行)但是缩进对我来说似乎很奇怪。 A和B只是我将在代码中使用的两个常量。

对我来说,最自然的是写:

import subprocess

def runsafe(job,args):
    jobs=[job];
    for arg in args:
        jobs.append(arg)
    proc=subprocess.Popen(jobs,stdout=subprocess.PIPE)
    return proc.stdout.readlines()

if __name__=="__main__":
    runsafe("mkdir","Try")
    A=0
    B=7

如果我这样做,我就得到:

  

IndentationError:'意外缩进'

为什么有必要缩进(再次)我称之为runningafe的行?如果我像第二个例子一样使用它,它不应该工作吗?

2 个答案:

答案 0 :(得分:2)

您很可能在缩进中混合制表符和空格。使用Python 2,这通常会导致奇怪的行为,因为混合制表符和空格实际上是有效的。但它不会像您期望的那样工作:对于Python 2,选项卡相当于 8个空格。因此,为了评估缩进级别,每个选项卡都被8个空格替换。

所以当你有这样的缩进时(.是一个空格,---→是一个标签):

def test():
........pass
---→pass

然后它可能看起来很奇怪,但它是有效的,因为所有内容都使用8个空格缩进。

因此,您应确保使用一致的缩进(无论是空格还是制表符都无关紧要 - 只要它一致)。

Btw。:在Python 3中,不再允许这样做,并且会抛出一个语法错误(实际上是TabError)并带有一条实际有用的消息:TabError: inconsistent use of tabs and spaces in indentation

答案 1 :(得分:2)

您的代码会混合标签和空格以进行缩进。虽然这在Python 2中是可行的并且允许,但Python 2假定选项卡大小为 8个空格。如果你有一个设置打开可见空格的编辑器,你会看到其中一行用8个空格缩进,另外两行用一个 TAB

if __name__=="__main__":
........runsafe("mkdir","Try")
--->A=0
--->B=7

也就是说,在编辑器中,选项卡显示默认为4个空格,而Python 2则需要8个空格以匹配 TAB

由于选项卡大小无法达成一致,但在Python中缩进很重要,在Python 2或Python 3中使用缩进选项卡为not considered best practice

  

选项卡应仅用于与已使用制表符缩进的代码保持一致:

混合制表符和空格的方式使得缩进取决于空格中表达的制表符的价值是非常错误的。

在Python 2中,选项卡大小为8,因此 TAB 的缩进计数与8个空格相同或单个 TAB < / KBD>。遗憾的是,有许多代码编辑器没有意识到这一点,而是使用不同的选项卡大小来实现Python 2代码。在Python 3 OTOH中, TAB 仅与另一个 TAB 匹配。然后,一个好的Python 3编辑器会在缩进中标记不一致的选项卡作为语法错误。

因此,使用标签的唯一一致方法是使用标签进行缩进。在Python 2中有一个开关;您可以使用选项-tt启动Python解释器,或者将其放在#!命令之后的python行,这将导致Python 2在遇到符合以下行的情况下抛出错误使缩进取决于制表符大小。

但是,如果您正在编写新代码,请注意Python社区几乎统一遵循PEP 8编码约定:缩进是4个空格,没有使用选项卡< / em>的。根据我的经验,只有那么奇怪的遗产项目不符合本指南。如今几乎所有具有编码约定的开源项目也需要4空格缩进,以及PEP 8的其他方面。