2017-11-04 81 views
0

我寫了下面的代碼:獲得意想不到的OSERROR

def bigger(a,b): 
    if a>b: 
     return a 
    else: 
     return b 

print(bigger(1,3)) 

我保存的代碼爲文件命名bigger.py。

exec(open('e:\py\bigger.py').read()) 

的Python返回以下錯誤信息:

然後我用下面的代碼在Python解釋器(Python的3.6)執行的文件

>>> exec(open('e:\py\bigger.py').read()) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
OSError: [Errno 22] Invalid argument: 'e:Vipy\x08igger.py' 

正如你所看到的,它說文件名是x08igger.py,而我在代碼中輸入的是bigger.py。這太奇怪了!

+1

但是,爲什麼你甚至不能以這種方式運行腳本?只需在正常的命令提示符下從Python解釋器外部運行它。您也可以通過導入它來從開放的解釋器會話中運行它(假設腳本位於Python知道的路徑上)。例如,「進口更大」。一旦它被導入,你可以調用它的函數,例如'print(larger.bigger(5,7))'。 –

+0

由於文件路徑中有反斜槓,因此您應該在字符串前加一個'r'來表示它們應該從字面上看,而不是與以下字符組合(如\ r和\ n)以形成一些其他的角色。換句話說,將其改爲'r'e:\ py \ bigger.py''。 – martineau

回答

2

你只是試圖打開一個文件名爲:e:\py<ASCII BACKSPACE>igger.py

\b逃逸代碼轉換成ASCII退格字符,所以當然你的文件加載有問題。這就是爲什麼你總是爲Windows路徑(和正則表達式)使用原始字符串,來避免這一缺陷,當\先表示換碼字符(如rnuUxfvt,a,可能還有其他幾個我忘記了)。使用字符串r"e:\py\bigger.py"作爲您的文件(注意公開報價前面的r)將解決該問題;在原始字符串中,唯一解釋的轉義是它們在引號字符本身之前;否則,反斜槓只是普通字符,而不是轉義字符。

+0

非常感謝。我也嘗試使用'os.path'模塊。我寫了這樣一句話:'exec(open(os.path.join('e:','py','bigger.py')。read())',但它是不正確的。你知道爲什麼嗎? – failbetter

+0

@failbetter :驅動器字母有一個奇怪的特殊情況,它最終構造了'r'e:py \ bigger.py''的等價物,注意'e:'後面沒有反斜槓,這樣的路徑意味着「在'e'驅動器上,查找相對於驅動器的工作目錄(而不是'e:')的根目錄'py \ bigger.py'「[文檔中提到這個](https://docs.python。 org/3/library/os.path.html#os.path.join),但是當你第一次遇到它的時候,這是相當令人吃驚的。 – ShadowRanger

+0

明白了,只是爲了提醒自己:'os.path.join('e:\ \','py','bigger.py')'和'os.path.join('e:\ py','bigger.py')'都可以。 – failbetter

相關問題