繁体   English   中英

xlwings:如何检测是否从VBA模块调用了python函数?

[英]xlwings: how to detect whether a python function is being called from VBA module?

情况

xlwings包提供了一种从excel VBA模块调用python函数的便捷方法。 xlwings文档提供了以下基本示例:

将以下代码写入VBA模块。

 Sub HelloWorld() RunPython ("import hello; hello.world()") End Sub 

这将在hello.py调用以下代码:

 # hello.py import numpy as np import xlwings as xw def world(): wb = xw.Book.caller() wb.sheets[0].range('A1').value = 'Hello World!' 

尝试直接运行python函数world() (而不是从excel VBA调用它)会产生以下错误消息:

例外:不能直接调用Book.caller()。 通过Excel调用或首先使用Book.set_mock_caller()设置模拟调用者。

我想修改world()函数,使其在直接运行时引发自定义异常。 为了实现这一点,我首先需要以编程方式确定world()函数是直接运行还是从excel VBA中调用(至少我是这样认为的)。 我该怎么办?

您可以捕获异常,然后引发自己的异常:

def world():
    try:
        wb = xw.Book.caller()
    except Exception:
        raise CustomException(custom_message)
    wb.sheets[0].range('A1').value = 'Hello World!'

您担心Exception太笼统,这是正确的。 但这是xlwings的错,而不是您的错。 如果它引发了一个通用的Exception ,那么剩下的就是您所要捕捉的。 您可以检查异常消息,以确保您没有捕获到错误的异常,但这会很脆弱。 错误消息通常是未记录的,因此不应视为公开的稳定API。

或者,您可以解决问题所在的问题xlwings的源代码 ,并使其按照我的意愿做正确的事情:引发更具体的异常。

class NotFromExcelError(Exception):
    pass

caller结尾:

raise NotFromExcelError('Book.caller() must not be called directly. Call through Excel '
                        'or set a mock caller first with Book.set_mock_caller().')

我希望这样的请求将被接受,因为引发像现在这样的裸Exception看起来确实是错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM