Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在本地主机上使用CGI Python中的bat文件_Python_Apache_Batch File_Cgi - Fatal编程技术网

在本地主机上使用CGI Python中的bat文件

在本地主机上使用CGI Python中的bat文件,python,apache,batch-file,cgi,Python,Apache,Batch File,Cgi,我被文件和语言的复杂混合所困扰!问题是: 我的webform在localhost(apache)上启动一个python脚本,作为cgi脚本。在这个python脚本中,我想执行一个批处理文件。这个批处理文件执行几个命令,我对此进行了彻底的测试 如果我在python解释器或CMD中执行以下python文件,它将执行bat文件。 但是当我从webform“启动”python脚本时,它说它成功了,但没有结果,所以我猜问题的cgi部分出了问题 这个过程是复杂的,所以如果有人有更好的方法做这件事…请回答;)

我被文件和语言的复杂混合所困扰!问题是: 我的webform在localhost(apache)上启动一个python脚本,作为cgi脚本。在这个python脚本中,我想执行一个批处理文件。这个批处理文件执行几个命令,我对此进行了彻底的测试

如果我在python解释器或CMD中执行以下python文件,它将执行bat文件。 但是当我从webform“启动”python脚本时,它说它成功了,但没有结果,所以我猜问题的cgi部分出了问题

这个过程是复杂的,所以如果有人有更好的方法做这件事…请回答;)。我用的是windows,所以有时候会让事情变得更烦人

我认为这不是脚本,因为我已经尝试了
subprocess.call
os.startfile
os.system
! 它要么什么都不做,要么网页一直在加载(无休止的循环)

Python脚本:

import os
from subprocess import Popen, PIPE
import subprocess

print "Content-type:text/html\r\n\r\n"
p = subprocess.Popen(["test.bat"], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
out, error = p.communicate()
print out
print "DONE!"
bat文件:

@echo off
::Preprocess the datasets
CMD /C java weka.filters.unsupervised.attribute.StringToWordVector -b -i data_new.arff -o data_new_std.arff -r tweetin.arff -s tweetin_std.arff
:: Make predictions with incoming tweets
CMD /C java weka.classifiers.functions.SMO -T tweetin_std.arff -t data_new_std.arff -p 2 -c first > result.txt

谢谢你的回复

我想到了几件事。您可能希望尝试将Popen的shell设置为True。有时我注意到这解决了我的问题

p = subprocess.Popen(["test.bat"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True)

您可能还想看一看,它非常适合这种自动化。

您的bat文件将第二个程序的输出重定向到一个文件,因此
p.communicate
只能获得第一个程序的输出。我假设您想返回
result.txt
的内容

我认为您应该跳过bat文件,用python执行这两个java调用。您可以更好地控制执行,并且可以检查返回代码,当作为CGI运行时,
java
不在
PATH
环境变量中可能会出现问题。下面的内容与您获取程序的输出基本相同,如果您的Web服务应该返回预测,那么您希望捕获第二个程序的输出

import os
import shlex
from subprocess import Popen, PIPE
import subprocess

print "Content-type:text/html\r\n\r\n"
p = subprocess.Popen(shlex.split("java weka.filters.unsupervised.attribute.StringToWordVector -b -i data_new.arff -o data_new_std.arff -r tweetin.arff -s tweetin_std.arff"), 
    stdout = subprocess.PIPE, stderr = subprocess.PIPE)
out, error = p.communicate()
return_code = subprocess.call(shlex.split("java weka.classifiers.functions.SMO -T tweetin_std.arff -t data_new_std.arff -p 2 -c first > result.txt"))
print out
print "DONE!"

bat文件中有更多命令。这些命令是顺序的,它们需要来自每个命令的文件。最后,我创建了一个包含所有结果的html页面。Java不在PATH中不是真的,因为它是真的,当我在CMD中运行bat文件时,它会正常执行。你能解释一下返回码=。。。ect?shlex只是将命令行“智能地”拆分为一个Popen数组。您可以使用
子进程从python中顺序调用命令。调用
通信
。您仍将有更多关于错误条件的反馈。另外,您的
cmd
和apache的CGI处理程序?subprocess.call中使用的
PATH
是否相同?成功时返回0,错误时返回其他值,请参阅“确定”!像我的代码一样的代码是在Python解释器中运行的,但如果我要求从我的webform(在localhost(apache)上)以CGI脚本的形式运行它,则不是这样,因为CGI无法运行bat文件??我已经尝试了“shell=True”,但当我从webform执行CGI脚本时,它不会显示shell窗口,它不会直接显示shell输出,只是在类似shell的环境中运行。