从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)
答
自动生成的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' –
SO是不是代码写入服务。您需要尝试自己动手,然后在出现短**代码问题时寻求帮助。 –
转换不应该看起来很丑陋。 –
除了其他代码错误外,'shell = True'会导致除第一个参数以外的所有参数被忽略(第一个参数作为脚本运行,其他参数传递给该脚本,但在这些情况中都不在脚本位置传递的字符串查看其他参数)。 –