Python 尝试:除了:不工作

Python 尝试:除了:不工作,python,exception,exception-handling,Python,Exception,Exception Handling,因此,我遇到了一个问题,即try:except:机制在python中似乎无法正常工作 这是我的两个文件的内容 pytest1.py pytest2.py 执行第一个文件将产生以下输出: $ python pytest1.py Why caught here? 基本上,没有发现异常。如果我打印出异常类型,它将打印为,而不仅仅是。我想这是一个奇怪的循环引用,但它似乎仍然应该起作用。。。。猜测一下,您有一个名称空间问题,它产生了一个不同的异常 试着替换 except: print 'Why

因此,我遇到了一个问题,即try:except:机制在python中似乎无法正常工作

这是我的两个文件的内容

pytest1.py pytest2.py 执行第一个文件将产生以下输出:

$ python pytest1.py
Why caught here?

基本上,没有发现异常。如果我打印出异常类型,它将打印为
,而不仅仅是
。我想这是一个奇怪的循环引用,但它似乎仍然应该起作用。

。。。猜测一下,您有一个名称空间问题,它产生了一个不同的异常

试着替换

except:
    print 'Why caught here?'


这可能会告诉您更多有关出错原因的信息。

主python程序始终作为模块
\uuuuu main\uuuu
导入

导入
pytest2
时,它不会重用现有模块,因为最初导入的模块的名称为
\uuuu main\uuuu
而不是
pytest2
。结果是多次运行
pytest1
,生成多个异常类
\uuuu main\uuuu.MyError
pytest1.MyError
您最终抛出一个并试图捕获另一个


因此,不要尝试从其他模块导入主模块。

此问题是由于导入作为模块运行的脚本造成的。这将生成模块的两个单独副本

另一个例子:

模块.py

import module

class Foo: pass

def test():
    print Foo
    print module.Foo
    print Foo is module.Foo

if __name__ == '__main__': test()
import module
if __name__ == '__main__': module.test()
main_script.py

import module

class Foo: pass

def test():
    print Foo
    print module.Foo
    print Foo is module.Foo

if __name__ == '__main__': test()
import module
if __name__ == '__main__': module.test()
结果

>python main_script.py
module.Foo
module.Foo
True

>python module.py
__main__.Foo
module.Foo
False

运行
python somefile.py
会创建一个名为
\uuuu main\uuu
的模块,而不是
somefile
,并在该模块中运行
somefile.py
中的代码。这就是为什么使用
检查此文件是作为脚本运行还是从其他文件导入。

已确认。将
pytest2
更改为
import\uuuuu main\uuuuu
并调用
\uuuu main\uuuu.func1
使程序按预期运行。(由于某种原因,<>代码>从AuxMaNyl导入Frime1/代码>声称没有<代码> FUNX导入。)您的第二表单不能工作,因为在这种情况下PyTest2正处于导入的中间。它还没有定义func1。使这些模块只包含库代码,并具有一个中心主入口点,该入口点可以从模块中导入所有必要的部分,而不指定任何内容。此外,我还确认了,我只是创建了另一个文件来定义函数和错误,Winston的解决方案解释了这个问题,您可以通过将pytest1 import*
中的
行添加到pytest1.py中主代码块的开头(
如果uuuu name\uuuu=='uuuu main\uuuu':
)来让代码正常工作,这将把命名空间中的
MyError
更改为
>python main_script.py
module.Foo
module.Foo
True

>python module.py
__main__.Foo
module.Foo
False