我是一名实验性物理学家,是Python的狂热爱好者.
我发现它非常适合数据分析和脚本编写,我也可以用它来连接实验室仪器(网络分析仪,示波器,信号分析仪和信号发生器......).我认为如果存在一个包含仪器驱动程序的漂亮库,Python将成为我所在领域中非常重要的MATLAB竞争者.
到目前为止,我一直在使用几种策略直接从我的IPython会话中连接它们:
使用pyVisa库很好,适用于大多数设备,但有点低级,需要额外的编程层来向用户公开有用的功能.
我最近能够使用pythondotnet(不是IronPython,缺少NumPy/Matplotlib ...库)使用IVI-COM或.NET驱动程序.这个解决方案显然是最令人满意的解决方案,因为IVI驱动程序已经处于相当高的水平,并且它们通常由供应商提供,来自不同供应商的仪器可以互换.
我的第一个问题是一个相当技术性的问题:我随处可读COM对象集成在.NET框架中,并且可以在.NET中直接使用COM对象.就我而言,我能够通过导入comtypes模块(请参阅使用COM对象http://code.activestate.com/recipes/578089-using-iviscope-instrument-driver-with-python/),并dotnet与clr来自pythondotnet ,但我根本不明白如何使用该clr模块访问这些COM对象.有人可以解释COM和.NET之间的联系吗?
另外,我总是有点困惑,我怎么知道,当我有一个DLL文件,如果它包含一个.NET模块,如果我可以用4.0版本的.NET打开它(我是一个完整的这些框架问题的初学者和正确文档的链接会非常好吗?
第二个问题是,更一般地说,没有一个模块可以统一收集不同仪器的大量驱动程序吗?在我看来,我们必须成千上万的人在处理同样的问题.
我最近落在模块lantz http://lantz.glugcen.dc.uba.ar/.不幸的是,这是在Python 3.0中,而我仍在使用Python 2.7(用于Windows的pythonxy发行版).此外,我有点害怕这个项目不是试图实施IVI建议,这将是一个很好的起点.
任何对相关信息来源的评论或链接都将受到欢迎.
我一直在讨论是否应该有一个专门存放MetaData在熊猫中的地方DataFrame,我个人觉得这个功能非常有用.
在未来的版本中实现之前,我一直在寻找2个解决方法,但它们中没有一个看起来真的令人满意.
由于我不能继承一个类DataFrame,我试图创建一个MyDataFrame包含a DataFrame并实现所有方法的类__add__,__mul__但是,考虑到可用于操作DataFrame的方法数量,这似乎是一种乏味的方法.
此外,我操作的数据源自物理硬件(频谱分析仪,示波器......),原则上,我希望有一组与数据帧的每一列相关联的元数据(测量带宽,平均数......).需要编码以保持与DataFrame结构一一对应的结构看起来很复杂(如果DataFrame得到转置怎么办?)
我发现一个优雅的解决方案是使用自定义对象而不是通常的Series对象名称.这些"MetaIndex"基本上是一个字符串+元数据,它将取代通常的列标签my_dataframe.columns.类定义看起来像这样:
class MetaIndex:
def __hash__(self):
return self.str.__hash__()
def __eq__(self,other):
return self.str == str(other)
def __init__(self,st):
self.str = format_name(st)
self._meta = MetaData()
def __repr__(self):
return self.str
def __str__(self):
return self.str
Run Code Online (Sandbox Code Playgroud)
然后,当我保存DataFrame(在hdf5文件中)时,我将其更改MetaIndex为常规字符串,并分别保存每个列的元数据,当我加载数据时,我重新实例化数据帧的列,例如:
s.replace_names_by_meta_index()
for c in s.columns:
col = s[c]
if col.meta is not None:
col.meta.set(**f["meta"][str(c)])
Run Code Online (Sandbox Code Playgroud)
1)您是否认为这是一种可行的方法,或者这是一种边际和危险的方法?
2)此外,一个非常诱人的扩展是使MetaIndex继承自str.这样,自动完成仍然适用于IPython(my_dataframe.col1).然而,在这种情况下,一些简单的操作,如my_dataframe.T.T使 …
我有一个显示一些小部件和按钮的 PyQt 程序。
我希望程序作为独立的 python 实例运行,或者在 ipython 环境中运行。在这种情况下,我在 Jupyter 控制台中使用以下魔术命令(以前我必须在启动 ipython qtconsole 时使用 --gui=qt)
%pylab qt
Run Code Online (Sandbox Code Playgroud)
为了有一个双向工作的程序,我的主模块有以下几行:
APP = QtGui.Qapplication.instance() # retrieves the ipython qt application if any
if APP is None:
APP = QtGui.QApplication(["foo"]) # create one if standalone execution
if __name__=='__main__':
APP.exec_() # Launch the event loop here in standalone mode
Run Code Online (Sandbox Code Playgroud)
这是我的问题:事件循环生成的异常很难被用户检测到,因为它们会在后台控制台中弹出。我想捕获事件循环中发生的任何异常,并显示警告(例如在 QMainWindow 状态栏中,让用户知道发生了异常)。
我尝试了几种策略,但 PyQt 和 Ipython 的内部机制之间似乎存在阴谋,使这成为不可能: