[英]Indentation error when using subprocess in Python 2.7
我尝试使用通过子流程定义的函数,但根据将其放在代码上的位置,会出现缩进错误。 我的代码的一个最小示例是:
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:'意外缩进'
为什么必须缩进(再次)我称为runsafe的行? 如果我像第二个示例那样使用它,它不应该工作吗?
您很可能在缩进中混入制表符和空格。 在Python 2中,这通常会导致奇怪的行为,因为混合制表符和空格确实有效。 但这并不像您期望的那样起作用:对于Python 2,制表符等于8个空格 。 因此,为了评估缩进级别,每个选项卡均由8个空格代替。
因此,当您具有这样的缩进时(其中.
是空格,而---→
是制表符):
def test():
........pass
---→pass
那么它看起来可能很奇怪,但是它是有效的,因为所有内容都使用8个空格缩进。
因此,您应该确保使用一致的缩进(只要是一致的 ,则无论空格还是制表符都没有关系)。
顺便说一句:在Python 3中,这不再被允许,并且会抛出一个语法错误(实际上是一个TabError
),并带有一条实际有用的消息: TabError: inconsistent use of tabs and spaces in indentation
。
您的代码混合了制表符和空格以进行缩进。 尽管这在Python 2中是可能且允许的,但Python 2假定制表符大小为8个空格 。 如果您的编辑器具有打开可见空白的设置,则会看到其中一行缩进了8个空格,而另外2行缩进了一个TAB :
if __name__=="__main__":
........runsafe("mkdir","Try")
--->A=0
--->B=7
也就是说,在编辑器中,选项卡显示默认为4个空格,而Python 2期望8个空格与TAB匹配。
由于无法商定制表符的大小,但是在Python中缩进非常重要,因此在Python 2或Python 3中,将制表符用于缩进并不被视为最佳实践 。
制表符应仅用于与已经用制表符缩进的代码保持一致:
而且,以使缩进取决于空格中表示的制表符的价值的方式混合制表符和空格是非常错误的。
在Python 2中,制表符的大小为8,因此缩进为 TAB计数与8个空格或单个TAB相同 。 不幸的是,有许多代码编辑器没有意识到这一点,而是为Python 2代码使用了不同的制表符大小。 在Python 3 OTOH中,一个TAB仅与另一个TAB匹配。 好的Python 3编辑器会将缩进的制表符用法不一致标记为语法错误。
因此,使用制表符的唯一一致方法是仅使用制表符进行缩进。 在Python 2中有一个开关。 您可以使用选项-tt
启动Python解释器,或将其放在#!
python
命令之后的一行,如果遇到遇到使缩进取决于选项卡大小的行,则会导致Python 2引发错误。
但是,如果您正在编写新代码,请注意,Python社区几乎统一遵循PEP 8编码约定:缩进为4个空格,并且不使用制表符 。 以我的经验,只有如此古怪的遗留项目无法遵守该准则。 如今,几乎所有具有编码约定的开源项目也都需要4空格缩进以及PEP 8的其他方面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.