Возврат результата внешнего скрипта в VBA

Я работаю над переносом макроса, который у нас работает в MS Word для Windows, на OSX. Макрос позволяет пользователю генерировать уравнения, используя LaTeX в Word, и должен сделать POST-запрос к серверу и вернуть результат. Это прекрасно работает в Windows сMicrosoft.XMLHTTP объект, но в OSX нет эквивалента.

Чтобы обойти это, я создал скрипт Python, который используетurllib а такжеurllib2 для обработки запроса, и позволяет мне отправлять мою строку LaTeX и веб-адрес в качестве входных аргументов, используяargparse, Этот скрипт делает то, что мне нужно, и возвращает результат веб-запроса в виде строки.

Мне нужна эта строка в VBA.

Мой текущий вызов VBA выглядит примерно так:pyPath а такжеgetURLpath статичны,Latex_Str а такжеFont_Size генерируются пользовательским вводом иWebAdd это адрес сервера, на котором выполняется наш серверный скрипт.

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

Проблема в том, чтоShell Команда возвращает только двухзначный PID процесса, который вы вызываете. Мне нужна фактическая строка, возвращенная из моего скрипта Python. Я могу изменить скрипт Python так, чтобы он возвращался так, как я хочу, но как мне передать его в VBA?

Кто-нибудь знает, как я могу получить этот результат в моей среде VBA?

 Engineero13 июн. 2013 г., 06:06
Я работал над реализацией этого. Я все еще получаю ошибку, но я думаю, что это, вероятно, сделает работу в долгосрочной перспективе. Я скоро отправлю сюда с дополнительной информацией, если не смогу выяснить, что является причиной моей ошибки. Спасибо!

Ответы на вопрос(1)

Решение Вопроса

Я получил это работает!

Я смог вызвать мой скрипт на Python, используяresult = MacScript(command) функция, где я определил мойcommand в дальнейшем:

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

Мой скрипт на Python называетсяgetURL.pyи обрабатывает запрос к серверу на основе необязательных аргументов--formula а также--fontsize определяется пользователем и хранится в VBA какLatex_Str а такжеFont_Size соответственно и веб адрес сервераWebAdd, Я также добавил некоторые функции в мой скрипт Python для обработки параметров прокси-сервера. Вышеуказанная команда прошла черезMacScript возвращает стандартный вывод скрипта Python, который является возвращением с сервера. Сценарий 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 уже там.

Ваш ответ на вопрос