在 Python 2.7 中使用子流程时出现缩进错误
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: 'unexpected indent'
为什么需要(再次)缩进我调用 runsafe 的行?如果我像第二个例子那样使用它不应该吗?
您很可能会在缩进中混用制表符和 space。使用 Python 2 这通常会导致奇怪的行为,因为混合制表符和 spaces 实际上是有效的。但它并不像您期望的那样工作:对于 Python 2,制表符等同于 8 spaces。所以为了评估缩进级别,每个制表符被替换为 8 spaces.
所以当你有这样的缩进时(.
是 space,---→
是制表符):
def test():
........pass
---→pass
那么它可能看起来很奇怪,但它是有效的,因为所有内容都使用 8 spaces 缩进。
所以您应该确保您使用的是 一致的 缩进(无论是 space 还是制表符都没有关系——只要它是一致的)。
顺便说一句:在 Python 3 中,这不再被允许,并且会抛出一个语法错误(实际上是一个 TabError
)和一个实际有用的消息:TabError: inconsistent use of tabs and spaces in indentation
.
您的代码混合了制表符和 space 以进行缩进。虽然这在 Python 2 中是可行和允许的,但 Python 2 假定制表符大小为 8 spaces。如果您的编辑器设置为打开可见白色space,您会看到其中一行缩进了 8 space,而另外 2 行缩进了一个 [=36] =]TAB:
if __name__=="__main__":
........runsafe("mkdir","Try")
--->A=0
--->B=7
也就是说,在您的编辑器中,选项卡显示默认为 4 spaces,而 Python 2 期望 8 spaces 匹配 TAB .
由于无法就制表符大小达成一致,但在 Python 中缩进很重要,因此在 Python 2 或 [=58= 中使用制表符进行缩进是 not considered best practice ] 3.
Tabs should be used solely to remain consistent with code that is already indented with tabs:
混合制表符和 spaces 的方式使缩进取决于 spaces 中表示的制表符的价值是非常错误的。
在 Python 2 中,制表符大小为 8,因此缩进 TAB 计数与 8 spaces 或单个 TAB 相同。不幸的是,许多代码编辑器没有意识到这一点,而是对 Python 2 代码使用不同的制表符大小。在 Python 3 OTOH 中,TAB 仅与另一个 TAB 匹配。好的 Python 3 编辑器会将缩进中制表符的不一致使用标记为语法错误。
因此唯一一致的使用制表符的方式是使用仅 制表符进行缩进。在 Python 2 中有一个开关;你可以用选项 -tt
启动你的 Python 解释器,或者把它放在 python
命令之后的 #!
行,这将导致 Python 2 抛出一个如果遇到使缩进取决于制表符大小的行,则会出错。
但是,如果您正在编写新代码,请注意 Python 社区 几乎一致 遵循 PEP 8 编码约定:缩进为 4 spaces,并且没有使用制表符。根据我的经验,只有非常奇怪的遗留项目不遵守此准则。现在几乎所有具有编码约定的开源项目也需要 4-space 缩进,以及 PEP 8.
的其他方面
我曾尝试使用使用子进程定义的函数,但我收到缩进错误,具体取决于我将其放在代码中的位置。我的代码的一个最小示例是:
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: 'unexpected indent'
为什么需要(再次)缩进我调用 runsafe 的行?如果我像第二个例子那样使用它不应该吗?
您很可能会在缩进中混用制表符和 space。使用 Python 2 这通常会导致奇怪的行为,因为混合制表符和 spaces 实际上是有效的。但它并不像您期望的那样工作:对于 Python 2,制表符等同于 8 spaces。所以为了评估缩进级别,每个制表符被替换为 8 spaces.
所以当你有这样的缩进时(.
是 space,---→
是制表符):
def test():
........pass
---→pass
那么它可能看起来很奇怪,但它是有效的,因为所有内容都使用 8 spaces 缩进。
所以您应该确保您使用的是 一致的 缩进(无论是 space 还是制表符都没有关系——只要它是一致的)。
顺便说一句:在 Python 3 中,这不再被允许,并且会抛出一个语法错误(实际上是一个 TabError
)和一个实际有用的消息:TabError: inconsistent use of tabs and spaces in indentation
.
您的代码混合了制表符和 space 以进行缩进。虽然这在 Python 2 中是可行和允许的,但 Python 2 假定制表符大小为 8 spaces。如果您的编辑器设置为打开可见白色space,您会看到其中一行缩进了 8 space,而另外 2 行缩进了一个 [=36] =]TAB:
if __name__=="__main__":
........runsafe("mkdir","Try")
--->A=0
--->B=7
也就是说,在您的编辑器中,选项卡显示默认为 4 spaces,而 Python 2 期望 8 spaces 匹配 TAB .
由于无法就制表符大小达成一致,但在 Python 中缩进很重要,因此在 Python 2 或 [=58= 中使用制表符进行缩进是 not considered best practice ] 3.
Tabs should be used solely to remain consistent with code that is already indented with tabs:
混合制表符和 spaces 的方式使缩进取决于 spaces 中表示的制表符的价值是非常错误的。
在 Python 2 中,制表符大小为 8,因此缩进 TAB 计数与 8 spaces 或单个 TAB 相同。不幸的是,许多代码编辑器没有意识到这一点,而是对 Python 2 代码使用不同的制表符大小。在 Python 3 OTOH 中,TAB 仅与另一个 TAB 匹配。好的 Python 3 编辑器会将缩进中制表符的不一致使用标记为语法错误。
因此唯一一致的使用制表符的方式是使用仅 制表符进行缩进。在 Python 2 中有一个开关;你可以用选项 -tt
启动你的 Python 解释器,或者把它放在 python
命令之后的 #!
行,这将导致 Python 2 抛出一个如果遇到使缩进取决于制表符大小的行,则会出错。
但是,如果您正在编写新代码,请注意 Python 社区 几乎一致 遵循 PEP 8 编码约定:缩进为 4 spaces,并且没有使用制表符。根据我的经验,只有非常奇怪的遗留项目不遵守此准则。现在几乎所有具有编码约定的开源项目也需要 4-space 缩进,以及 PEP 8.
的其他方面