2011-04-03 95 views
1

交互式地調試我曾問一個問題,以前在Python中的相對路徑在SO問題:How can I access relative paths in Python 2.7 when imported by different modules無法與Python 2.7

所提供的答案在我所有的腳本和功能的工作很大。但是,當試圖在IDLE(Python 2.7)中調試文件時,它會產生運行時錯誤。

任何人都可以指向我使用__file__表示法的文檔嗎?另外我想了解爲什麼IDLE在運行示例代碼時生成錯誤,但是從命令行運行相同的文件或雙擊它(對於Windows用戶)不會。

任何幫助將不勝感激!

請注意,我在Windows XP上使用virtualenv(在這些測試期間未激活)運行Python 2.7。

示例代碼

import os 
import sys 
curdir = os.path.dirname(__file__) 
sys.path.append(curdir + '/..') 

錯誤,如果你在解釋器寫這

Traceback (most recent call last): 
File "C:\MyFile.py", line 3, in `<module>` 
    curdir = os.path.dirname(`__file__`) 
NameError: name '`__file__`' is not defined 
+0

要正確比較IDLE如何運行代碼(通過運行Python)以及Python如何自行運行代碼,必須爲每個代碼運行相同的運行模式。 IDLE Shell與交互式解釋器進行比較,從命令行開始,使用'python'。從IDLE編輯器窗口運行,與使用'python -i -m文件從命令行運行代碼進行比較。存在一些故意的差異,一些是固定的,也許一些應該修正但尚未修復,有些是不可避免的。 – 2016-08-28 01:15:19

回答

3

__file__將不會設置。

所以:

>>> import os, sys 
>>> curdir = os.path.dirname(__file__) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name '__file__' is not defined 

的預期。

__file__是由python解釋器調用的文件的名稱 - 所以如果你從腳本運行它,它會起作用。

$ python curdir.py 
$ 

(劇本是完全一樣的東西我投入瞭解釋器,因此沒有錯誤或輸出)

從我以前使用IDLE觀察到的東西,它作爲一個解釋器 - 因此它將運行有問題的文件。但是,該文件不是開始,所以__file__從未設置。

+0

感謝您的信息。根據我們的觀察結果,你所說的確實有意義。但是,您是否知道__file__的文檔位於何處?還有關於如何用__file__表示法調試文件的任何想法?因爲它們對我正在研究的項目非常重要。再次感謝! – 2011-04-04 14:25:08

+0

迴應評論:「然而,它並沒有開始與該文件,所以__file__從未設置。」實際上,我右鍵單擊該文件並使用「Edit with IDLE」菜單選項,然後從IDLE運行該文件以產生錯誤。我假設你的意思是IDLE加載文件的內容來運行,但不運行文件本身? – 2011-04-04 14:26:21

+0

'__file__'由處理文件加載的[runpy](http://docs.python.org/library/runpy.html)設置。IDLE的行爲是不同的,它本質上在腳本上執行一個'exec',它不會設置'__file__' - 這是IDLE中還沒有修復的一個錯誤:[Run Module does not set __file __](http:/ /bugs.python.org/issue8515) – TyrantWave 2011-04-04 14:51:14