2

我正在将我们在 MS Word for Windows 中工作的宏移植到 OSX。该宏允许用户在 Word 中使用 LaTeX 生成方程式,并且必须向服务器发出 POST 请求并返回结果。这在带有该对象的 Windows 中可以正常工作Microsoft.XMLHTTP,但在 OSX 中似乎没有等效项。

为了解决这个问题,我创建了一个使用urlliburllib2处理请求的 Python 脚本,并允许我使用argparse. 该脚本执行我需要的操作,并将 Web 查询的结果作为字符串返回。

我在 VBA 中需要这个字符串。

我当前的 VBA 调用类似于以下内容,其中pyPathgetURLpath是静态的,由用户输入生成,并且Latex_Str是运行我们的服务器端脚本的服务器的地址。Font_SizeWebAdd

sCmd = """" & pyPath & "python"" """ & getURLpath & "getURL.py"" --formula """ & _
       Latex_Str & """ --fontsize " & Font_Size & " """ & WebAdd & """"
sResult = Shell(sCmd, vbNormalFocus)

问题是该Shell命令仅返回您正在调用的进程的双值 PID。我需要从我的 Python 脚本返回的实际字符串。我可以修改 Python 脚本以根据需要返回此脚本,但是如何将其输入 VBA?

有谁知道我怎样才能把这个结果放到我的 VBA 环境中?

4

1 回答 1

2

从问题中提取的答案:

我让它工作了!
我能够使用result = MacScript(command)我定义command如下的函数调用我的 Python 脚本:

command = "do shell script """ & pyPath & "python " & getURLpath & "getURL.py --formula '" _
          & Latex_Str & "' --fontsize " & Font_Size & " " & WebAdd & """"

我的 Python 脚本被调用getURL.py,并根据可选参数处理对服务器的请求,--formula并由--fontsize用户定义Latex_StrFont_Size分别存储在 VBA 中,以及服务器的网址WebAdd。我还在我的 Python 脚本中添加了一些功能来处理传递代理设置。上面传过来的命令MacScript返回的是Python脚本的stdout,也就是服务器的返回。Python脚本如下:

# Import the required libraries
from urllib import urlencode
from urllib2 import Request, urlopen, URLError, ProxyHandler, build_opener, install_opener
import argparse

# Set up our argument parser
parser = argparse.ArgumentParser(description='Sends LaTeX string to web server and returns meta data used by LaTeX in Word project')
parser.add_argument('webAddr', type=str, help='Web address of LaTeX in Word server')
parser.add_argument('--formula', metavar='FRML', type=str, help='A LaTeX formula string')
parser.add_argument('--fontsize', metavar='SIZE', type=int, default=10, help='Integer representing font size (can be 10, 11, or 12. Default 10)')
parser.add_argument('--proxServ', metavar='SERV', type=str, help='Web address of proxy server, i.e. http://proxy.server.com:80')
parser.add_argument('--proxType', metavar='TYPE', type=str, default='http', help='Type of proxy server, i.e. http')

# Get the arguments from the parser
args = parser.parse_args()

# Define formula string if input
if args.formula:
    values = {'formula': str(args.fontsize) + '.' + args.formula}   # generate formula from args
else:
    values = {}

# Define proxy settings if proxy server is input.
if args.proxServ:       # set up the proxy server support
    proxySupport = ProxyHandler({args.proxType: args.proxServ})
    opener = build_opener(proxySupport)
    install_opener(opener)

# Set up the data object
data = urlencode(values)
data = data.encode('utf-8')

# Send request to the server and receive response, with error handling!
try:
    req = Request(args.webAddr, data)

    # Read the response and print to a file
    response = urlopen(req)
    print response.read()

except URLError, e:
    if hasattr(e, 'reason'):    # URL error case
        # a tuple containing error code and text error message
        print 'Error: Failed to reach a server.'
        print 'Reason: ', e.reason
    elif hasattr(e, 'code'):    # HTTP error case
        # HTTP error code, see section 10 of RFC 2616 for details
        print 'Error: The server could not fulfill the request.'
        print 'Error code: ', e.code
        # print e.read()

如果有人好奇,在我修复了几个额外的错误并对其进行测试后,项目页面上将提供完整的代码。(工作的)Windows 版本已经在那里。

于 2015-03-01T19:06:55.793 回答