当从PHP启动时,Python脚本不会启动另一个Python脚本

当从PHP启动时,Python脚本不会启动另一个Python脚本,php,python,python-2.7,Php,Python,Python 2.7,我已经编写了下面的测试php代码,它将运行python脚本,请注意,这里列出了3种方法(所有方法都有效)。最后一个方法将运行python脚本,但不会导致PHP页面等待它完成 <?PHP $SKU= 'asdfghyt42'; $showID = '60'; //method 1 $command='C:\Python27\python.exe python\pythontesting.py $SKU $showID'; $buffer=''; ob_start

我已经编写了下面的测试php代码,它将运行python脚本,请注意,这里列出了3种方法(所有方法都有效)。最后一个方法将运行python脚本,但不会导致PHP页面等待它完成

 <?PHP
  $SKU= 'asdfghyt42';
  $showID = '60';


  //method 1
  $command='C:\Python27\python.exe python\pythontesting.py $SKU $showID';
  $buffer='';
  ob_start(); // prevent outputting till you are done
   passthru($command);
  //get the result out
 $sketchfabKey=ob_get_contents();
  //clean up the buffer
 ob_end_clean();
 echo $sketchfabKey; 


 /*
 /method 2
 $command = escapeshellcmd('C:\Python27\pythonw.exe python\pythontesting.py $SKU $showID');
$output = shell_exec($command);
echo $output;


 // method 3
$command="C:\Python27\pythonw.exe python\pythontesting.py $sketchfabKey $SKU"; 
$out = 0;
ob_end_clean();
ignore_user_abort();
ob_start();
header("Connection: close");
echo json_encode($out);
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();
  exec($command);
  */

 ?>
一旦用户单击消息框上的ok按钮,它应该运行下一个python脚本,该脚本与声明为脚本2的消息框执行相同的操作

import win32api
import sys
import subprocess

win32api.MessageBox(0, '2:', 'yay', 0x00001000)
p = subprocess.call([sys.executable, 'pythontesting3.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print "I am alive"
这就是问题所在。如果我从pythonshell运行第一个python脚本,它将完全按照预期工作,并给我一个带有1的messagebox,然后给我一个带有2的messagebox

但是,当PHP页面执行第一个python脚本时,python将只执行第一个脚本中的代码,并给我一个带有1的messagebox。当我单击ok时,我没有得到第二个messagebox,因此得出结论,第二个python脚本从未启动

我认为这可能是windows的权限问题,将python.exe设置为以管理员身份运行,并确保所有权限都设置为完全控制。它没有改变任何事情。

以下是一些关于系统的信息,如果这有帮助的话:
Python 2.7

Web服务器通过Apache在本地运行,并使用XAMPP进行安装

避开您的后斜杠<例如,代码>C:\Python27应该是
C:\\Python27
。在执行某些任务时,不要使用相对路径
python\\pythontesting.py
可以在任何地方,你永远不知道PHP运行到哪个文件夹,更不用说PHP下的python了。。它将在
C:\Python27
或您的web目录中运行吗?最好对所有内容使用绝对路径。最后,请注意,
$SKU
不会得到解决,因为它在
'
中,而不是
中,我不是PHP专家,但
exec()
可能比
passthru()更好
最后想一想,
子流程.call
可能会挂起你的应用程序,因为它正在等待某个流程完成或其他事情,请尝试切换到几个小时前得到答案的流程。为什么你要通过
子流程启动
pythontesting3.py
呢。首先调用
呢?为什么不直接导入pythontesting3
?这是一个Python脚本,您可以“运行”“那些只是导入它的人……很可能,
sys.executable
没有指向
C:\\Python27\\python.exe
。至少交换掉
sys.executable
,以消除一个问题源,因为你在这里链接了很多东西,你可以从等式中提取的任何问题源都将极大地帮助你解决问题。您还使用了
打印“我还活着”
,这是一个漂亮的调试工具,添加更多这些工具,看看您的代码在哪里中断;)谢谢你的建议。我转义了所有内容,并将subprocess.call更改为C:\\Python27\\python.exe。但还是没有运气。调用第三个脚本的原因是,这组测试是编写的,因此它们的行为与我的主程序(有3层python脚本)相同。每个脚本都在等待设置一些数据库变量,这可能需要10-15分钟,因此需要运行脚本而不必等待它们完成。
import win32api
import sys
import subprocess

win32api.MessageBox(0, '2:', 'yay', 0x00001000)
p = subprocess.call([sys.executable, 'pythontesting3.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print "I am alive"