我有几个具有冗余功能的IPython脚本。我想将常见功能重构为一个模块,并将这些模块包含在现有脚本中。问题是它不能作为python模块,因为代码使用Ipython的语言扩展(!,$ etc)。是否可以创建一个具有IPython代码的模块并将其包含在另一个IPython脚本中?IPython模块
回答
您不应该在文件中保存IPython扩展内容(?
,!
,%run
)。永远。这些是交互式工具,它们是您用手键入的内容,但从不保存到文件中。
查找文件之间的共同特征。你有四种东西可以选择。
进口(
import
)函数定义(
def
)类定义(
class
)全局变量分配
您必须从此代码中删除所有IPython交互功能。所有的。
重写您的脚本,以便他们(1)导入常见的东西,(2)做他们应该做的有用的工作。
您必须从此代码中移除所有IPython交互功能。所有的。
现在你可以运行你的脚本,并且他们的工作就像正确的Python脚本。
你仍然可以使用IPython的扩展功能,如!
,?
和%run
在打字的时候,但不应将这些保存到文件中。
你看过IPython模块(pydoc IPython
)吗?也许你可以通过纯Python代码访问IPython的实用程序。
从技术上讲,如果用.ipy
扩展名保存脚本,ipython会看到并使用它的所有内容,而不是直接传递给python解释器。不过,我通常会建议不要这样,并且走上面的S.Lott的路线。
如果您将命令输入到IPython的交互版本中,然后使用hist命令(使用-n删除行号),IPython会将所运行的所有命令吐出,同时使用实际的python代码!cd!ls等等。下面是一个例子。
_ip.system("ls")
_ip.system("ls -F ")
_ip.magic("cd ")
http://ipython.scipy.org/moin/IpythonExtensionApi解释了这个对象。这基本上是你需要做的(改编自链接)什么:
import IPython.ipapi
_ip = IPython.ipapi.get()
现在你从IPython的外壳的HIST命令粘贴应该正常工作的代码。
很多人坚信你不应该在其中拥有IPython语法的脚本,但是如果你足够好奇(和我一样)并且正在寻找一些有趣的方法来混合python和shell脚本,那么你应该结帐我的wrapper program on github
示例使用情形:
$ cat > example.ipy
rehashx
a = !ls -l | tail -n 3
print a.fields(0)
b = 'foo'
echo bar ${b}
$ ipyscript.py example.ipy
['-rw-r--r--', 'drwxr-xr-x', 'drwxrwxr-x']
bar foo
事实证明,IPython的核心也支持上述脚本的一个(几乎没有功能的)版本:
In [2]: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy?
Type: instancemethod
Base Class: <type 'instancemethod'>
String Form:<unbound method InteractiveShell.safe_execfile_ipy>
Namespace: Interactive
File: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py
Definition: IPython.core.interactiveshell.InteractiveShell.safe_execfile_ipy(self, fname)
Docstring:
Like safe_execfile, but for .ipy files with IPython syntax.
Parameters
----------
fname : str
The name of the file to execute. The filename must have a
.ipy extension.
你可以这样做。
这里是一个例子。
这是a.ipy文件的内容:
%run b.ipy
print(myvar)
print(myfunc())
这是b.ipy文件的内容:
myvar = !echo 1
def myfunc():
tmp_var = !echo 2
return tmp_var
正如你可以看到b.ipy用途!运营商。 当您执行a.ipy你得到以下结果:
ipython a.ipy
['1']
['2']
所以,你的“进口”,“模块”不喜欢你这样做在python,但像你source
做壳。
但我不确定是否正确的方式,可能是这样。至少它可以工作,并允许您提取常用功能并从其他脚本文件重用。
- 1. ImportError:没有名为shutil_get_terminal_size的模块IPython
- 2. 如何在IPython中安装'sphinxext模块'
- 3. ipython无法加载python模块
- 4. ModuleNotFoundError:没有名为'Ipython'的模块
- 5. IPython中的模块自动重装
- 6. Python模块仅在iPython中可见
- 7. Emacs 24的python.el + ipython无法完成模块名称
- 8. 如何以简短的方式调用ipython模块?
- 9. Python无法从命令行运行模块; IPython的可
- 10. 的用Cython模块不是IPython的扩展
- 11. 如何让iPython使用更新的蛋/模块
- 12. iPython ImportError:没有名为显示的模块
- 13. 后“没有名为SQLAlchemy的模块”刚刚从IPython的提示
- 14. ipython识别python模块,但jupyter笔记本没有
- 15. 互换代码模块,如果IPython的存在
- 16. 模块成功安装,但未在IPython中找到
- 17. 导入错误:没有模块名为IPython的
- 18. 如何将模块添加到ipython自动完成?
- 19. 我可以打包IPython Notebook,依赖项和其他模块吗?
- 20. ipython与python -m IPython
- 21. Yii2模块模块
- 22. 如何将IPython shell嵌入到使用curses模块的Python程序中?
- 23. 如何让ipython意识到对自写模块所做的更改?
- 24. 将所有内容从ipython中的模块导入当前命名空间
- 25. 似乎缺少ipython模块尝试使用jupyter笔记本与anaconda
- 26. 如何从iPython中的命名空间隐藏导入的模块?
- 27. 默认配置IPython为交互模式
- 28. IPython在非缓冲模式下
- 29. 在非交互模式下运行ipython
- 30. 在Emacs中使用IPython模式24.3
林不知道我会怎么做。我的IPython脚本只是替换调用其他命令的bash脚本。如果我要删除IPython扩展功能!等等,我无法实现我打算做的事情。 – sharjeel 2009-06-23 11:34:49
@sharjeel:仔细看看子进程模块。您可以替换“!”有适当的subprocess.Popen()函数调用。这将允许您创建没有扩展名的模块。 – 2009-06-23 11:40:33
IPython语法根本不是用于交互式使用。为什么你会有.ipy扩展名?如果你喜欢,你可以在脚本中使用IPython语法。 – 2012-07-06 23:07:20