0

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

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

这个过程很复杂,所以如果有人有更好的方法来做到这一点......请回复;)。我正在使用 Windows,所以有时这会让事情变得更加烦人。

我认为这不是脚本,因为我尝试过subprocess.callos.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

感谢您的回复!!

4

2 回答 2

0

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

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

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

于 2013-05-14T18:57:50.660 回答
0

你的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!"
于 2013-05-14T19:17:16.553 回答