2017-07-02 31 views
3

是否有一个地方做任何情况下:是否__main__保证始终可导入?

import __main__ 

可能导致ImportError?我试过的所有案例似乎表明,这总是有效的。关于__main__的文档似乎没有提到有关此事的任何内容。为了给出一些上下文:我试图使用usersitecustomize钩子在__main__.__dict__中注入一些名字,以便(主要)在REPL启动时使它们可用。

诚然,没有发生的__import__重新定义(作为注释说明),这主要归结为,如果我需要将其包装在一个try-except与否。

+2

当然,例如,如果你[更换'__import__'(http://ideone.com/gFuzwp),但我怀疑这就是你之类的话寻找。你对什么样的失败类型感兴趣? – user2357112

+0

尝试在A.py中打印'__main__',然后在B.py中导入A. –

+4

你们在说什么? '__main__'并不总是当前模块;它是主脚本执行的名称空间,或交互式代码以交互模式执行的名称空间。 – user2357112

回答

2

它可能是。蟒蛇在这个文件来初始化__main__https://github.com/python/cpython/blob/master/Python/pylifecycle.c#L1327

但是请注意,像runpyIPython模块更换__main__模块用自己的动态创建者,以防止碰撞与自己的启动脚本,并在runpy的情况下,提供预期的行为。

runpy本身是Python标准库的一部分,它提供了-m标志的实现,允许任意模块作为脚本执行。

另一种方法是IPython,它提供了在启动新REPL时执行代码的功能。

欲了解更多详情,请看这里:http://ipython.readthedocs.io/en/stable/config/intro.html?highlight=exec_lines