代码之家  ›  专栏  ›  技术社区  ›  Salmorejo

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

  •  0
  • Salmorejo  · 技术社区  · 9 年前

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

    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
    

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

    缩进错误:'意外缩进'

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

    2 回复  |  直到 9 年前
        1
  •  2
  •   poke    9 年前

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

    因此,当您有这样的缩进时(其中 . 是一个空间,并且 ---→ 是选项卡):

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

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

    所以你应该确保 一致的 缩进(只要其一致,空格或制表符都无所谓)。

    顺便说一句:在Python 3中,这不再被允许,并将引发语法错误(实际上是 TabError )有一条非常有用的消息: TabError: inconsistent use of tabs and spaces in indentation .

        2
  •  2
  •   MattDMo    9 年前

    您的代码混合了制表符和空格进行缩进。虽然这在Python 2中是可能的并且是允许的,但Python2假定选项卡大小为 8个空间 。如果您有一个编辑器设置为打开可见的空白,您会看到其中一行缩进了8个空格,另外2行缩进一个空格 桌棋类游戏 :

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

    也就是说,在编辑器中,选项卡显示默认为4个空格,而Python 2期望8个空格与 桌棋类游戏 .

    由于制表符大小无法达成一致,但在Python中缩进很重要,因此使用制表符进行缩进是 not considered best practice 在Python2或Python3中。

    制表符应仅用于与已经用制表符缩进的代码保持一致:

    混合制表符和空格使得缩进依赖于用空格表示的制表符的值,这是非常错误的。


    在Python 2中,制表符大小为8,因此缩进 桌棋类游戏 等于8个空格或单个空格 桌棋类游戏 不幸的是,有许多代码编辑器没有意识到这一点,而是为Python 2代码使用不同的选项卡大小。在Python 3 OTOH中 桌棋类游戏 仅与另一个匹配 桌棋类游戏 一个好的Python 3编辑器会将缩进中不一致的制表符使用标记为语法错误。

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

    但是,如果您正在编写新代码,请注意Python社区 几乎均匀地 遵循PEP8编码约定:缩进为4个空格 未使用选项卡 。根据我的经验,只有一个非常奇怪的遗留项目不遵守这一准则。现在几乎所有有编码约定的开源项目都需要4位缩进,以及 PEP 8 .