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解釋器來處理。

喜歡的朋友記得點贊、收藏、關注哦!!!