2012-08-10 165 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

相關問題