2012-08-10 141 views
3

新手在这里。任何帮助将不胜感激。python os.system错误:“全局名称输出”未定义“

我正在写一个运行tcp pcap诊断工具的cgi脚本。如果我想在bash运行命令时,它看起来像:

/home/fsoft/cap/capnostic -r 38350 /home/fsoft/brad.pcap > 38350 

所以我试图做到这一点在Python:

output = os.system('/home/fsoft/cap/capnostic -r' + port + directory+filename '>' + jobdir+filename 

我有一种感觉,“>”是搞乱的东西了。 。但我似乎无法找到正确的语法。另外,一旦我正确地得到命令,我将能够打印输出变量?

print '%s' % (output) 

输出可为3个数据页面..

感谢您的帮助。

这里是我的全码:

#!/usr/bin/env python 

import cgi, os 
import cgitb; cgitb.enable() 
import subprocess 


form = cgi.FieldStorage() 
port = form.getvalue("port") 
filename = form.getvalue("filename") 
directory = form.getvalue("directory") 
jobdir = '/var/www/jobs/' + filename 


def createdir(): 
os.system('mkdir /var/www/jobs/' + filename) 
createdir() 

def capout(): 
output = os.system('/home/fsoft/cap/capnostic -r %s %s%s > %s%s' % (port, directory,  filename, jobdir, filename)) 
capout() 

def htmlout(): 
print 'Content-type: text/html\n' 
print '<html>' 
print '<head>' 
print '<title>Capnostic Output</title>' 
print '</head>' 
print '<body>' 
print '<BR><BR><BR><center>' 
print '<table border=0>' 
print '<TR>' 
print '<TD><center>port = %s<BR>filename = %s<BR>Directory = %s<BR>Job Directory = %s</TD>' % (port,filename,directory,jobdir) 
print '</TR>' 
print '</table>' 
print '<BR><BR><BR>' 
print '%s' % (output) 
print '</body>' 
print '</html>' 

htmlout() 

它现在告诉我:

<type 'exceptions.NameError'>: global name 'output' is not defined 
    args = ("global name 'output' is not defined",) 
    message = "global name 'output' is not defined" 
+2

'打印' %s'%(output)'可能是多余的。如果你能做到这一点,你应该能够做'打印输出'。 – murgatroid99 2012-08-10 18:55:45

+1

根据[官方文档](http://docs.python.org/library/os#os.system)'子进程模块为产生新进程和检索结果提供了更强大的功能;使用该模块优于使用os函数# – RanRag 2012-08-10 18:58:11

回答

2

你缺少一个+'>'

cmd = ('/home/fsoft/cap/capnostic -r' + port + directory + filename + '>' + 
     jobdir + filename) 

os.system(cmd) 

注意os.system不返回命令的输出,这里是你如何克服et:

import subprocess 

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) 
output, error = proc.communicate() 
print output 
3

你错过了一个+连接你的字符串和你的字符串之间的空格。您可以使用string formatting简化任务或者只是添加+和空间在需要的地方:

output = os.system('/home/fsoft/cap/capnostic -r %s %s%s > %s%s' % (port, 
        directory, filename, jobdir, filename)) 

注:%s的用于治疗每一个变量为一个字符串。

os.system使用替换为subprocess模块:

sts = os.system("mycmd" + " myarg") 
# becomes 
sts = call("mycmd" + " myarg", shell=True) 

捕获输出,你将要使用Popen,这将被翻译如下:

def capout(): 
    cmd = '/home/fsoft/cap/capnostic -r %s %s%s > %s%s' % (port, 
         directory, filename, jobdir, filename) 
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    output, error = process.communicate() 
    return output 

output = capout() 
+0

请注意,将不会得到命令的输出,它只会给出返回码,并且用户确实指定他希望将数据页作为输出。 – jamylak 2012-08-10 19:18:42

+0

感谢您的帮助。我得到了一点进一步..现在它告诉我: :未定义全局名称'输出' args =(“全局名称'输出'未定义”,) message =“全局名称'输出'未定义” – 2012-08-10 19:22:20

+0

它的范围。当你试图在你的'htmlout()'函数中调用它时,'output'不存在。 – RobB 2012-08-10 19:27:28

相关问题