2013-06-11 63 views
2

我正在將我們在MS Word for Windows中使用的宏移植到OSX。該宏允許用戶在Word中使用LaTeX生成方程,並且必須向服務器發出POST請求並返回結果。這在Windows中與Microsoft.XMLHTTP對象一起工作正常,但在OSX中似乎並不等同。將外部腳本的結果返回給VBA

要解決這個問題,我已經創建了一個使用urlliburllib2來處理請求,並讓我送我的LaTeX的字符串和網絡地址使用​​輸入參數的Python腳本。該腳本完成我需要的操作,並將網絡查詢的結果作爲字符串返回。

我需要VBA中的這個字符串。

我現在的VBA調用是類似於以下,其中pyPathgetURLpath是靜態的,Latex_StrFont_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環境嗎?

+0

我一直在努力實現這一點。我仍然有一個錯誤,但我認爲這可能會長期完成這項工作。如果我無法弄清楚是什麼導致了我的錯誤,我會很快回復這裏,提供更多信息。謝謝! – Engineero

回答

2

從問題提取的答案:

我明白了!
我可以使用,我定義我的command爲以下的result = MacScript(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,以及服務器的網址爲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() 

如果有人好奇,完整的代碼將可在project page一次我做固定幾個額外的錯誤並對其進行測試。 (工作)Windows版本已經在那裏。