1. 背景
大多数情况下通过pycharm编写Python代码,编写调试完,到Linux下发布执行。
以example.py脚本为例
#! /usr/bin/env python3
#! -*- encoding: utf-8 -*-
def test(x,y):
x=int x
y=int y
c=x+y
return c
if _name_=="__main__":
print(test(2,6)
在Linux下执行python3 example.py成功但./example.py执行报错。
偶然发现vi example.py打开文件,底部会显示这个文件是dos格式的。
突然想起来,windows和Linux下文件的换行符不一样。
使用dos2unix工具转换下./example.py可以执行了。
2. 疑惑
Windows下Python3脚本传到Linux下,为什么python3 example.py成功?./example.py执行报错?
3. 分析
先看下python3 example.py执行,指定Python3解释器,猜测下Python3能在Linux下执行Windows的Python脚本,也就是说Python3解释器自动将dos下换行符(/r/n)转换或解析为unix下换行符(/r)。
./example.py执行,是根据文件开头指定的Python解释器来执行(#! /usr/bin/env python3)。在指定解释器前,要先能够识别这个文件的换行符,此次执行失败就是换行符搞的鬼。
做个实验:仅仅把(#! /usr/bin/env python3)这一行在Linux下删除后,重新编写,并换行。再次执行验证是否可行。
实验失败了。
有两点结论:
1) 文件换行符是dos还是unix,是以文件为粒度的,不是某一行来决定的。
这一点可以知道,./example.py执行是操作系统先识别文件换行符,才能调用Python解释器。
2) Python3 example.py是不需要操作系统来识别文件换行符,直接Python解释器来处理。
网友评论