2011-04-03 78 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