从bash转换为python的代码中的语法错误

问题描述:

我非常喜欢python。我有bash中的代码需要将其转换为python,厌倦了转换器,但获取语法错误。如果有人帮我找到错误,会非常有帮助!从bash转换为python的代码中的语法错误

错误:

File "cp_file.py", line 75 
    print(myfilename.val) 
    SyntaxError : Invalid Syntax 

会有很大的帮助,如果有人转化以下的bash代码到Python没有,或者帮助我找到错误!

bash代码:

grep " 200 " /var/log/ba/access.log |awk '{print $7}'|sort|uniq > /tmp/read_log.txt 

for i in $(cat /tmp/read_log.txt); do 
     echo $i 
     myfilename="$(echo ${i##*/})" 
     echo $myfilename 
     wget http://mydata.na.xyz/$i 
     curl -X POST -d @$myfilename http://xyz.xyz/ba/$i 
done 

Python代码:

#! /usr/bin/env python 
from __future__ import print_function 
import sys,os,subprocess 
class Bash2Py(object): 
    __slots__ = ["val"] 
    def __init__(self, value=''): 
    self.val = value 
    def setValue(self, value=None): 
    self.val = value 
    return value 

def GetVariable(name, local=locals()): 
    if name in local: 
    return local[name] 
    if name in globals(): 
    return globals()[name] 
    return None 

def Make(name, local=locals()): 
    ret = GetVariable(name, local) 
    if ret is None: 
    ret = Bash2Py(0) 
    globals()[name] = ret 
    return ret 

def Str(value): 
    if isinstance(value, list): 
    return " ".join(value) 
    if isinstance(value, basestring): 
    return value 
    return str(value) 

def Array(value): 
    if isinstance(value, list): 
    return value 
    if isinstance(value, basestring): 
    return value.strip().split(' ') 
    return [ value ] 

_rc0 = _rcr1, _rcw1 = os.pipe() 
if os.fork(): 
    os.close(_rcw1) 
    os.dup2(_rcr1, 0) 
    _rcr2, _rcw2 = os.pipe() 
    if os.fork(): 
     os.close(_rcw2) 
     os.dup2(_rcr2, 0) 
     _rcr3, _rcw3 = os.pipe() 
     if os.fork(): 
      os.close(_rcw3) 
      os.dup2(_rcr3, 0) 
      subprocess.call("uniq",shell=True,stdout=file("/tmp/read_log.txt",'wb')) 

     else: 
      os.close(_rcr3) 
      os.dup2(_rcw3, 1) 
      subprocess.call(["sort"],shell=True) 
      sys.exit(0) 

    else: 
     os.close(_rcr2) 
     os.dup2(_rcw2, 1) 
     subprocess.call(["awk","{print $7}"],shell=True) 
     sys.exit(0) 

else: 
    os.close(_rcr1) 
    os.dup2(_rcw1, 1) 
    subprocess.call(["grep","200","/var/log/ba/access.log"],shell=True) 
    sys.exit(0) 

for Make("i").val in Array(os.popen("cat /tmp/read_log.txt").read().rstrip("\n")): 
    print(i.val) 
    Make("myfilename").setValue(os.popen("echo "+str(i.val##*/)).read().rstrip("\n")) 
    print(myfilename.val) 
    subprocess.call(["wget","http://xyz.xyz/"+str(i.val)],shell=True) 
    subprocess.call(["curl","-X","POST","-D","@"+str(myfilename.val),"http://xyz.xyz/ba/"+str(i.val)],shell=True) 
+2

SO是不是代码写入服务。您需要尝试自己动手,然后在出现短**代码问题时寻求帮助。 –

+0

转换不应该看起来很丑陋。 –

+0

除了其他代码错误外,'shell = True'会导致除第一个参数以外的所有参数被忽略(第一个参数作为脚本运行,其他参数传递给该脚本,但在这些情况中都不在脚本位置传递的字符串查看其他参数)。 –

自动生成的Python代码是可怕的。你坚持Bash会好得多。但最好的方式是使用人类的理解实际将您的代码迁移到Python。例如,拿眼前这个部分:

grep " 200 " /var/log/ba/access.log | awk '{print $7}'|sort|uniq > /tmp/read_log.txt 

在Python是这样的:

with open('/var/log/ba/access.log') as infile, open('/tmp/read_log.txt', 'w') as outfile: 
    results = set() 
    for line in infile: 
     if ' 200 ' in line: 
      tokens = line.split() 
      results.add(tokens[6]) # 7th token 
    for result in sorted(results): 
     print >>outfile, result 

对于HTTP部分,使用Python模块requests。它很容易使用。很有可能你不再需要outfile了 - 你可以直接使用for result in sorted(results)来发送你的HTTP请求。

首先不要用for来读取文件的行,而应该使用while。 See here why

这是一个非常小的脚本,在python中比使用你的转换器更容易重写。

如果是在赶时间,确实需要在Python中,你可以使用里面蟒蛇Linux命令脚本,是不是最好的方式,但更快速和容易的人谁不知道蟒蛇

import subprocess 
p = subprocess.Popen(["curl","POST","-X", "YOUR_URL"], 
stdout=subprocess.PIPE, shell=True) (output, err) = p.communicate() 
+0

但我想使用curl发布的文件名是从'/var/log/ba/access.log' –