从导入导入到python解释器主命名空间

时间:2013-09-14 01:20:11

标签: python python-2.7

如何使用一个命令/ import从解释器运行一堆导入和路径追加?如果我导入另一个为我运行命令的模块,则导入在主命名空间中不可用。与运行修改/添加命令和变量到当前会话的bash脚本类似。

离。

import os, ...
sys.path.append(...)

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你只是在寻找from … import …声明。例如:

lotsostuff.py:

import json
def foo(): pass

现在:

$ python3.3
>>> from lotsostuff import *
>>> json
<module 'json' from '/usr/local/lib/python3.3/json/__init__.py'>
>>> foo
<function lotsostuff.foo>

但是,您可能需要考虑其他替代方案。如果您只是想控制解释器会话的启动,则可以执行以下操作:

$ PYTHONSTARTUP=lotsostuff.py
$ python3.3
>>> json
<module 'json' from '/usr/local/lib/python3.3/json/__init__.py'>
>>> foo
<function __main__.foo>

注意最后一行的差异。您现在正在lotsostuff命名空间中运行__main__,而不是在单独的命名空间中运行并抓取其所有成员。


类似地:

$ python3.3 -i lotsostuff.py
>>> json
<module 'json' from '/usr/local/lib/python3.3/json/__init__.py'>

如果您希望每次在会话中执行此操作,通常会使用PYTHONSTARTUP -i如果您只想这样做一次。


如果你想在会话中间而不是在启动时做同样的事情......好吧,你不能直接做,但你可以与exec非常接近(Python 3.x) (或Python 2.x中的execfile)。


如果你真的想完全你所描述的 - 导入模块,作为正常导入,除了合并到你的命名空间而不是它自己的 - 你需要自定义导入过程。 importlib并不难。如果您不在Python 3.2或更高版本中,那么使用imp可以完成更多工作。


在我认为您正在寻找的. ./foo脚本中./foo而不仅仅是bash之间存在差异。

如果您使用的是ipython,则可以选择更酷的选项。 (如果您没有使用ipython,则可能需要查看它。)