我在运行IIS的Windows 2008 R2服务器上。 Python 3.4。 PHP 5.3.9。
我试图从PHP应用程序调用Python脚本,然后根据Python脚本打印的内容执行某些操作。
基本上,我在服务器上使用win32com.client
到EnsureDispatch
Microsoft Word,抓取一些自动生成的文档,单独的页面并将它们保存为PDF,然后使用PHP将它们上传到应用程序供用户查看。
Python完全按照预期工作,我只需要从PHP调用该Python脚本,然后使用它返回的内容以确保它在我尝试运行其余PHP代码上传之前正确运行。
这就是我所拥有的:
<?php
function makePDFs() {
exec('C:\Python34\python.exe .\proc\makePDFs.py 2>&1', $output);
return $output;
//for non-testing purposes, i'd probably just use $output = exec();
//$result is either 'nofile' or 'done'. Just one word. Nothing else is printed by the Python script
}
然后......
<?php
require_once 'proc.php';
$result = makePDFs();
当我foreach
通过$result
(带有一些echo '<br>';
)时,似乎Python脚本正在返回:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\win32com\client\dynamic.py", line 89, in _GetGoodDispatch
IDispatch = pythoncom.connect(IDispatch)
pywintypes.com_error: (-2147221021, 'Operation unavailable', None, None)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File ".\proc\makePDFs.py", line 10, in
word = win32.gencache.EnsureDispatch('Word.Application')
File "C:\Python34\lib\site-packages\win32com\client\gencache.py", line 529, in EnsureDispatch
disp = win32com.client.Dispatch(prog_id)
File "C:\Python34\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "C:\Python34\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Python34\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147024891, 'Access is denied.', None, None)
出了什么问题?看起来它可能与权限有关。我需要设置哪些权限,以及如何设置它们?
编辑:这是Python代码。
import os, json, shutil
import win32com.client as win32
from getFile import getFile
word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False
try:
doc = word.Documents.Open(getFile())
except:
print(json.dumps('nofile'))
quit()
#Do stuff with win32com, loop through pages, save PDFs, then...
word.Quit(False)
if os.path.exists(os.path.abspath('__pycache__/')):
shutil.rmtree("__pycache__/")
print(json.dumps('done'))
这是getFile.py:
import os, glob
from datetime import datetime
def getFile():
dir = '\\\\<redacted>\\d$\\<redacted>\\Save\\'
t = datetime.now()
file = t.strftime("<redacted>_%Y%m%d*.doc")
for files in glob.glob(dir+'/'+file):
newest = max(glob.iglob(files), key=os.path.getctime)
return newest
同样,这个Python代码完美无缺。 getFile()完全返回它应该的内容,主脚本完美地保存了所有内容。只是当PHP调用它时。