我完全沉浸在复杂的文件和语言混合中!问题: 我的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
感谢您的回复!!
答案 0 :(得分:0)
有些事情会浮现在脑海中。你可能想尝试设置你的Popen的shell = True。有时我注意到这解决了我的问题。
p = subprocess.Popen(["test.bat"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True)
您可能还想看看Fabric,这对于这种自动化非常适合。
答案 1 :(得分:0)
您的bat文件正在将第二个程序的输出重定向到一个文件,因此p.communicate
只能获取第一个程序的输出。我假设您要返回result.txt
的内容?
我认为你应该跳过bat文件并在python中进行两次java调用。您可以更好地控制执行,并且可以检查返回代码,java
在作为CGI运行时不在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!"