Python脚本可以单独工作,但是从PHP调用时会失败

时间:2014-08-15 14:20:03

标签: php python python-3.4

我在运行IIS的Windows 2008 R2服务器上。 Python 3.4。 PHP 5.3.9。

我试图从PHP应用程序调用Python脚本,然后根据Python脚本打印的内容执行某些操作。

基本上,我在服务器上使用win32com.clientEnsureDispatch 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调用它时。

0 个答案:

没有答案